【问题标题】:EC2 cannot access aws s3 even it has IAM rule to do that即使有 IAM 规则,EC2 也无法访问 aws s3
【发布时间】:2017-09-03 15:42:38
【问题描述】:

在 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

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

另一个观察:如果我在私有子网中启用分配公共 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]: 

【问题讨论】:

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


    【解决方案1】:

    您的解决方案在实例具有公共 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 端点仅指向配置它的区域。

    【讨论】:

    • 谢谢约翰。 aws s3 ls --region us-west-2 有效!这是否意味着每次我发送 AWSCLI 时,我都需要明确指出 --region。那么为什么公共 EC2 不这样做呢?请注意,我在 us-west-2 中做了所有事情。事实上,我使用 terraform 创建了整个 VPC,我在从 us-west-2 创建的主机上运行它......无论如何,现在可以使用 --region 指示。
    • 谢谢约翰,另一个问题:我将公共路由表用于私有子网,因为它位于 ELB 后面,以便 ELB 将流量分配给它。我了解到的是 ELB 应该在 pub 子网中,并且 ELB 应该与后面的 EC2 在同一个网络中,所以我需要使用公共路由设置 EC2。如果ELB后面的EC2不需要公共路由,请纠正我
    • 您可以使用aws configure 命令默认区域。将区域设置为us-west-2,然后您的所有aws 命令将自动定向到that region's endpoint
    • 只有负载均衡器需要位于公共子网中,因为它需要可从 Internet 访问。如果不需要从 Internet 访问其他实例,则可以将它们放置在私有子网中。 VPC 中的所有子网都可以相互通信,因此实例不需要与负载均衡器位于同一子网中——这通过dest=10.1.0.0/16 (myVPC)->target=local 路由表条目(您无法删除)自动发生。
    • 谢谢约翰。我已经以这种方式配置了区域。看我的更新。一定是因为其他一些原因。并感谢确认 ELB 后面的子网不需要公开。
    【解决方案2】:

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

    1. VPC endpoints for S3
    2. NAT Gateway

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

    【讨论】:

    • ThX Ashan,私有子网的路由表确实有 vpc 端点。 IE。路由表是: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,其中3)表示EC2可以通过VPC端点访问S3。 (2)在EC2前面添加bez ELB必须访问互联网)。另一个观察:如果我在私有子网中启用公共 IP 分配然后启动一个新的 EC2,这个 EC2 可以访问 s3,如果我在私有子网中禁用公共 IP 分配然后启动一个新的 EC2,新的 EC2 将无法访问 s3。
    猜你喜欢
    • 2017-05-27
    • 2018-05-04
    • 2016-04-07
    • 1970-01-01
    • 2019-10-21
    • 2019-10-26
    • 2019-08-15
    • 2018-03-04
    • 2018-09-27
    相关资源
    最近更新 更多