amazon-web-services - 授予 EC2 实例中的代码访问另一个账户的 S3 存储桶的权限
问题描述
我有两个 AWS 账户:A 和 B。
我上传了一段 Python 代码到账户 A 中运行的 Amazon EC2 实例。我想通过这段 Python 代码将一个对象放入账户 B 的 S3 存储桶中。
我该如何设置?谢谢
解决方案
主要要求是在 Amazon EC2 实例上运行的代码具有允许访问账户 B 中的 Amazon S3 存储桶的凭证。(我假设该存储桶没有打开公共访问权限。)
为在 Amazon EC2 实例上运行的应用程序提供凭证的最佳实践方法是为实例分配 IAM 角色。这将自动向使用 AWS 开发工具包的实例上的应用程序提供一组凭证。(对于 Python,这将是boto3 SDK。)
IAM 角色至少应具有在目标存储桶中使用 Amazon S3 的权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectACL"
],
"Resource": "arn:aws:s3:::example-bucket/*"
}
]
}
但是,虽然这允许账户 A 的 IAM 角色调用账户 B 中的存储桶,但账户 A 无法实际授予对账户 B 资源的访问权限。只有账户 B 可以允许访问账户 B 中的资源。
这听起来可能令人困惑,但是:
- 需要允许账户 A 中的 IAM 角色调用S3,并且
- 账户 B 必须允许账户 A 的角色访问账户 B 中的资源
实现第二个项目符号的最简单方法是将存储桶策略添加到账户 B 中的存储桶,允许账户 A 中的 IAM 角色使用该存储桶的权限。
存储桶策略如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:role/ROLENAME" <-- Change this
},
"Action": [
"s3:PutObject",
"s3:PutObjectACL"
],
"Resource": "arn:aws:s3:::example-bucket/*"
}
]
}
此外,在帐户 B 中创建对象时,使用bucket-owner-full-control
. 将对象的控制权移交给帐户 B。如果不这样做,则帐户 B 将无法访问(甚至删除!)该对象。
因此,在 Python 中,您的代码将类似于:
import boto3
s3_client = boto3.client('s3')
response = s3_client.upload_file(
Filename='/tmp/foo.txt',
Bucket='my-bucket',
Key='foo.txt',
ExtraArgs={'ACL': 'bucket-owner-full-control'}
)
推荐阅读
- python - 我应该使用哪些数据类型作为 redis-py 函数的参数?
- rxjs - Rxjs 间隔不轮询可观察的服务器 API 调用
- ssl - android pie中的握手失败
- excel - IF - AND 函数的结果问题
- jquery - 数据表:如何在 columnDefs 中动态设置“目标”
- javascript - 如何使用最新的 Javascript 合并两个对象,使得一个对象的键映射到另一个对象的值,而第二个对象中没有额外的键?
- excel - 比较包括字符在内的单元格
- vba - VB 在不同工作表中查找某些值
- python - 烧瓶中的可选路由参数是否需要在函数中设置为“无”?
- javascript - 如何重新触发功能(翻译动画)