使用图像存储库进行身份验证 - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用图像存储库进行身份验证

本主题介绍如何使用 Elastic Beanstalk 对在线图像存储库进行身份验证。对于私有存储库,Elastic Beanstalk 必须先进行身份验证,然后才能提取和部署您的映像。对于 Amazon ECR Public,身份验证是可选的,但提供了更高的速率限制和更高的可靠性。

使用 Amazon ECR 存储库中的映像

您可以使用亚马逊弹性容器注册表 (Amazon ECR) 存储您的自定义 Docker 镜像。 Amazon

当您将 Docker 映像存储在 Amazon ECR 中时,Elastic Beanstalk 会自动使用您环境的实例配置文件向 Amazon ECR 注册表进行身份验证。因此,您需要为您的实例提供访问 Amazon ECR 存储库中的映像的权限。为此,请将 Amazon EC2 ContainerRegistryReadOnly 托管策略附加到实例配置文件中,为环境的实例配置文件添加权限。这提供了对您账户中所有 Amazon ECR 存储库的只读访问权限。您还可以选择仅使用以下模板创建自定义策略来访问单个存储库:

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

将上述策略中的 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) 参数存储或 Amazon Secrets Manager

将 Elastic Beanstalk 配置为在部署之前使用您的私有存储库进行身份验证,从而允许访问您的容器映像。

这种方法使用了 Elastic Beanstalk 部署过程的预构建阶段,其中包含两个组件:

  • 用于定义存储库凭据的环境变量的 ebext ensions

  • docker login在拉取图像之前要执行的@@ 平台挂钩脚本

挂钩脚本可以安全地从从 P Amazon Systems Manager arameter Store 或填充的环境变量中检索凭证 Amazon Secrets Manager。此功能需要在 2025 年 3 月 26 日当天或之后发布的 Elastic Beanstalk Docker 和 ECS 托管 Docker 平台。有关更多详细信息,请参阅环境变量配置

要将 Elastic Beanstalk 配置为使用参数存储向您的私有存储库进行身份验证,或者 Amazon Systems ManagerAmazon Secrets Manager
注意

在继续操作之前,请确保您已在 P Amazon Systems Manager arameter Store 中设置凭证或 Amazon Secrets Manager 配置了必要的 IAM 权限。有关详细信息,请参阅将密钥配置为环境变量的先决条件

  1. 为您的项目创建以下目录结构:

    ├── .ebextensions │ └── env.config ├── .platform │ ├── confighooks │ │ └── prebuild │ │ └── 01login.sh │ └── hooks │ └── prebuild │ └── 01login.sh ├── Dockerfile
  2. 使用 Amazon Systems ManagerParameter 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"
  3. 创建以下 env.config 文件并将其放在 .ebextensions 目录中,如前面的目录结构所示。此配置使用aws: elasticbeanstalk: 应用程序:环境秘密命名空间将USER和 E PASSWD lastic Beanstalk 环境变量初始化为存储在 Systems Manager 参数存储中的值。

    注意

    确保变量名称USERPASSWD与 p ut-parameter 和 create-s ecre t 命令中使用的参数名称相匹配。

    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
  4. 创建以下 01login.sh 脚本文件并将其放在以下目录中(也显示在前面的目录结构中):

    • .platform/confighooks/prebuild

    • .platform/hooks/prebuild

    ### example 01login.sh #!/bin/bash echo $PASSWD | docker login -u $USER --password-stdin

    01login.sh脚本使用在步骤 3 中配置的环境变量,并将密码安全地传递给 docker login via stdin。有关 Docker 身份验证的更多信息,请参阅 Doc ker 文档中的 docker 登录。

    备注
    • 挂钩文件既可以是二进制文件,也可以是以包含其解释器路径的 #! 行开头的脚本文件,例如 #!/bin/bash

    • 有关更多信息,请参阅扩展 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 Docker 平台版本(在 Amazon Linux 2 之前),请阅读Amazon Linux AMI(在 Amazon Linux 2 之前)上的 Docker 配置中的相关信息。

    有关身份验证文件的更多信息,请参阅 Docker 网站上的在 Docker Hub 上存储映像docker login

  2. 将名为 .dockercfg 的身份验证文件的副本上传到安全的 Amazon S3 存储桶。

    • Amazon S3 存储桶的托管环境必须与使用它的环境 Amazon Web Services 区域 相同。Elastic Beanstalk 无法从托管在其他区域的 Amazon S3 存储桶下载文件。

    • 在实例配置文件中授予 IAM 角色执行 s3:GetObject 操作的权限。有关更多信息,请参阅管理 Elastic Beanstalk 实例配置文件

  3. 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 和 AL2 023 平台使用以下版本的文件。

      • Dockerrun.aws.json v3 — 使用 Docker Compose 的环境。

      • Dockerrun.aws.json v1 — 不使用 Docker Compose 的环境。

    • 在 Amazon Linux 2 上运行ECS 和在 AL2 023 上运行的 ECS 使用该Dockerrun.aws.json v2文件。已停用的平台 ECS 多容器 Docker Amazon Linux AMI (AL1) 也使用了相同的版本。

在 Elastic Beanstalk 可以使用托管私有存储库的在线注册表进行身份验证之后,可以部署和提取您的映像。

使用来自 Amazon ECR Public 的图片

Amazon ECR Public 是一个托管 Docker 镜像的公共容器注册表。虽然 Amazon ECR 公共存储库可公开访问,但身份验证为您的部署提供了更高的速率限制和更高的可靠性。

注意

中国地区 () 和 Amazon GovCloud 地区 (cn-*) 不支持 Amazon ECR 公共身份验证。us-gov-*在这些区域,Elastic Beanstalk 将使用未经身份验证的拉取。

要启用 Amazon ECR 公共身份验证,请在您的环境的实例配置文件中添加以下权限。有关 Amazon ECR 公共身份验证的更多信息,请参阅 Amazon Elastic C ontainer Registry 公共用户指南中的 Amazon ECR 中的注册身份验证:

JSON
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr-public:GetAuthorizationToken", "sts:GetServiceBearerToken" ], "Resource": "*" } ] }

将这些权限附加到您的实例配置文件后,Elastic Beanstalk 将自动向 Amazon ECR 公共注册管理机构进行身份验证。您可以使用Dockerrun.aws.json文件或 Dockerfile 中的标准public.ecr.aws/registry-alias/repository-name:tag格式引用 Amazon ECR 公共镜像。