在 Elastic Beanstalk 中使用來自私人存儲庫的圖像 - AWS Elastic Beanstalk

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Elastic Beanstalk 中使用來自私人存儲庫的圖像

本主題說明如何使用 Elastic Beanstalk 向私人線上影像儲存庫進行驗證。Elastic Beanstalk 必須先透過線上登錄進行驗證,才能提取和部署您的映像檔。有多個配置選項。

使用來自 Amazon ECR 存儲庫的圖像

您可以將自定義 Docker 圖像存儲在 AWS 與 Amazon 彈性容器註冊表(AmazonECR)。

當您將 Docker 映像檔存放在 Amazon 時ECR,Elastic Beanstalk 會使用您環境的執行個體設定檔自動對 Amazon ECR 註冊表進行身份驗證。因此,您需要提供執行個體存取 Amazon ECR 儲存庫中映像檔的權限。若要這麼做,請將 Amazon EC2ContainerRegistryReadOnly 受管政策附加到執行個體設定檔,將許可新增到環境的執行個體設定檔。這會提供對帳戶中所有 Amazon ECR 儲存庫的唯讀存取權。您也可以選擇只存取單一存放庫,方法是使用下列範本建立自訂原則:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowEbAuth", "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken" ], "Resource": [ "*" ] }, { "Sid": "AllowPull", "Effect": "Allow", "Resource": [ "arn:aws:ecr:us-east-2:account-id:repository/repository-name" ], "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:GetRepositoryPolicy", "ecr:DescribeRepositories", "ecr:ListImages", "ecr:BatchGetImage" ] } ] }

將上述政策中的 Amazon 資源名稱 (ARN) 取代為儲存庫ARN的。

您需要在Dockerrun.aws.json檔案中指定影像資訊。根據您使用的平台,配置會有所不同。

對於ECS託管的 Docker 平台,請在容器定義對象中使用image密鑰:

