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

AWS*_*ner 1 amazon-s3 amazon-web-services aws-cloudformation amazon-iam

我在帐户 B 中有 S3 存储桶“跨存储桶”。现在我希望帐户 A 中存在的 EC2 访问帐户 B 中的此存储桶“跨存储桶”。

我需要使用 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"
    
Run Code Online (Sandbox Code Playgroud)

创建此角色后,我应该如何将其附加到帐户 A 中存在的实例?或者我在这里遗漏了一些东西?

Joh*_*ein 7

您的情况是:

  • 账户 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"
                ]
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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/*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

选项 2:承担角色

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