如何解决带有容器镜像的 Lambda 函数的“Lambda 无权访问 ECR 镜像...”错误?

2 分钟阅读
0

我试图使用容器镜像创建 AWS Lambda 函数,但收到了 Amazon Elastic Container Registry (Amazon ECR) 权限错误。

简短描述

若要从容器镜像创建 Lambda 函数,创建函数和 Amazon ECR 存储库的用户或角色必须具有允许访问的策略。

**注意:**在创建 Lambda 函数之前,请先创建 Lambda 容器镜像。然后,将镜像上传到 Amazon ECR 存储库

有关详细信息,请参阅将 Lambda 函数部署为容器镜像

解决方法

请按照以下步骤设置私有存储库策略语句

**注意:**最佳做法是只为执行任务所需的权限授予最低权限。有关详细信息,请参阅应用最低权限许可

1.通过同一 AWS 账户的 Amazon ECR 镜像 URI 创建 Lambda 函数

在以下示例中,Amazon ECR 存储库权限必须允许对 Lambda 服务执行 ecr:BatchGetImageecr:GetDownloadUrlForLayer API 操作。

Amazon ECR 存储库策略示例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "LambdaECRImageRetrievalPolicy",
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ]
    }
  ]
}

2.通过跨账户的 Amazon ECR 镜像 URI 创建 Lambda 函数

在以下示例中,在 AWS 账户 111111111111 和 Amazon ECR 存储库中创建的 Lambda 函数位于 AWS 账户 222222222222 中。

创建或更新了 Lambda 函数的用户或角色必须对 ECR 存储库拥有 ecr:BatchGetImageecr:GetDownloadUrlForLayer 权限。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ECR Repository Access Permissions",
      "Effect": "Allow",
      "Action": [
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage"
      ],
      "Resource": "arn:aws:ecr:us-east-1:222222222222:repository/hello-repository"
    }
  ]
}

在以下示例中,CrossAccountPermission 语句允许 AWS 账户 111111111111 创建和更新使用 Amazon ECR 存储库中的镜像的 Lambda 函数。

Amazon ECR 存储库跨账户策略示例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CrossAccountPermission",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:root"
      },
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ]
    },
    {
      "Sid": "LambdaECRImageCrossAccountRetrievalPolicy",
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Condition": {
        "StringLike": {
          "aws:sourceARN": "arn:aws:lambda:us-east-1:111111111111:function:*"
        }
      }
    }
  ]
}

如果长时间未调用某函数,Lambda 最终会将该函数的状态设置为非活动状态。

**注意:**LambdaECRImageCrossAccountRetrievalPolicy 语句是必需的,这样 Lambda 才能检索 AWS 账户 111111111111 的容器镜像。

有关详细信息,请参阅 Amazon ECR 跨账户权限

相关信息

为 AWS Lambda 引入跨账户 Amazon ECR 访问

如何解决 Lambda 的权限问题?

AWS 官方
AWS 官方已更新 1 年前