AWS S3桶从EC2的访问方式

20

我需要启动一个 S3 存储桶,以便我的 EC2 实例可以访问并将图像文件存储到其中。EC2 实例需要读/写权限。我不想使 S3 存储桶公开可用,我只想让 EC2 实例可以访问它。

另一个需要注意的问题是,我的 EC2 实例由 OpsWorks 管理,根据负载/使用情况可能会有许多不同的实例被启动。如果我通过 IP 地址进行限制,我可能无法始终知道 EC2 实例的 IP 地址。我能否通过 VPC 进行限制?

我是否必须启用我的 S3 存储桶以进行静态网站托管?我是否还需要使存储桶中的所有文件公开才能使其正常工作?

3个回答

21

您不需要使存储桶公开可读,也不需要使文件公开可读。存储桶及其内容可以保持私有。

不要基于IP地址限制对存储桶的访问,而是基于EC2实例使用的IAM角色进行限制。

  1. 为您的EC2实例创建一个IAM EC2实例角色。
  2. 使用该角色运行您的EC2实例。
  3. 为此IAM角色授予访问S3存储桶的策略。

例如:

{
  "Version": "2012-10-17",
  "Statement":[{
    "Effect": "Allow",
    "Action": "s3:*",
    "Resource": ["arn:aws:s3:::my_bucket",
                 "arn:aws:s3:::my_bucket/*"]
    }
  ]
} 
  1. 如果您想限制对存储桶本身的访问,请尝试使用 S3 存储桶策略。

例如:

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

更多信息:http://blogs.aws.amazon.com/security/post/TxPOJBY6FE360K/IAM-policies-and-Bucket-Policies-and-ACLs-Oh-My-Controlling-Access-to-S3-Resourc


我试图通过VPC进行限制,却完全被锁定在S3桶之外。我不得不在根帐户上创建访问密钥,并使用AWS CLI工具删除存储桶策略。我能否添加第二种访问方式?这样我就可以仍然从公共IP访问存储桶吗? - hiddenicon
我遇到的一个问题是,我正在Apache上进行反向代理,以访问S3存储桶中的图像,如下所示。因此,它必须通过https公开可用。ProxyRequests Off<Proxy *> Order deny,allow Allow from all </Proxy>ProxyPass /images/ http://images.s3-website-us-east-1.amazonaws.com/ - hiddenicon
你如何从EC2实例中调用S3存储桶?有什么示例吗? - user1655072

3

这可以非常简单地完成。 按照以下步骤进行:

  • 在控制台上打开AWS EC2。
  • 选择实例并导航到操作。
  • 选择实例设置,然后选择附加/替换IAM角色。
  • 创建一个新角色并将S3FullAccess策略附加到该角色。

完成后,连接到AWS实例,其余的将通过以下CLI命令完成:

  • aws s3 cp 文件位置/文件名 s3://桶名称

请注意...文件位置是指本地地址。而bucketname是您的存储桶的名称。 还请注意:只有当您的实例和S3 Bucket在同一个账户中时才能进行此操作。 干杯。


2
IAM角色是您的解决方案。
如果EC2实例没有任何角色,请创建一个具有S3访问权限的角色,并将该角色分配给重新构建的实例。

enter image description here

参考:允许 AWS OpsWorks 代表您行事

我正在使用OpsWorks来构建我的实例。不确定这些构建使用哪个IAM角色。我需要检查一下。 - hiddenicon
是的,您可以将角色添加到OpsWorks。 - BMW
当你说“重建”时,你的意思是什么?重新启动它?还是使用相同的设置构建一个全新的实例? - Sam Redway
你需要终止当前实例并创建一个新的。 - BMW
2
为什么您必须终止EC2实例并附加角色?其实不需要这样做。您可以在运行EC2时即时附加角色。 - Barath Ravichander
我在附加了一个不同的IAM角色后重新启动了几次,但没有任何变化。我让它保持开启状态并等待了一天,然后重新启动,但仍然没有变化。最后,我创建了一个新的EC2实例,并立即分配了新的角色,就像@BMW建议的那样,这样就解决了问题。 - Vcoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接