有时需要跨账户访问S3存储桶,既AWS账户B访问账户A的S3存储桶来进行共享。
- 开发环境和生产环境是独立的AWS账户
- 有提供服务的AWS账户,并需要访问其他AWS账户的S3存储桶
在企业内部和企业之间有许多使用S3存储桶的机会,在这里介绍使用IAM Role访问其他AWS账户的S3存储桶的方法。创建后的环境如下。
AWS账户A上的操作
AWS账户A上进行的操作如下。
- 创建侧率SysblogS3Policy
- 创建角色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上进行的操作如下。
- 创建侧率AccessSysblogS3Policy
- 创建角色AccessSysblogS3Role
- 将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语法。