映像存储库的身份验证
本主题介绍如何使用 Elastic Beanstalk 对在线映像存储库进行身份验证。对于私有存储库,Elastic Beanstalk 必须先进行身份验证,然后才能拉取和部署您的映像。对于 Amazon ECR Public,身份验证是可选项,但提供了更宽松的速率限制和更高的可靠性。
使用 Amazon ECR 存储库中的映像
您可以使用 Amazon Elastic Container Registry
当您将 Docker 映像存储在 Amazon ECR 中时,Elastic Beanstalk 会自动使用您环境的实例配置文件向 Amazon ECR 注册表进行身份验证。因此,您需要为您的实例提供访问 Amazon ECR 存储库中的映像的权限。为此,请通过将 AmazonEC2ContainerRegistryReadOnly 托管式策略附加到实例配置文件来向您的环境的实例配置文件添加权限。这提供了对您账户中所有 Amazon ECR 存储库的只读访问权限。您还可以选择仅使用以下模板创建自定义策略来访问单个存储库:
将上述策略中的 Amazon Resource Name (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",
对于 Docker 平台,请通过 URL 引用映像。URL 位于您的 Dockerrun.aws.json 文件的 Image 定义中:
"Image": {
"Name": "account-id.dkr.ecr.us-east-2.amazonaws.com/repository-name:latest",
"Update": "true"
},
使用 Amazon Systems Manager(SSM)Parameter Store 或 Amazon Secrets Manager
将 Elastic Beanstalk 配置为在部署之前对私有存储库进行身份验证,以允许对容器映像的访问。
此方法使用 Elastic Beanstalk 部署过程的预构建阶段,其中包含两个组件:
-
ebextensions,用于定义存储存储库凭证的环境变量
-
平台钩子脚本,用于在拉取映像之前执行 docker login
钩子脚本可以安全地从环境变量(从 Amazon Systems Manager Parameter Store 或 Amazon Secrets Manager 填充)检索凭证。此功能需要使用 2025 年 3 月 26 日当天或之后发布的 Elastic Beanstalk Docker 和 ECS 托管 Docker 平台。有关更多详细信息,请参阅环境变量配置。
将 Elastic Beanstalk 配置为使用 Amazon Systems Manager Parameter Store 或 Amazon Secrets Manager 对私有存储库进行身份验证
注意
在继续操作之前,请确保您已在 Amazon Systems Manager Parameter Store 或 Amazon Secrets Manager 中设置凭证或配置了必要的 IAM 权限。有关详细信息,请参阅将密钥配置为环境变量的先决条件。
-
为您的项目创建以下目录结构:
├── .ebextensions │ └── env.config ├── .platform │ ├── confighooks │ │ └── prebuild │ │ └── 01login.sh │ └── hooks │ └── prebuild │ └── 01login.sh ├── Dockerfile -
使用 Amazon Systems Manager Parameter Store 或 Amazon Secrets Manager 保存私有存储库的凭证。此示例同时显示了 Amazon Systems Manager Parameter Store 和 Amazon Secrets Manager,但您可以选择仅使用其中一项服务。
aws ssm put-parameter --name USER --type SecureString --value "username" aws secretsmanager create-secret --name PASSWD --secret-string "passwd" -
创建以下
env.config文件并将其放在.ebextensions目录中,如前面的目录结构所示。此配置使用 aws:elasticbeanstalk:application:environmentsecrets 命名空间将USER和PASSWDElastic Beanstalk 环境变量初始化为 Systems Manager Parameter Store 中存储的值。注意
确保变量名称
USER和PASSWD与 put-parameter 和 create-secret 命令中使用的参数名称一致。option_settings: aws:elasticbeanstalk:application:environmentsecrets: USER: arn:aws:ssm:us-east-1:111122223333:parameter/user PASSWD: arn:aws:secretsmanager:us-east-1:111122223333:passwd -
创建以下
01login.sh脚本文件并将其放在以下目录中(也显示在前面的目录结构中):-
.platform/confighooks/prebuild -
.platform/hooks/prebuild
### example 01login.sh #!/bin/bash echo $PASSWD | docker login -u $USER --password-stdin01login.sh脚本会使用在步骤 3 中配置的环境变量,并将密码通过stdin安全地传递给 docker login。有关 Docker 身份验证的更多信息,请参阅 Docker 文档中的 docker login。 备注
-
挂钩文件既可以是二进制文件,也可以是以包含其解释器路径的 #! 行开头的脚本文件,例如 #!/bin/bash。
-
有关更多信息,请参阅扩展 Elastic Beanstalk Linux 平台 中的 平台挂钩。
-
配置身份验证后,Elastic Beanstalk 可以从私有存储库拉取和部署映像。
使用 Dockerrun.aws.json 文件
本节介绍向私有存储库验证 Elastic Beanstalk 的另一种方法。使用此方法,您可以使用 Docker 命令生成身份验证文件,然后将身份验证文件上传到 Amazon S3 存储桶。您还必须在 Dockerrun.aws.json 文件中包含存储桶信息。
生成身份验证文件并提供给 Elastic Beanstalk
-
使用 docker login 命令生成身份验证文件。对于 Docker Hub 上的存储库,请运行 docker login:
$docker login对于其他注册表,请包括注册表服务器的 URL:
$docker loginregistry-server-url注意
如果您的 Elastic Beanstalk 环境使用 Amazon Linux AMI Docker 平台版本(在 Amazon Linux 2 之前),请阅读Amazon Linux AMI(在 Amazon Linux 2 之前)上的 Docker 配置中的相关信息。
有关身份验证文件的更多信息,请参阅 Docker 网站上的在 Docker Hub 上存储映像
和 docker login 。 -
将名为
.dockercfg的身份验证文件的副本上传到安全的 Amazon S3 存储桶。-
Amazon S3 存储桶必须托管在使用它的环境所在的相同 Amazon Web Services 区域 中。Elastic Beanstalk 无法从托管在其他区域的 Amazon S3 存储桶下载文件。
-
在实例配置文件中授予 IAM 角色执行
s3:GetObject操作的权限。有关更多信息,请参阅管理 Elastic Beanstalk 实例配置文件。
-
-
在
Authentication文件的Dockerrun.aws.json参数中包含 Amazon S3 存储桶信息。下面的示例演示了
amzn-s3-demo-bucket存储桶中一个名为mydockercfg的身份验证文件如何使用第三方注册表中的私有映像。有关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文件的版本。-
Docker AL2 平台和 AL2023 平台使用以下版本的文件。
Dockerrun.aws.json v3— 使用 Docker Compose 的环境。
Dockerrun.aws.json v1— 不使用 Docker Compose 的环境。
-
在 Amazon Linux 2 上运行的 ECS 和在 AL2023 上运行的 ECS 使用
Dockerrun.aws.json v2文件。已停用的平台 ECS-The Multicontainer Docker Amazon Linux AMI(AL1)也使用此相同版本。
-
在 Elastic Beanstalk 可以使用托管私有存储库的在线注册表进行身份验证之后,可以部署和提取您的映像。
使用来自 Amazon ECR Public 的映像
Amazon ECR Public 是一个托管 Docker 映像的公共容器注册表。虽然 Amazon ECR Public 存储库可公开访问,但身份验证为您的部署提供了更宽松的速率限制和更好的可靠性。
注意
中国区域 (cn-*) 和 Amazon GovCloud 区域 (us-gov-*) 不支持 Amazon ECR Public 身份验证。在这些区域中,Elastic Beanstalk 会使用未经身份验证的拉取。
要启用 Amazon ECR Public 身份验证,请在您环境的实例配置文件中添加以下权限。有关 Amazon ECR Public 的更多信息,请参阅《Amazon Elastic Container Registry Public User Guide》中的 Registry authentication in Amazon ECR public。
将这些权限附加到您的实例配置文件后,Elastic Beanstalk 会自动对 Amazon ECR Public 注册表进行身份验证。您可以使用 Dockerrun.aws.json 文件或 Dockerfile 中的标准 public.ecr.aws/ 格式引用 Amazon ECR Public 映像。registry-alias/repository-name:tag