Lambda 无权访问 ECR 映像

Posted

技术标签:

【中文标题】Lambda 无权访问 ECR 映像【英文标题】:Lambda does not have permission to access the ECR image 【发布时间】: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 谢谢,已添加答案。 【参考方案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

以上是关于Lambda 无权访问 ECR 映像的主要内容,如果未能解决你的问题,请参考以下文章

如何将 AWS cloudwatch 事件添加到基于具有 terraform 的容器映像的 aws_lambda_function?

仅允许 ECR 请求的安全组出口规则

nodejs中如何访问ecs任务定义环境变量?

如何通过 AWS EKS 在 ECR 中使用 Docker 映像

如何将解组事件用于 go1.x 的 lambda 容器映像中 AWS 定义的类型,并提供为基础

ECR 映像移动到 ECS(Docker、Gitlab)