"containerDefinitions": [ { "name": "my-image", "image": "account-id.dkr.ecr.us-east-2.amazonaws.com/repository-name:latest",

對於 D ocker 平台,請參閱圖像。URL在你URL的Dockerrun.aws.json文件的Image定義中:

"Image": { "Name": "account-id.dkr.ecr.us-east-2.amazonaws.com/repository-name:latest", "Update": "true" },

使用 AWS Systems Manager (SSM) 參數存放區

您可以先設定 Elastic Beanstalk 以登入私有儲存庫,然後開始部署程序。這可讓 Elastic Beanstalk 存取儲存庫的映像,並將這些映像部署至您的 Elastic Beanstalk 環境。

此組態會在 Elastic Beanstalk 部署程序的「預先建置」階段啟動事件。您可以在 .ebextentions 組態目錄中進行設定。組態使用平台勾點指命碼,該指令碼會呼叫 docker login,以針對託管私有儲存庫的線上登錄進行驗證。這些組態步驟的詳細明細如下。

配置 Elastic Beanstalk 以通過以下方式向您的私有存儲庫進行身份驗證 AWS SSM
注意

您需要設置 AWS Systems Manager 完成這些步驟。如需詳細資訊,請參閱 AWS Systems Manager 使用者指南

  1. 建立您的 .ebextensions 目錄結構,如下所示。

    ├── .ebextensions │ └── env.config ├── .platform │ ├── confighooks │ │ └── prebuild │ │ └── 01login.sh │ └── hooks │ └── prebuild │ └── 01login.sh ├── docker-compose.yml
  2. 使用 AWS Systems Manager參數存放區可儲存私人儲存庫的認證,以便 Elastic Beanstalk 可以在需要時擷取您的認證。對於此操作,請執行 put-parameter 命令。

    aws ssm put-parameter --name USER --type String --value "username" aws ssm put-parameter --name PASSWD --type String --value "passwd"
  3. 建立以下 env.config 檔案,並將其放置在 .ebextensions 目錄中,如前面的目錄結構所示。此組態會使用 aw: elasticbeanstalk: 應用程式:環境命名空間,將USER和 E PASSWD lastic Beanstalk 環境變數初始化為參數存放區中的值。SSM

    注意

    指令碼中的 USERPASSWD 必須符合上述 ssm put-parameter 命令中使用的相同字串。

    option_settings: aws:elasticbeanstalk:application:environment: USER: '{{resolve:ssm:USER:1}}' PASSWD: '{{resolve:ssm:PASSWD:1}}'
  4. 建立下列 01login.sh 指令碼檔案,並將其放置在以下目錄中 (也如同前面的目錄結構所示):

    • .platform/confighooks/prebuild

    • .platform/hooks/prebuild

    ### example 01login.sh #!/bin/bash USER=/opt/elasticbeanstalk/bin/get-config environment -k USER /opt/elasticbeanstalk/bin/get-config environment -k PASSWD | docker login -u $USER --password-stdin

    01login.sh 指令碼會呼叫 get-config 平台指令碼以擷取儲存庫憑證。其將使用者名稱儲存 USER 變數中。在下一行中,會檢索密碼。指令碼不會將密碼儲存在變數中,而是將密碼直接傳送至 stdin 輸入串流中的 docker login 命令。--password-stdin 選項使用輸入串流,因此您不必將密碼儲存在變數中。如需有關使用 Docker 命令列界面進行驗證的詳細資訊,請參閱 Docker 文件網站中的《Docker 登入》。

    備註
    • 所有指令碼檔案必須有執行許可。使用 chmod +x 在勾點檔案上設定執行權限。對於在 2022 年 4 月 29 日或之後發佈的所有以 Amazon Linux 2 為基礎的平台版本,Elastic Beanstalk 會自動授予執行許可給所有平台勾點指令碼。在此情況下,您不需要手動授予執行許可。如需這些平台版本的清單,請參閱中的 2022 年 4 月 29 日-Linux 平台發行說明。AWS Elastic Beanstalk 版本說明指南

    • 可執行檔也可以是二進位檔案,或開頭為 #! 行且包含其解譯器路徑 (例如 #!/bin/bash) 的指令碼檔案。

    • 如需詳細資訊,請參閱 Extending Elastic Beanstalk Linux 平台中的 平台勾點

Elastic Beanstalk 可以使用託管私有儲存庫的線上登錄進行驗證之後,即可部署和提取您的映像。

使用 Dockerrun.aws.json 檔案

本節說明另一種對私有儲存庫 Elastic Beanstalk 進行驗證的方法。使用這種方法,您可以使用 Docker 命令產生身分驗證檔案,然後將驗證檔案上傳到 Amazon S3 儲存貯體。您也必須在 Dockerrun.aws.json 檔案中包含儲存貯體資訊。

若要產生身分驗證檔案並提供給 Elastic Beanstalk
  1. 透過 docker login 命令產生身分驗證檔案。若是 Docker Hub 上的儲存庫,請執行 docker login

    $ docker login

    對於其他登錄,請包括登錄伺服器URL的:

    $ docker login registry-server-url
    注意

    如果您的 Elastic Beanstalk 環境使用 Amazon Linux AMI 碼頭平台版本(Amazon Linux 2 之前),請閱讀中的相關資訊。Amazon Linux 上的碼頭配置AMI(在 Amazon Linux 2 之前)

    如需身分驗證檔案的詳細資訊,請至 Docker 網站參閱 Store images on Docker Hubdocker login

  2. 將名為 .dockercfg 的身分驗證檔案副本上傳至安全的 Amazon S3 儲存貯體。

    • Amazon S3 存儲桶必須託管在同一個 AWS 區域 作為使用它的環境。Elastic Beanstalk 無法從其他區域託管的 Amazon S3 儲存貯體下載檔案。

    • s3:GetObject作業的權限授與執行個體設定檔中的IAM角色。如需詳細資訊,請參閱管理 Elastic Beanstalk 執行個體描述檔

  3. 將 Amazon S3 儲存貯體資訊納入 Authentication 檔案中的 Dockerrun.aws.json 參數。

    下列範例說明如何使用 mydockercfg 儲存貯體內名為 amzn-s3-demo-bucket 的身分驗證檔案,以使用第三方登錄檔內的私有映像。如需的正確版本號碼AWSEBDockerrunVersion,請參閱範例後面的注意事項。

    { "AWSEBDockerrunVersion": "version-no", "Authentication": { "Bucket": "amzn-s3-demo-bucket", "Key": "mydockercfg" }, "Image": { "Name": "quay.io/johndoe/private-image", "Update": "true" }, "Ports": [ { "ContainerPort": "1234" } ], "Volumes": [ { "HostDirectory": "/var/app/mydb", "ContainerDirectory": "/etc/mysql" } ], "Logging": "/var/log/nginx" }
    Dockerrun.aws.json 版本

    AWSEBDockerrunVersion 參數表示 Dockerrun.aws.json 檔案的版本。

    • 碼頭工人AL2和 AL2 023 平台使用該文件的以下版本。

      • Dockerrun.aws.json v3— 使用泊塢窗撰寫的環境。

      • Dockerrun.aws.json v1— 不使用泊塢窗撰寫的環境。

    • ECS在 Amazon Linux 2 上運ECS行並在 AL2 023 上運行使用該Dockerrun.aws.json v2文件。退休的平台 ECS-多容器碼頭工人 Amazon LinuxAMI(AL1)也使用了相同的版本。

Elastic Beanstalk 可以使用託管私有儲存庫的線上登錄進行驗證之後,即可部署和提取您的映像。