У Lambda нет разрешения на доступ к изображению ECR

#amazon-web-services #aws-lambda #amazon-cloudformation #amazon-ecs #aws-sam-cli

#amazon-web-services #aws-lambda #amazon-cloudformation #amazon-ecs #aws-sam-cli

Вопрос:

С недавним выпуском Docker Images for Lambda functions я решил опробовать эту функциональность с помощью CloudFormation .

Итак, в приведенном ниже лямбде рассматривается образ 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
 

Я использую 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
 

Однако сразу после 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 ресурсу. Другой способ, который я пробовал, — создать отдельную роль и назначить ее lambda через Role: !GetAtt Role.Arn , этот подход тоже не работает.

Комментарии:

1. Имеет ли ваш пользователь / роль IAM права доступа к ECR? Для использования лямбда-функции на основе изображений вам как пользователю / роли, который создает функцию, необходимы разрешения ECR, как описано здесь . Вы можете это проверить?

2. @Marcin У меня была такая же проблема, и ваш совет решил ее!

3. @alexyz78 Спасибо, что дали мне знать. Если это будет для OP, я могу предоставить больше информации в ответе.

4. @Marcin да, действительно, эти два разрешения решают проблему, кроме того, для отправки образа docker в ecr это было необходимо ecr: InitiateLayerUpload . Большое вам спасибо, Марчин, документы AWS, как правило, не являются простым руководством. Не стесняйтесь поделиться своим ответом.

5. @MiguelTrejo Спасибо, добавлен ответ.

Ответ №1:

На основе комментариев.

Для использования лямбд на основе изображений разрешения ECR требуются пользователю / роли IAM, а не самой функции. Из документов:

Убедитесь, что разрешения для пользователя или роли AWS Identity and Access Management (IAM), которые создают функцию, содержат управляемые AWS политики GetRepositoryPolicy и SetRepositoryPolicy.

В дополнение к двум разрешениям, перечисленным выше, ecr: InitiateLayerUpload также требуется.

Комментарии:

1. Хм, нам, похоже, тоже нужно LambdaECRImageRetrievalPolicy .

Ответ №2:

Вы должны добавить следующую политику к своему пользователю и Роли, которые будут связаны с 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": "*"
        }
    ]
}
 

Ответ №3:

Для того, чтобы лямбда-код в учетной записи 222222222222 использовал изображение ECR в 11111111111, вам необходимо следовать 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:*
 

Ответ №4:

Я столкнулся с теми же проблемами со всеми необходимыми политиками AWS lambda. Мне помогло добавление разрешений в ECR

 {
      "Sid": "LambdaECRImageRetrievalPolicy",
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ]
}   
 

Хотя aws также говорит, что если у lambda есть политики ( ecr:getRepositoryPolicy и ecr:setRepositoryPolicy ), то нам не нужно добавлять разрешение в ECR, lambda автоматически делает это.

Если репозиторий Amazon ECR не содержит этих разрешений, Lambda добавляет ecr:BatchGetImage и ecr:GetDownloadUrlForLayer к разрешениям хранилища изображений контейнера. Lambda может добавлять эти разрешения, только если основной вызывающий Lambda имеет ecr:getRepositoryPolicy ecr:setRepositoryPolicy разрешения и .

Ссылка # 1, #2

Ответ №5:

Создайте встроенную политику для роли или пользователя, используемого для развертывания функции Lambda. Это добавит все необходимые разрешения для взаимодействия с частными репозиториями ECR.

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

Комментарии:

1. Это добавляет все разрешения, включая деструктивные. Вы должны разрешить только необходимый минимум (в данном случае чтение).