即使有IAM规则,EC2也无法访问aws s3

时间:2017-09-03 15:42:39

标签: amazon-s3 amazon-ec2 amazon-iam

在VPC中,我有两个子网,一个是具有EC2实例的公有子网,另一个是具有2个EC2实例的私有子网。所有3个EC2实例都具有相同的IAM角色来访问S3。

如果我登录并运行aws s3 ls,公有子网中的EC2实例可以直接访问S3。但是,私有子网中的两个EC2实例都不能。可能是什么原因?

私有子网中的EC2使用接受来自整个VPC的流量的安全组。

公有子网中的EC2使用接受来自 Anywhere 的流量的安全组。

所有3个EC2实例使用相同的路由表,相同的NACL,使用相同的IAM角色,使用策略:

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

如果我在私人子网中的EC2中手动创建凭据配置文件,则可以登录并访问“aws s3 ls”。

更新 私有子网的路由表确实有一个VPC端点。路由表是:

  1. dest = 10.1.0.0 / 16(myVPC) - > target = local
  2. dest = 0.0.0.0 / 0,target = iGW
  3. dest = pl-68a54001(com.amazonaws.us-west-2.s3) - > target = vpce-26cf344f
  4. 其中,#3表示EC2可以通过VPC端点访问S3。添加#2是因为ELB位于EC2实例的前面并且必须访问Internet。

    另一个观察:如果我在私有子网中启用分配公共IP ,然后启动新的EC2实例,则此EC2实例可以访问S3。如果我在私有子网中禁用“分配公共IP”,然后启动新的EC2实例,则新的EC2实例无法访问S3。

    顺便说一句,在运行terraform之前,我已经将区域设置为us-west-2:

    [ec2-user@ip-XXXXX]$ echo $AWS_DEFAULT_PROFILE
    abcdefg
    [ec2-user@XXXXX]$ aws configure --profile abcdefg
    AWS Access Key ID [****************TRM]: 
    AWS Secret Access Key [****************nt+]: 
    Default region name [us-west-2]: 
    Default output format [None]: 
    

2 个答案:

答案 0 :(得分:3)

当实例具有公共IP地址时,您的解决方案可以正常工作,但当具有公共IP地址时,该解决方案无效,这表明该实例实际上位于公有子网中。

确实,查看“私有子网的路由表”,您可以包含以下行:

2. dest=0.0.0.0/0, target=iGW

这使子网成为公共子网,因为它指向Internet网关。

澄清:

  • 公有子网是具有指向Internet网关的路由表条目的子网
  • 私有子网是具有指向Internet网关的路由表的子网

因此,如果您确实希望私有子网属于私有子网,则应从路由表中删除上述条目。

接下来,您aws s3 ls请求似乎没有被发送到VPC端点。这可能是因为您没有向路由表中列出的s3.us-west-2.amazonaws.com发送流量。试试这个命令:

aws s3 ls --region us-west-2

这会将请求发送到将通过VPC端点路由的S3端点。您应该将所有S3命令定向到该区域,因为VPC端点仅指向配置它的区域。

答案 1 :(得分:2)

当您将EC2放置在私有子网,网络级别时,它无法访问S3(不是IAM策略的问题)。要允许从私有子网中的EC2实例对S3进行出站访问,您有以下选项。

  1. VPC endpoints for S3
  2. NAT Gateway
  3. 在这两种方法中,如果您计划仅允许从私有子网中的EC2实例访问S3,请为S3配置VPC端点。