python-3.x - 由 AWS Managed Key 加密的 AWS Cross Account S3 PutObject 中的访问被拒绝问题
问题描述
我正在尝试将来自账户 B 中的 Lambda 的文本文件放入账户 A 中的 S3 存储桶中。S3 存储桶(测试存储桶)正在启用 AWS-KMS 加密并启用了 aws/s3 托管密钥。1.我在Account A-S3 bucket(test-bucket)中添加了以下权限:
```
{"Version": "2012-10-17",
"Id": "ExamplePolicy",
"Statement": [
{
"Sid": "ExampleStmt",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AccountB:role/Lambda-Role"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::test-bucket/*"
}
]
}
- 在账户 B 中为我的 Lambda 执行角色添加了以下内联策略:
{"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:AccountA:key/AWS-KMS-ID" ] } ] }
这是我的 Lambda 代码:
res = s3.put_object(
Body=message,
Key=file_name,
Bucket='test-bucket',
ACL='bucket-owner-full-control'
)
从账户 B Lambda 运行此代码时出现以下错误:
An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
由于 S3 存储桶是由 AWS Managed Key 加密的,所以我无法编辑 KMS 策略,我们在使用 Customer Managed Key 的情况下会做什么。
有人请指导我我错过了什么。
解决方案
尝试授予您的 lambda 函数s3:PutObject
操作权限。所以你的 lambda 角色的内联策略应该是这样的
{
"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:AccountA:key/AWS-KMS-ID"
]
},
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::test-bucket/*"
}
]
}
推荐阅读
- c - 一段时间后,Sendto 失败并出现错误“没有这样的设备或地址”
- angular - 如何将 Angular Material 表列标题及其 mat-cell 内容居中
- groovy - 单个语音标记未添加到数字中
- javascript - 服务内的空属性
- reactjs - 如何测试将使用钩子更改状态值的“onChange”函数
- c# - 直接使用数据源时在DataGridView中显示外键表数据的值
- angular - ng-Option 多 [值]
- javascript - 对 appscript 中的列执行文本并作为表格发送
- java - 是否有 API/代码可以从 kibana 视觉效果、仪表板、图表中获取 id 列表?
- sql - PostgreSQL:获取与最大值关联的日期