You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:11:15