使用跨账户角色从账户B中的EC2实例访问账户A中的S3 Bucket



简介

  • 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
  • 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-sessionAccount-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策略是执行此操作的唯一原因。

最新更新