【问题标题】:Lambda does not have permission to access the ECR imageLambda 无权访问 ECR 映像
【发布时间】:2021-03-16 03:46:07
【问题描述】:

随着最近发布的用于 Lambda 函数的 Docker 映像,我决定使用 CloudFormation 尝试此功能。

因此,下面的 lambda 考虑了存储在 Elastic Container Registry 中的 docker 映像,具有访问 documentation 中示例之后的映像的权限。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: lambda-docker-image

Globals:
  Function:
    Timeout: 180

Resources:
  DockerAsImage:
    Type: AWS::Serverless::Function 
    Properties:
      FunctionName: DockerAsImage
      ImageUri: ??????????????.dkr.ecr.us-west-2.amazonaws.com/????:latest
      PackageType: Image
      Policies: 
        - Version: '2012-10-17' 
          Statement:
            - Effect: Allow
              Action: 
                - ecr:*
                - ecr-public:*
                - sts:GetServiceBearerToken
              Resource: "*"
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: post

我正在使用samus-west-2 中部署模板

sam deploy -t template.yaml --capabilities "CAPABILITY_NAMED_IAM" --region "us-west-2" --stack-name "lambda-docker-example" --s3-bucket "my-bucket" --s3-prefix "sam_templates/lambda-docker-example" --force-upload  --no-confirm-changeset

但是,在 IAM 角色创建成功后,Lambda 函数创建失败并出现以下错误

Lambda does not have permission to access the ECR image. Check the ECR permissions. (Service: AWSLambdaInternal; Status Code: 403; Error Code: AccessDeniedException;

即使该角色有权访问任何 ecs 资源。我尝试的另一种方法是创建一个单独的角色并通过Role: !GetAtt Role.Arn将其分配给lambda,这种方法也不起作用。

【问题讨论】:

  • 您的 IAM 用户/角色是否有权访问 ECR?要使用基于图像的 lambda 函数,您作为创建函数的用户/角色需要 ECR 权限,如 here 所述。你能检查一下吗?
  • @Marcin 我遇到了同样的问题,你的建议解决了!
  • @alexyz78 感谢您告诉我。如果它适用于 OP,我会在答案中提供更多信息。
  • @Marcin 是的,这两个权限确实解决了这个问题,此外,要将 docker 映像推送到 ecr,ecr: InitiateLayerUpload 是必要的。非常感谢 Marcin,AWS 文档往往不是一个简单的指南。欢迎分享您的答案。
  • @MiguelTrejo 谢谢,已添加答案。

标签: amazon-web-services aws-lambda amazon-cloudformation amazon-ecs aws-sam-cli


【解决方案1】:

您必须将以下策略添加到您的用户和将与 AWS Lambda 关联的角色。此策略启用 ECR 操作:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ecr:SetRepositoryPolicy",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:CompleteLayerUpload",
                "ecr:DescribeImages",
                "ecr:DescribeRepositories",
                "ecr:UploadLayerPart",
                "ecr:ListImages",
                "ecr:InitiateLayerUpload",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetRepositoryPolicy",
                "ecr:PutImage"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        }
    ]
}

【讨论】:

    【解决方案2】:

    为用于 Lambda 函数部署的角色或用户创建内联策略。这添加了与 ECR 私有存储库交互所需的所有权限。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": "ecr:*",
                "Resource": "*"
            }
        ]
    }
    

    【讨论】:

      【解决方案3】:

      基于 cmets。

      要使用基于图像的 lambda,需要 ECR 权限的是 IAM 用户/角色,而不是函数本身。来自docs

      确保 AWS Identity and Access Management (IAM) 创建函数的用户或角色的权限包含 AWS 托管策略 GetRepositoryPolicySetRepositoryPolicy

      除了上面列出的两个权限外,还需要ecr: InitiateLayerUpload

      【讨论】:

      • 嗯,我们似乎也需要LambdaECRImageRetrievalPolicy
      猜你喜欢
      • 2022-06-23
      • 2017-04-14
      • 2019-07-01
      • 1970-01-01
      • 2018-01-22
      • 2019-05-29
      • 1970-01-01
      • 2016-05-27
      • 2019-02-06
      相关资源
      最近更新 更多