Lambda 无权访问 ECR 映像

Mig*_*ejo 6 amazon-web-services amazon-ecs aws-cloudformation aws-lambda aws-sam-cli

随着最近发布的Lambda功能Docker 映像,我决定使用CloudFormation.

因此,下面的 lambda 考虑了存储在 中的 docker 图像Elastic Container Registry,并有权按照文档中的示例访问该图像。

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
Run Code Online (Sandbox Code Playgroud)

我使用的是sam部署在模板us-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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*cin 13

根据评论。

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

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

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


Reg*_*ult 9

对于账户 222222222222 中的 lambda 使用 11111111111 中的 ECR 映像,您需要遵循https://aws.amazon.com/blogs/compute/introducing-cross-account-amazon-ecr-access-for-aws-lambda/

最重要的 IAM 部分是在 11111111111 存储库上设置以下存储库策略:

      RepositoryPolicyText:
        Version: "2012-10-17"
        Statement:
          - Sid: CrossAccountPermission
            Effect: Allow
            Action:
              - ecr:BatchGetImage
              - ecr:GetDownloadUrlForLayer
            Principal:
              AWS:
                - arn:aws:iam::222222222222:root
          - Sid: LambdaECRImageCrossAccountRetrievalPolicy
            Effect: Allow
            Action:
              - ecr:BatchGetImage
              - ecr:GetDownloadUrlForLayer
            Principal:
              Service: lambda.amazonaws.com
            Condition:
              StringLike:
                aws:sourceArn:
                  - arn:aws:lambda:us-east-1:222222222222:function:*
Run Code Online (Sandbox Code Playgroud)


Amb*_*us9 5

您必须将以下策略添加到将与 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": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)