首页 > 解决方案 > 授予 EC2 实例中的代码访问另一个账户的 S3 存储桶的权限

问题描述

我有两个 AWS 账户:A 和 B。

我上传了一段 Python 代码到账户 A 中运行的 Amazon EC2 实例。我想通过这段 Python 代码将一个对象放入账户 B 的 S3 存储桶中。

我该如何设置?谢谢

标签: amazon-web-servicesamazon-s3amazon-ec2

解决方案


主要要求是在 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'}
)

推荐阅读