另一个账户中来自 Lambda 的 AWS 跨账户 S3 PutObject
Posted
技术标签:
【中文标题】另一个账户中来自 Lambda 的 AWS 跨账户 S3 PutObject【英文标题】:AWS CrossAccount S3 PutObject from Lambda in another account 【发布时间】:2020-07-31 13:57:52 【问题描述】:我正在尝试将账户 A 中的 Lambda 中的文本文件放入账户 B 中的 S3 存储桶中。S3 存储桶(测试存储桶)启用了 AWS-KMS 加密。我添加了以下权限:
将以下存储桶策略添加到账户 B 中的 S3 存储桶:
"Version": "2012-10-17",
"Id": "ExamplePolicy",
"Statement": [
"Sid": "ExampleStmt",
"Effect": "Allow",
"Principal":
"AWS": "arn:aws:iam::AccountA:role/Lambda-Role"
,
"Action": "s3:*",
"Resource": "arn:aws:s3:::test-bucket/*"
]
在 KMS 密钥中添加了以下策略:
"Version": "2012-10-17",
"Id": "key-default-1",
"Statement": [
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal":
"AWS": "arn:aws:iam::AccountB:root"
,
"Action": "kms:*",
"Resource": "*"
,
"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal":
"AWS": "arn:aws:iam::AccountA:role/Lambda-Role"
,
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
]
在账户 A 的内联策略下方添加 - Lambda 角色并授予对 KMS 密钥的访问权限:
"Version": "2012-10-17",
"Statement": [
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:GenerateDataKey",
"kms:DescribeKey",
"kms:ReEncrypt*"
],
"Resource": [
"arn:aws:kms:us-west-2:AccountB:key/KMS-ID"
]
]
文件也在账户 B S3 存储桶中上传,但无法查看/下载任何这些文件。得到这个错误:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>5H3KEXCJ7YSCJS</RequestId>
<HostId>hqwavZZo6D0asdddcvfff+prEtoBCwTFH0AYtzzzzzztqAaPflzs85aaaaa=</HostId>
</Error>
当我检查它具有的文件属性时:服务器端加密 - 拒绝访问。 不知道我在这里错过了什么。有人请指导。
【问题讨论】:
【参考方案1】:账户 A 中缺少的一件事 - Lambda 角色是 - 即使账户 B 中的存储桶策略允许,它也应该有权访问账户 B 中的存储桶。
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::AccountABucketName"
"arn:aws:s3:::AccountABucketName/*"
]
]
要列出存储桶中的文件,您还应该添加"Resource": "arn:aws:s3:::test-bucket
【讨论】:
我可以将文件上传到账户 B S3 存储桶中。但是当我尝试手动下载该文件时,出现 AccessDenied 错误【参考方案2】:我找到了解决方案。我只需要在 put_object 中添加 ACL='bucket-owner-full-control'。下面是完整的 boto3 cmd。
s3.put_object(
ACL='bucket-owner-full-control'
Body=processed_content,
Bucket=processed_bucket,
Key=processed_key)
【讨论】:
另外,本指南描述了您的解决方案:aws.amazon.com/premiumsupport/knowledge-center/…以上是关于另一个账户中来自 Lambda 的 AWS 跨账户 S3 PutObject的主要内容,如果未能解决你的问题,请参考以下文章
AWS CodePipeline 错误:不允许跨账户传递角色
AWS CloudFormation:如何从另一个AWS账户为Lambda代码指定存储桶?
Amazon S3 在另一个账户中触发另一个 Lambda 函数
我的 aws 角色的信任策略有啥问题,它不能被假定为跨账户?
如何从账户 A 中的 Lambda(VPC 中的 Lambda)调用账户 B 中的 AWS Lambda 函数(VPC 中的这个 Lambda)