代码之家  ›  专栏  ›  技术社区  ›  user389955

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

  •  1
  • user389955  · 技术社区  · 7 年前

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

    aws s3 ls . 但是,专用子网中的两个EC2实例都不能。原因是什么?

    私有子网中的EC2使用一个安全组,该安全组接受来自整个专有网络的流量。

    在任何地方

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

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

    更新:

    1. dest=10.1.0.0/16(myVPC)->目标=本地
    2. dest=pl-68a54001(com.amazonaws.us-west-2.s3)->目标=vpce-26cf344f

    其中#3表示EC2可以通过VPC端点访问S3#添加2是因为ELB位于EC2实例前面,并且必须访问internet。

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

    [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 回复  |  直到 7 年前
        1
  •  5
  •   John Rotenstein    7 年前

    当一个实例具有公共IP地址时,您的解决方案可以工作,但当它具有公共IP地址时,该解决方案不起作用 如果有公共IP地址,则表明该实例实际上位于公共子网中。

    事实上,在“私有子网的路由表”中,您包括这一行:

    2. dest=0.0.0.0/0, target=iGW
    

    公用子网 因为它指向一个互联网网关。

    • A. 公用子网 是具有指向Internet网关的路由表条目的子网
    • 专用子网 是具有路由表的子网

    接下来,似乎您 aws s3 ls 请求未发送到VPC端点。这可能是因为您没有将流量发送到 s3.us-west-2.amazonaws.com

    aws s3 ls --region us-west-2
    

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

        2
  •  5
  •   Ashan    7 年前

    1. VPC endpoints for S3
    2. NAT Gateway

    在这两种方法中,如果您计划只允许从私有子网中的EC2实例访问S3,请为S3配置VPC端点。