Lambda没有访问ECR映像的权限



随着最近发布的用于Lambda函数的Docker Images,我决定使用CloudFormation来尝试此功能。

因此,下面的lambda考虑存储在Elastic Container Registry中的docker映像,并根据文档中的示例访问该映像。

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;

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

基于注释。

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

确保创建功能的AWS身份和访问管理(IAM(用户或角色的权限包含AWS管理的策略GetRepositoryPolicySetRepositoryPolicy

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

对于帐户222222222中的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:*

您必须将以下策略添加到您的用户和将关联到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": "*"
}
]
}

在所有必需的AWS lambda策略都到位的情况下,我也面临着同样的问题。帮助我的是在ECR 中添加权限

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

虽然aws还说,如果lambda有策略(ecr:getRepositoryPolicyecr:setRepositoryPolicy(,那么我们不需要在ECR中添加权限。lambda会自动做到这一点。

如果Amazon ECR存储库不包括这些权限,Lambda会将ecr:BatchGetImageecr:GetDownloadUrlForLayer添加到容器映像存储库权限中。只有当调用Lambda的主体具有ecr:getRepositoryPolicyecr:setRepositoryPolicy权限时,Lambda才能添加这些权限。

参考#1、#2

遇到了类似的问题,当时我在Account A中有ECR,需要在Account B中创建Lambda。

解决方案是在账户A的ECR回购中添加以下内容:

参考

{
"Version": "2008-10-17",
"Statement": [  
{
"Sid": "LambdaECRImageRetrievalPolicyCrossAccount",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"ecr:BatchGetImage",
"ecr:DeleteRepositoryPolicy",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:SetRepositoryPolicy"
],
"Condition": {
"StringLike": {
"aws:sourceArn": "arn:aws:lambda:us-east-2:{account_id}:function:*"
}
}
},
{
"Sid": "CrossAccountPermission",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{account_id}:root"
},
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
]
}
]
}

我的建议并不能真正解决OP的问题,但它可能会帮助人们寻找解决问题的方法——如果情况与我的相同的话。

我通过一些跟踪和错误(没有得到CloudTrail的任何帮助或AWS的任何文档(发现,问题不在于Lambda从ECR获取图像的权限,而是因为SCP明确拒绝而能够设置ECR的策略(ECR:SetRepositoryPolicy(。

如果你想看看这是否是你的情况,试着访问回购并改变政策,如果不能,就这样。尝试其他任何事情都没有用。

相关内容

最新更新