允许从Amazon EC2实例到Amazon S3存储桶的跨账户访问

时间:2020-07-13 09:03:52

标签: amazon-web-services amazon-s3 amazon-cloudformation amazon-iam

我在帐户B中有S3存储桶“ cross-bucket”。现在,我希望帐户A中存在的EC2可以访问帐户B中的存储桶“ cross-bucket”。

我需要使用IAM角色来实现此目的,因为我们不允许创建用户。

我已使用以下模板在帐户B中创建角色

 AWSTemplateFormatVersion : '2010-09-09'
 Description: 'Cross account role for S3'

 Parameters:
   AccountId:
   Type: String
   Description: Account ID of admin account (containing user to allow)

 Resources:
 CrossAccountRole:
Type: AWS::IAM::Role
Properties:
  AssumeRolePolicyDocument:
    Statement:
      - Effect: Allow
        Action: sts:AssumeRole
        Principal:
          AWS:
            - !Sub arn:aws:iam::${AccountId}:root
  Path: /
  Policies:
    - PolicyName: my-s3-delegate
      PolicyDocument:
        Statement:
          - Effect: Allow
            Action:
              - s3:ListBucket
              - s3:GetObject
            Resource: "*"
  RootInstanceProfile: 
Type: "AWS::IAM::InstanceProfile"
Properties: 
  Path: "/"
  Roles: 
      - 
        Ref: "CrossAccountRole"
    

创建此角色后,应如何将其附加到帐户A中存在的实例? 还是我在这里想念什么?

2 个答案:

答案 0 :(得分:2)

创建此角色后,应如何将其附加到帐户A中存在的实例?

您没有将其附加到Acc A中的实例。相反,您在Acc A中创建了一个实例角色。该角色将具有权限,可以从Acc B担任角色

因此,实例角色将具有类似于以下内容的策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "<ARN-of-ROLE-in-ACC-B>"
            }
        }
    ]
}

然后,在实例上运行的任何应用程序都必须使用 sts假定角色实际承担角色并在Acc B中执行操作。

答案 1 :(得分:2)

您的情况是:

  • 帐户A中的Amazon EC2实例
  • 帐户B中的Amazon S3存储桶
  • 您想允许EC2实例访问存储桶

有两种方法可以做到这一点:

选择1:桶策略

只需向帐户B中的存储桶添加存储桶策略,即可授予对EC2实例使用的IAM角色的访问权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ],
            "Principal": {
                "AWS": [
                    "arn:aws:iam::ACCOUNT-A:role/my-ec2-role"
                ]
            }
        }
    ]
}

EC2实例将使用其常规IAM角色凭据访问存储桶。另外,请确保IAM角色已授予使用Amazon S3来访问存储桶的权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-b",
                "arn:aws:s3:::bucket-b/*"
            ]
        }
    ]
}

选项2:承担角色

  • 在帐户B中创建一个具有访问存储桶权限的IAM角色
  • EC2实例上的代码调用IAM角色上的AssumeRole()
  • 使用返回的凭据访问存储桶