首页 > 解决方案 > 允许从 Amazon EC2 实例跨账户访问 Amazon S3 存储桶

问题描述

我在账户 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"
    

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

标签: amazon-web-servicesamazon-s3amazon-cloudformationamazon-iam

解决方案


你的情况是:

  • 账户 A 中的 Amazon EC2 实例
  • 账户 B 中的 Amazon S3 存储桶
  • 您希望允许 EC2 实例访问存储桶

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

选项 1:存储桶策略

只需将存储桶策略添加到 Account-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:担任角色

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

推荐阅读