允许 Lambda 的 S3 策略
Posted
技术标签:
【中文标题】允许 Lambda 的 S3 策略【英文标题】:S3 Policy to Allow Lambda 【发布时间】:2017-12-30 03:38:37 【问题描述】:我在使用 AWS 策略生成器创建的 S3 存储桶上具有以下策略,以允许以特定角色运行的 lambda 访问存储桶中的文件。但是,当我执行 Lambda 时,我得到 403 权限被拒绝:
"errorMessage": "Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: <requestId>)",
"errorType": "com.amazonaws.services.s3.model.AmazonS3Exception",
关于 S3 存储桶的政策:
"Version": "2012-10-17",
"Id": "Policy<number>",
"Statement": [
"Sid": "Stmt<number>",
"Effect": "Allow",
"Principal":
"AWS": "arn:aws:iam::<account>:role/<roleName>"
,
"Action": "s3:*",
"Resource": "arn:aws:s3:::<bucketName>/*"
]
政策有什么问题? Lamba 正在使用策略中配置的角色运行。
【问题讨论】:
我将首先修改此策略以将所有权限授予所有 .. 基本上删除 Principal 和 bucketname.. 这将告诉您问题是在您的 s3 策略中还是与 lambda 相关。 为什么不将 S3 存储桶权限添加到分配给 Lambda 函数的 IAM 角色,而不是尝试通过存储桶策略执行此操作? 你对 Lambda 的存储桶做了什么?某些操作需要资源在末尾排除/*
,其他操作需要包含:"Resource": [ "arn:aws:s3:::<bucketName>", "arn:aws:s3:::<bucketName>/*" ]
【参考方案1】:
分配给 AWS Lambda 函数的角色应使用 AWS Lambda 角色创建(在 IAM 控制台中创建角色时选择该角色)。
角色没有委托人,因为权限分配给使用该角色的任何服务(在本例中为 Lambda 函数)。
此外,您应该为存储桶本身(例如,列出内容)和存储桶的内容(例如,GetObject)分配权限。
应该是这样的:
"Version": "2012-10-17",
"Statement": [
"Sid": "AllowS3Access",
"Effect": "Allow",
"Principal":
"AWS": "arn:aws:iam::123XXX:role/service-role/LAMBDA_ROLE_NAME"
,
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
]
【讨论】:
感谢您的回复。我在存储桶本身上设置的策略是正确的。缺少的是卷本身需要通过 IAM 附加 AmazonS3FullAccess 策略。 @FiguringThisOut:将 AmazonS3FullAccess 策略附加到角色也对我有用。请发布您自己的答案并将其标记为已接受的答案!【参考方案2】:在循环 for I 后,我可以让它工作,过程是:
-
创建 s3 存储桶。
创建 IAM 策略(需要存储桶名称)
创建 IAM 角色(需要 IAM 策略)
创建 lambda 函数(需要 IAM 角色)
创建 s3 存储桶策略(需要 lambda 函数名称)
IAM 政策:
"Version": "2012-10-17",
"Statement": [
"Sid": "Stmt*******",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectTagging",
"s3:PutObjectVersionAcl",
"s3:PutObjectVersionTagging"
],
"Resource": [
"arn:aws:s3:::<bucket-name>"
]
]
我在 s3 存储桶上使用此策略
"Id": "Policy************",
"Version": "2012-10-17",
"Statement": [
"Sid": "Stmt********",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectTagging",
"s3:PutObjectVersionAcl",
"s3:PutObjectVersionTagging"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::<bucket-name>/*",
"Principal":
"AWS": [
"arn:aws:iam::*********:role/<lambda-function-name>"
]
]
【讨论】:
我认为这不应该是<lambda-function-name>
,而是角色名称,或者换句话说,只是完整的角色arn。
我只需要第 2 步和第 3 步就能让它工作。当然,这假设您有一个现有的存储桶(第 1 步)和现有的函数(第 4 步)。如果执行角色已被授予对存储桶的权限,我认为不需要第 5 步。对于我的用例,我需要读取和写入存储桶,所以我有两个语句,一个带有 "Action": ["s3:ListBucket"] 和一个带有 "Action": "s3:*Object" 以允许 Get 和提出行动。以上是关于允许 Lambda 的 S3 策略的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 lambda 函数在尝试访问 S3 存储桶时会被拒绝访问?