使用 Elastic Beanstalk 中私有存储库中的图像 - AWS Elastic Beanstalk

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

使用 Elastic Beanstalk 中私有存储库中的图像

本主题介绍如何使用 Elastic Beanstalk 对私有在线映像存储库进行身份验证。Elastic Beanstalk 必须先通过在线注册表进行身份验证,然后才能提取和部署您的图像。有多个配置选项。

使用 Amazon ECR 存储库中的映像

您可以使用 Amazon Elastic Container Registry (Amazon ECR) 在 AWS 中存储自定义 Docker 映像。

当您将 Docker 映像存储在 Amazon ECR 中时,Elastic Beanstalk 会自动使用您环境的实例配置文件向 Amazon ECR 注册表进行身份验证。因此,您需要为您的实例提供访问 Amazon ECR 存储库中的映像的权限。为此,请通过将 AmazonEC2ContainerRegistryReadOnly 托管式策略附加到实例配置文件来向您的环境的实例配置文件添加权限。这提供了对您账户中所有 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 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" },

使用 AWS Systems Manager (SSM) Parameter Store

您可以将 Elastic Beanstalk 配置为在它开始部署过程之前登录私有存储库。这样,Elastic Beanstalk 就可以从存储库访问映像并将这些映像部署到您的 Elastic Beanstalk 环境。

此配置在 Elastic Beanstalk 部署过程的预构建 阶段启动事件。您可以在 .ebextentions 配置目录中进行此设置。该配置使用平台挂钩脚本,这些脚本调用 docker login 对托管私有存储库的联机注册表进行身份验证。以下是这些配置步骤的详细分解说明。

使用 AWS SSM 将 Elastic Beanstalk 配置为向私有存储库进行身份验证
注意

您需要设置 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 Parameter Store 保存您的私有存储库的凭证,以便 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 目录中,如前面的目录结构所示。此配置使用 aws:elasticbeanstalk:application:environment 命名空间将 USERPASSWD Elastic 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 login

    注意
    • 所有脚本文件都必须具有执行权限。使用 chmod +x 对挂钩文件设置执行权限。对于 2022 年 4 月 29 日或之后发布的所有基于 Amazon Linux 2 的平台版本,Elastic Beanstalk 会自动向所有平台挂钩脚本授予执行权限。在这种情况下,您无需手动授予执行权限。有关这些平台版本的列表,请参阅 AWS Elastic Beanstalk 发布说明指南中的 2022 年 4 月 29 日 - Linux 平台发布说明。

    • 挂钩文件既可以是二进制文件,也可以是以包含其解释器路径的 #! 行开头的脚本文件,例如 #!/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 存储桶必须托管在使用它的环境所在的相同 AWS 区域 中。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 平台和 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 可以使用托管私有存储库的在线注册表进行身份验证之后,可以部署和提取您的映像。