如何通过Terraform跨账号访问AWS私有ECR仓库镜像?
跨账号引用AWS私有ECR镜像的解决方案
一、给AWS Acc #1的ECR仓库配置跨账号拉取权限
要让Acc #2能访问Acc #1的私有ECR镜像,首先得在Acc #1的ECR仓库中添加权限策略,允许指定主体(Acc #2账号或Lambda角色)执行镜像拉取所需的操作。
用Terraform配置的话,代码如下:
resource "aws_ecr_repository_policy" "cross_account_pull" { repository = aws_ecr_repository.your_repo.name policy = jsonencode({ Version = "2008-10-17" Statement = [ { Sid = "AllowAcc2Pull" Effect = "Allow" # 推荐用Acc #2中Lambda的执行角色ARN,比开放整个账号更安全 Principal = { AWS = "arn:aws:iam::ACC2_ACCOUNT_ID:role/YOUR_LAMBDA_ROLE_NAME" } Action = [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] } ] }) }
如果不想指定具体角色,也可以用Acc #2的账号根ARN:arn:aws:iam::ACC2_ACCOUNT_ID:root,但安全性稍低。
二、给AWS Acc #2的Lambda执行角色添加ECR访问权限
Lambda要拉取跨账号镜像,其执行角色必须拥有对应的ECR操作权限,包括获取授权令牌和拉取镜像的权限。
用Terraform给Lambda角色附加权限策略:
resource "aws_iam_role_policy" "lambda_ecr_cross_account" { name = "lambda-ecr-cross-account-access" role = aws_iam_role.iam_for_lambda.id policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability", "ecr:GetAuthorizationToken" ] Resource = [ "arn:aws:ecr:ECR_REGION:ACC1_ACCOUNT_ID:repository/YOUR_IMAGE_REPO_NAME" ] } ] }) }
其中GetAuthorizationToken是获取ECR登录令牌的必要操作,该操作的资源也可以设为*,因为它是全局级别的操作。
三、修正Lambda的镜像URI配置
确保你的image_uri填写的是Acc #1的正确信息:
image_uri = "ACC1_ACCOUNT_ID.dkr.ecr.ECR_REGION.amazonaws.com/YOUR_IMAGE_NAME:IMAGE_TAG"
替换其中的ACC1_ACCOUNT_ID、ECR_REGION、YOUR_IMAGE_NAME、IMAGE_TAG为实际值。
四、排查问题的额外步骤
如果还是无法访问,可以尝试:
- 检查Lambda所在VPC的网络配置:如果Acc #1的ECR用了VPC端点,要确保Lambda的VPC能访问该端点;如果走公网,Lambda需要有公网出口(比如配置NAT网关)。
- 手动测试权限:在Acc #2中切换到Lambda的执行角色,尝试拉取镜像,验证权限是否生效:
# 获取ECR授权令牌并登录 aws ecr get-login-password --region ECR_REGION | docker login --username AWS --password-stdin ACC1_ACCOUNT_ID.dkr.ecr.ECR_REGION.amazonaws.com # 尝试拉取镜像 docker pull ACC1_ACCOUNT_ID.dkr.ecr.ECR_REGION.amazonaws.com/YOUR_IMAGE_NAME:IMAGE_TAG
内容的提问来源于stack exchange,提问作者asds_asds
相关产品推荐
相关产品推荐

