#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
разрешения и .
Ответ №5:
Создайте встроенную политику для роли или пользователя, используемого для развертывания функции Lambda. Это добавит все необходимые разрешения для взаимодействия с частными репозиториями ECR.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ecr:*",
"Resource": "*"
}
]
}
Комментарии:
1. Это добавляет все разрешения, включая деструктивные. Вы должны разрешить только необходимый минимум (в данном случае чтение).