Eu tentei criar uma função do AWS Lambda com uma imagem de contêiner. No entanto, recebi uma mensagem de erro de permissão do Amazon Elastic Container Registry (Amazon ECR) semelhante à seguinte: "Lambda does not have permission to access the ECR image. Check the ECR permissions"
Breve descrição
Para criar uma função do Lambda a partir de uma imagem de contêiner, é preciso configurar as políticas do AWS Identity and Access Management (AWS IAM) que permitam o acesso. O usuário ou o perfil do IAM que cria a função e o repositório do Amazon ECR devem ter permissões que autorizem o acesso.
Observação: antes de criar a função do Lambda, primeiro crie uma imagem de contêiner do Lambda. Em seguida, carregue a imagem em um repositório do Amazon ECR.
Resolução
Siga as etapas para definir uma declaração de política de repositório privado no Amazon ECR. Em seguida, adicione uma declaração de política para criar uma função do Lambda a partir do URI da imagem do Amazon ECR na mesma conta da AWS ou conta cruzada.
Observação: é uma prática recomendada conceder permissões de privilégio mínimo com as políticas do IAM.
Adicionar uma declaração de política na mesma conta
Na política a seguir, as permissões do repositório do Amazon ECR devem permitir que as ações da API ecr:BatchGetImage e ecr:GetDownloadUrlForLayer acessem o serviço Lambda.
Exemplo de política de repositório do Amazon ECR:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "LambdaECRImageRetrievalPolicy",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
]
}
]
}
Importante: se o repositório do Amazon ECR não incluir as permissões anteriores, o Lambda as adicionará automaticamente. O Lambda pode adicionar permissões somente se a entidade principal que chama o Lambda tiver as permissões ecr:getRepositoryPolicy e ecr:setRepositoryPolicy. Para mais informações, consulte as políticas de repositório do Amazon ECR.
Adicionar uma declaração de política em uma conta cruzada
O usuário ou o perfil que cria ou atualiza a função do Lambda deve ter as permissões ecr:BatchGetImage e ecr:GetDownloadUrlForLayer no repositório do ECR.
Na política a seguir, as funções do Lambda criadas na conta 111111111111 e no repositório do Amazon ECR estão na conta 222222222222.
Exemplo de política do IAM que permite que o usuário ou o perfil acessem o repositório de contas cruzadas do Amazon ECR:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ECRRepositoryAccessPermissions",
"Effect": "Allow",
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
"Resource": "arn:aws:ecr:us-east-1:222222222222:repository/your-repository"
}
]
}
Observação: substitua arn:aws:ecr:us-east-1:222222222222:repository/your-repository pelo nome do recurso da Amazon (ARN) do recurso de repositório do ECR.
No exemplo a seguir, a declaração CrossAccountPermission permite que a conta 111111111111 crie e atualize funções do Lambda que usam imagens do repositório do Amazon ECR.
Exemplo de política de conta cruzada do repositório Amazon ECR permite que a função do Lambda recupere a imagem do contêiner:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CrossAccountPermission",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:root"
},
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
]
},
{
"Sid": "LambdaECRImageCrossAccountRetrievalPolicy",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
],
"Condition": {
"StringLike": {
"aws:sourceARN": "arn:aws:lambda:us-east-1:111111111111:your-function:*"
}
}
}
]
}
Observação: substitua arn:aws:ecr:us-east-1:222222222222:repository/your-repository pelo ARN da função do Lambda.
Para mais informações, consulte Amazon ECR cross-account permissions (Permissões entre contas do Amazon ECR).
Informações relacionadas
Introducing cross-account Amazon ECR access for AWS Lambda (Apresentação do acesso entre contas do Amazon ECR para o AWS Lambda)
How do I troubleshoot permissions issues with Lambda? (Como solucionar problemas de permissões com o Lambda?)