我在不同的 AWS 账户中遇到了有关 beanstalk 和 ECR 的一些问题。
在“Dockerrun.aws.json”中,我尝试提取的图像属于另一个AWS帐户(相同的组织但不同的帐户ID)。
“图像”:{
“名称”:“XXXXXXX.dkr.ecr.eu-central-1.amazonaws.com/YYYYYYY”,
“更新”:“正确”
},
在 ECR 权限中,我已经添加了允许 beanstalk 拉取镜像(另一个 AWS 帐户)的策略:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "Allow webapp aws account",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ZZZZZZZZZZZ:root"
},
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:DescribeRepositories",
"ecr:GetRepositoryPolicy",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:DeleteRepository",
"ecr:BatchDeleteImage",
"ecr:SetRepositoryPolicy",
"ecr:DeleteRepositoryPolicy",
"ecr:GetLifecyclePolicy",
"ecr:PutLifecyclePolicy",
"ecr:DeleteLifecyclePolicy",
"ecr:GetLifecyclePolicyPreview",
"ecr:StartLifecyclePolicyPreview"
]
}
]
}
但是,我在尝试构建 Beanstalk 环境时仍然收到以下错误:
because: Failed to authenticate with ECR for registry 'XXXXXX' in 'eu-central-1' (ElasticBeanstalk::ExternalInvocationError)
caused by: Failed to authenticate with ECR for registry 'XXXXX' in 'eu-central-1' (Executor::NonZeroExitStatus
我想知道如何解决这个问题。如果我可以使用 dockerrun.aws.json 中的身份验证参数应该很棒。但不确定它是否适用于 ECR,因为 token 会在 12 小时后过期。
"Authentication": {
"Bucket": "elasticbeanstalk-eu-central-1-XXXXX",
"Key": "aws_credentials.json"
},
最佳答案
当 Elastic Beanstalk 在部署期间拉取 Docker 镜像时,它将使用 Elastic Beanstalk 运行时环境的 EC2 实例配置文件。这意味着您必须:
- 授予您的实例配置文件角色从 ECR 存储库中提取的权限。最终得到一个看起来像这样的政策文件:
{
"版本": "2008-10-17",
“陈述”: [
{
"Sid": "ElasticBeanstalkApplicationInstance",
"效果": "允许",
“主要的”: {
"AWS": "arn:aws:iam::ZZZZZZZZZZZ: 角色/YourElasticBeanstalkApplicationIamRole-A1B2C3D4E5"
},
“行动”: [
“ecr:GetDownloadUrlForLayer”,
“ecr:批量获取图像”,
“ecr:批量检查图层可用性”
]
}
]
}
注意:据我所知,无法在管理控制台中授予此类权限,这意味着您必须使用 CloudFormation 来完成此操作。
- 授予您的 Elastic Beanstalk 运行时实例权限以从存储库获取授权 token 和图像。这是通过创建以下策略并将其附加到 IAM 中的实例配置文件角色来完成的。 (https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker.container.console.html#docker-images-ecr)
{ "版本": "2012-10-17", “陈述”: [ { "Sid": "AllowEbAuth", "效果": "允许", “行动”: [ “ecr:获取授权 token ” ], “资源”:[ “*” ] }, { "Sid": "允许拉", "效果": "允许", “资源”:[ “arn:aws:ecr:us-east-2:账户 ID:存储库/存储库名称” ], “行动”: [ “ecr:批量检查图层可用性”, “ecr:GetDownloadUrlForLayer”, “ecr:获取存储库策略”, “ecr:描述存储库”, “ecr:列表图像”, “ecr:批量获取图像” ] } ] }
关于amazon-elastic-beanstalk - Beanstalk 从不同的 (ECR) AWS 账户获取容器镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50368099/