简介
Account-A
- 此帐户中有一个S3存储桶(
sample-s3-bucket-in-account-a
) - 此S3存储桶配置为使用
AWS KMS
(SSE-KMS
)进行服务器端加密 - AMS KMS密钥为
aws/s3
(AWS托管密钥) - 存储桶有无存储桶策略
- 此帐户中创建了IAM跨帐户角色(
sample-cross-account-role-4-s3-access-in-account-a
)Account-B
是受信任的实体(信任策略)- 权限策略允许对S3存储桶(
sample-s3-bucket-in-account-a
)执行以下操作:s3:ListBucket
s3:GetBucketLocation
s3:GetObject
- 此帐户中有一个S3存储桶(
Account-B
- 此帐户中有一个EC2实例
- 还有IAM实例配置文件和角色(
sample-iam-role-4-ec2-in-account-b
) - IAM实例配置文件具有承担在
Account-A
中创建的跨帐户角色(sample-cross-account-role-4-s3-access-in-account-a
)的权限 - IAM实例配置文件附加到EC2实例
给定事实
- 我可以使用
aws sts assume-role --role-arn arn:aws:iam::[ACCOUNT-A]:role/sample-cross-account-role-4-s3-access-in-account-a --role-session-name s3-cross-account-access-session
在Account-B
中的EC2实例上生成临时STS凭据。使用这些临时STS凭据,我可以列出Account-A
中S3存储桶中存在的对象 - 我可以在
~/.aws/config
文件中创建一个profile
,并在aws CLI中使用该profile name
来访问Account-A
中S3存储桶中存在的对象(参考:https://aws.amazon.com/premiumsupport/knowledge-center/s3-instance-access-bucket/)
问题
- 我有一个
CodeDeploy
代理在EC2实例上运行 CodeDeploy
代理使用AWS SDK for Ruby
CodeDeploy
代理使用root
权限运行CodeDeploy
代理使用sample-iam-role-4-ec2-in-account-b
实例配置文件/角色(http://169.254.169.254/latest/meta-data/iam/security-credentials/sample-iam-role-4-ec2-in-account-b
)在内部生成STS凭据- 不幸的是,这些临时STS凭据不允许
CodeDeploy
代理从Account-A
中的S3存储桶下载对象 - 日志中存在
Access Denied
错误 - 我可以通过使用S3 bucket策略来实现,但要求使用跨帐户IAM角色
有人能告诉我如何使或配置运行在Account-B
中的CodeDeploy
代理以使用sample-cross-account-role-4-s3-access-in-account-a
而不是sample-iam-role-4-ec2-in-account-b
吗?
我可以通过使用S3存储桶策略来实现,但要求使用跨帐户IAM角色
除非您编写自己的程序,该程序将作为appspec.yml
的一部分运行,否则您无法执行此操作。您的程序必须";手动";承担该角色并获取S3对象。
否则,S3 bucket策略是执行此操作的唯一原因。