我试图使用容器镜像创建 AWS Lambda 函数,但收到了 Amazon Elastic Container Registry (Amazon ECR) 权限错误。
简短描述
若要从容器镜像创建 Lambda 函数,创建函数和 Amazon ECR 存储库的用户或角色必须具有允许访问的策略。
**注意:**在创建 Lambda 函数之前,请先创建 Lambda 容器镜像。然后,将镜像上传到 Amazon ECR 存储库。
有关详细信息,请参阅将 Lambda 函数部署为容器镜像。
解决方法
请按照以下步骤设置私有存储库策略语句。
**注意:**最佳做法是只为执行任务所需的权限授予最低权限。有关详细信息,请参阅应用最低权限许可。
1.通过同一 AWS 账户的 Amazon ECR 镜像 URI 创建 Lambda 函数
在以下示例中,Amazon ECR 存储库权限必须允许对 Lambda 服务执行 ecr:BatchGetImage 和 ecr:GetDownloadUrlForLayer API 操作。
Amazon ECR 存储库策略示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "LambdaECRImageRetrievalPolicy",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
]
}
]
}
2.通过跨账户的 Amazon ECR 镜像 URI 创建 Lambda 函数
在以下示例中,在 AWS 账户 111111111111 和 Amazon ECR 存储库中创建的 Lambda 函数位于 AWS 账户 222222222222 中。
创建或更新了 Lambda 函数的用户或角色必须对 ECR 存储库拥有 ecr:BatchGetImage 和 ecr:GetDownloadUrlForLayer 权限。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ECR Repository Access Permissions",
"Effect": "Allow",
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
"Resource": "arn:aws:ecr:us-east-1:222222222222:repository/hello-repository"
}
]
}
在以下示例中,CrossAccountPermission 语句允许 AWS 账户 111111111111 创建和更新使用 Amazon ECR 存储库中的镜像的 Lambda 函数。
Amazon ECR 存储库跨账户策略示例:
{
"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:function:*"
}
}
}
]
}
如果长时间未调用某函数,Lambda 最终会将该函数的状态设置为非活动状态。
**注意:**LambdaECRImageCrossAccountRetrievalPolicy 语句是必需的,这样 Lambda 才能检索 AWS 账户 111111111111 的容器镜像。
有关详细信息,请参阅 Amazon ECR 跨账户权限。
相关信息
为 AWS Lambda 引入跨账户 Amazon ECR 访问
如何解决 Lambda 的权限问题?