有时需要跨账户访问S3存储桶,既AWS账户B访问账户A的S3存储桶来进行共享。

  • 开发环境和生产环境是独立的AWS账户
  • 有提供服务的AWS账户,并需要访问其他AWS账户的S3存储桶

在企业内部和企业之间有许多使用S3存储桶的机会,在这里介绍使用IAM Role访问其他AWS账户的S3存储桶的方法。创建后的环境如下。

AWS账户A上的操作

AWS账户A上进行的操作如下。

  1. 创建侧率SysblogS3Policy
  2. 创建角色SysblogS3Role

创建侧率SysblogS3Policy

在AWS管理页面依次点击 「IAM」 -> 「策略」 -> 创建策略SysblogS3Policy,该策略的内容如下。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowListPutForFrom",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::sys-blog-linkage/from-sysblog/*"
            ]
        },
        {
            "Sid": "AllowListPutForDelForTo",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::sys-blog-linkage/to-sysblog/*"
            ]
        },
        {
            "Sid": "Allowlistbucket",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketVersions"
            ],
            "Resource": [
                "arn:aws:s3:::sys-blog-linkage"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "to-sysblog/*",
                        "from-sysblog/*"
                    ]
                }
            }
        },
        {
            "Sid": "AllowKMSDecrypt",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "*"
        }
    ]
}

该策略的内容如下。

  • ListBucket权限赋予to-sysblog及from-sysblog
  • 可上传文件至from-sysblog
  • 从to-sysblog进行下载及删除
  • S3存储桶使用KMS已进行加密,因此赋予kms:Decrypt及kms:GenerateDataKey权限

创建角色SysblogS3Role

点击「角色」->「创建角色」,开始创建角色SysblogS3Role。

选择在上面创建的SysblogS3Policy策略。

在这里添加标签,也可跳过该步骤。

确认内容无误后,点击「创建角色」。

AWS账户B上的操作

AWS账户B上进行的操作如下。

  1. 创建侧率AccessSysblogS3Policy
  2. 创建角色AccessSysblogS3Role
  3. 将Role绑定到EC2

创建侧率AccessSysblogS3Policy

创建策略AccessSysblogS3Policy,内容如下。

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::<AWS账户A的ID>:role/SysblogS3Role"
    }
}

创建角色AccessSysblogS3Role

接下来创建角色AccessSysblogS3Role。

受信任实体的类型选择EC2.

权限选择在上面创建的AccessSysblogS3Policy。

在这里添加标签,也可跳过该步骤。

确认内容无误后,点击「创建角色」。

将Role绑定到EC2(AWS账户B)

在EC2管理页面,选择该实例后一次点击「操作」->「安全」->「修改IAM角色」后,将角色AccessSysblogS3Role,赋予给该实例。

EC2上访问S3

登录AWS上的EC2,修改该账户的AWS Profile(用户根目录下~/.aws/credentials文件)。
如果用户根目录下不存在.aws文件夹需创建。

# mkdir ~/.aws
# vi credentials
[role-s3-profile]
role_arn = arn:aws:iam::<AWS账户A的ID>:role/SysblogS3Role
credential_source=Ec2InstanceMetadata

创建credential后,确认能够访问AWS账户A的S3存储桶。–profile选项调用在上面设定的role-s3-profile,并获取临时credential,参照AWS账户A的S3存储桶。

# aws s3 ls s3://sys-blog-linkage/to-sysblog/ --profile role-s3-profile

上传本地uploadToS3.txt文件至S3存储桶sys-blog-linkage/from-sysblog/下。

# aws s3 cp ./uploadToS3.txt s3://sys-blog-linkage/from-sysblog/ --profile role-s3-profile

删除S3存储桶里的Todo.txt文件。

# aws s3 ls s3://sys-blog-linkage/to-sysblog/ --profile role-s3-profile
# aws s3 rm s3://sys-blog-linkage/to-sysblog/ToDo.txt --profile role-s3-profile

小结

AWS账户A信任AWS账户B,AWS账户B上使用sts:AssumeRole使用AWS账户A的权限,就能实现使用IAM角色的跨账户访问S3存储桶。其余的跨账户访问S3的访问参照以下URL。

如何提供对 Amazon S3 存储桶中的对象的跨账户访问权限?

使用IAM角色安全地访问其他AWS账户的S3存储桶时,进行操作控制需要理解IAM策略的JSON语法。