允许从特定帐户的所有EC2实例访问S3存储桶

时间:2019-05-22 10:16:58

标签: amazon-web-services amazon-s3 amazon-ec2

是否可以通过特定的AWS账户创建的所有实例访问S3存储桶?

我想提供对于客户端下载到其实例应该非常简单的数据。理想情况下,通过AWS ParallelClusterpost_install脚本选项自动完成。

但是,似乎这需要进行大量设置,如AWS在本教程中所述:
https://aws.amazon.com/premiumsupport/knowledge-center/s3-instance-access-bucket/

这对我来说不可行。客户不必创建IAM角色。

我目前想出的最好办法是允许S3存储桶访问特定的AWS账户,然后使用访问密钥:

export AWS_ACCESS_KEY_ID=<key-id>
export AWS_SECRETE_ACCESS_KEY=<secret-key>

aws s3 cp s3://<bucket> . --recursive

不幸的是,这也不理想,因为我想提供即用型AWS Parallelcluster post_install脚本。这些脚本应在群集启动时自动下载所需的数据。

2 个答案:

答案 0 :(得分:1)

  

是否可以通过特定的AWS账户创建的所有实例访问S3存储桶?

是的。这是一个两步过程。总结:
1)在您这一边,存储桶必须信任将要访问它的其他帐户的帐户ID,并且您必须决定允许哪些呼叫。
2)在将要访问存储桶的其他帐户上,必须授权实例使用IAM策略在您的存储桶上运行AWS API调用。

详细信息:

第1步:,让我们完成此过程并将其分解。 在您的存储桶上,您需要配置以下存储桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "111",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT_ID_TO_TRUST:root"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME_HERE/*"
        }
    ]
}

您可以在AWS documentation here中找到更多存储桶策略示例。

警告1::“ arn:aws:iam :: ACCOUNT_ID:root”将信任所有有权连接到另一个AWS账户上您的存储桶的内容。对于您要做什么,这不应该是一个问题,但最好是您完全了解该政策如何预防任何事故。

警告2::请勿授予s3:*-您需要缩小对s3:GetObject等操作的权限。有一个网站可以帮助您生成这些操作政策heres3:*将包含delete个权限,如果使用不当可能会导致令人惊讶的意外。

现在,一旦完成,那就是伟大的工作-这就是您的目标。

步骤2:其他想要读取数据的帐户必须为其启动的ec2实例分配一个实例角色,并且该角色将需要附加一个策略,以授予对存储桶的访问权限。然后,这些实例可以在您的存储桶上运行AWS CLI命令,前提是您的存储桶策略在您这边授权了该调用,而实例策略在他们这边授权了该调用。 需要附加到实例角色的策略应如下所示:

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

请记住,仅因为此策略授予s3:*并不意味着它们可以在您的存储桶中执行任何操作,除非您的存储桶策略中有s3:*才可以。此策略的操作将仅限于您在存储桶策略中对权限进行范围限制的任何内容。

  

这对我来说不可行。客户不必创建IAM角色。

如果他们拥有一个AWS账户,则取决于他们如何选择访问存储桶,只要您定义一个信任其账户的存储桶策略即可,其余的就在他们身上。他们可以创建ec2实例角色并将其授予您的存储桶或IAM用户的权限,并授予其对您的存储桶的访问权限。没关系。

  

我目前想出的最好办法是允许S3存储桶访问特定的AWS账户,然后使用访问密钥:

如果代码将在ec2实例上运行,则使用访问密钥是一种不好的做法,而应使用ec2实例角色。

  

理想情况下,实例启动时通过CloudFormation自动实现。

我认为您的意思是通过instance userdata,您可以通过CloudFormation进行定义。

答案 1 :(得分:0)

您说“客户端不必创建IAM角色”。这是完全正确的。

我认为正在创建供客户端使用的实例。如果是这样,则应该创建一个可以访问所需存储桶的IAM角色。

然后,当您为客户端创建Amazon EC2实例时,将IAM角色关联到该实例。然后,您的客户将能够使用AWS Command-Line Interface (CLI)访问S3存储桶(列出,上传,下载或您在IAM角色中赋予的任何权限)。

如果您希望在首次创建实例时自动下载数据,则可以添加用户数据脚本,该脚本将在实例启动时执行。这样可以将文件从S3下载到实例。