EC2 无法访问 aws s3,即使它有 IAM 规则可以这样做

use*_*955 1 amazon-s3 amazon-ec2 amazon-web-services amazon-iam

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

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

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

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

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

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
} 
Run Code Online (Sandbox Code Playgroud)

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

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

  1. dest=10.1.0.0/16 (myVPC)->target=local
  2. 目标=0.0.0.0/0,目标=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]: 
Run Code Online (Sandbox Code Playgroud)

Joh*_*ein 6

事实上,您的解决方案在实例具有公共 IP 地址时有效,但在没有公共 IP 地址时无效,这表明该实例实际上位于公共子网中。

事实上,查看“私有子网的路由表”,您可以添加以下行:

2. dest=0.0.0.0/0, target=iGW
Run Code Online (Sandbox Code Playgroud)

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

澄清:

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

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

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

aws s3 ls --region us-west-2
Run Code Online (Sandbox Code Playgroud)

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


Ash*_*han 5

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

  1. S3 的 VPC 终端节点
  2. NAT网关

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