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
我正在使用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
资源。我尝试的另一种方法是创建一个单独的角色并通过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 托管策略 GetRepositoryPolicy 和 SetRepositoryPolicy 。
除了上面列出的两个权限外,还需要ecr: InitiateLayerUpload
。
【讨论】:
嗯,我们似乎也需要LambdaECRImageRetrievalPolicy
。以上是关于Lambda 无权访问 ECR 映像的主要内容,如果未能解决你的问题,请参考以下文章
如何将 AWS cloudwatch 事件添加到基于具有 terraform 的容器映像的 aws_lambda_function?
如何通过 AWS EKS 在 ECR 中使用 Docker 映像