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

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

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

本主题介绍如何使用 Elastic Beanstalk 向私有在线镜像存储库进行身份验证。Elastic Beanstalk 必须先向在线注册机构进行身份验证,然后才能提取和部署您的映像。有多种选择可以这样做:

  • 亚马逊ECR存储库

  • 的 AWS Secrets Manager

  • Dockerrun.aws.json 文件

使用来自 Amazon ECR 存储库的图片

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

当你将 Docker 镜像存储在亚马逊时ECR,Elastic Beanstalk 会自动使用您环境的实例配置文件向亚马逊注册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",

有关 Docker 平台的信息,请参考以下图片。URLDockerrun.aws.json文件URLImage定义中包含以下内容:

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

使用 AWS Secrets Manager

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

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

要将 Elastic Beanstalk 配置为使用您的私有存储库进行身份验证 AWS Secrets Manager
注意

必须授予特定权限才能完成这些步骤。有关更多信息,请参阅以下参考。

  • 步骤 2 中,您需要相应权限才能创建密钥。有关更多信息,请参阅《AWS Secrets Manager 用户指南》中的示例:创建密钥的权限

  • 步骤 3 中,您需要相应权限才能使用 secretsmanager 动态引用检索密钥。有关更多信息,请参阅AWS Secrets Manager 用户指南中的示例:检索密钥值的权限

  1. 按如下方式创建 .ebextensions 目录结构。

    ├── .ebextensions │ └── env.config ├── .platform │ ├── confighooks │ │ └── prebuild │ │ └── 01login.sh │ └── hooks │ └── prebuild │ └── 01login.sh ├── docker-compose.yml
  2. AWS Secrets Manager 用于保存您的私有存储库的证书,这样 Elastic Beanstalk 就可以在需要时检索您的证书。为此,请运行 Secrets Manager create-secre AWS CLI t 命令。

    aws secretsmanager create-secret \ --name MyTestSecret \ --description "My image repo credentials created with the CLI." \ --secret-string "{\"USER\":\"EXAMPLE-USERNAME\",\"PASSWD\":\"EXAMPLE-PASSWORD\"}"
  3. 创建以下 env.config 文件并将其放在 .ebextensions 目录中,如前面的目录结构所示。此配置使用 aws:elasticbeanstalk:application:environment 命名空间通过对 AWS Secrets Manager的动态引用初始化 USERPASSWD Elastic Beanstalk 环境变量。有关secretsmanager动态引用的更多信息,请参阅《AWS Secrets Manager 用户指南》中的检索 AWS CloudFormation 资源中的 AWS Secrets Manager 密钥

    注意

    脚本中的 USERPASSWD 必须与前面的 secretsmanager create-secret 命令中使用的相同字符串匹配。

    option_settings: aws:elasticbeanstalk:application:environment: USER: '{{resolve:secretsmanager:MyTestSecret:SecretString:USER}}' PASSWD: '{{resolve:secretsmanager:MyTestSecret:SecretString:PASSWD}}'
  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 环境使用AMI亚马逊 Linux Docker 平台版本(早于亚马逊 Linux 2),请阅读中的相关信息。亚马逊 Linux 上的 Docker 配置AMI(之前的亚马逊 Linux 2)

    有关身份验证文件的更多信息,请参阅 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 和 AL2 023 平台使用以下版本的文件。

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

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

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

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