如何验证 AWS VPC (S3) 端点是否有效?

M. *_*tki 15 routing amazon-s3 amazon-ec2 amazon-web-services amazon-vpc

我使用 CloudFormation 向我的 VPC 添加了一个 VPC 端点,并允许使用 s3。这些路由在 AWS 控制台中可见,但在 EC2 实例的本地路由表中不可见:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.29.4.129    0.0.0.0         UG    0      0        0 eth0
169.254.169.254 0.0.0.0         255.255.255.255 UH    0      0        0 eth0
172.29.4.128    0.0.0.0         255.255.255.128 U     0      0        0 eth0
Run Code Online (Sandbox Code Playgroud)

如何验证 VPC 中的 EC2 实例实际上使用 S3 的 VPC 终端节点,而不是可用的互联网连接?

M. *_*tki 10

我找到了一种验证 VPC 端点使用情况的方法。

  1. 登录 VPC 中的 AWS EC2 实例
  2. 配置 aws cli 客户端
  3. 运行aws ec2 describe-prefix-lists; 对于Windows PowerShellGet-EC2PrefixList

结果应包含属性中的 VPC 终端节点前缀列表 ID PrefixListId

如需额外验证,您可以将以下策略应用于 S3 存储桶:

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::mybucket"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpc": [
            "vpc-121212"
          ]
        }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

使用您的 vpc ID 而不是 vpc-121212。然后,您应该只能从给定的 VPC 访问 S3 存储桶

  • 这如何证明任何事情或与 AWS 文档相关,以使请求将通过端点放心? (4认同)

Val*_*ler 10

我想直接的方法是实际探测这些路线。

您可以跟踪路由到 s3 并查看 NAT 网关的内部 IP 是否在输出中的任何位置(例如第一跳)。

首先,在控制台中检查 NAT 网关内部 IP 。

设置端点的示例输出 - 未显示网关 IP。这就是你想看到的。

$ traceroute -n -T -p 443 s3.amazonaws.com                                
traceroute to s3.amazonaws.com (52.216.204.93), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  52.216.204.93  0.662 ms  0.668 ms  0.637 ms

Run Code Online (Sandbox Code Playgroud)

不同目的地的示例输出,通过 NAT(见第一跳)

$ traceroute -n -T -p 443 serverfault.com
traceroute to serverfault.com (151.101.129.69), 30 hops max, 60 byte packets
 1  172.20.10.188  0.206 ms  0.147 ms  0.145 ms
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  100.65.13.49  0.956 ms 100.65.13.113  1.253 ms *
 8  52.93.28.209  1.083 ms 52.93.28.231  1.213 ms 52.93.28.235  1.151 ms
 9  100.100.4.38  1.770 ms 100.100.4.46  2.089 ms 100.100.4.36  1.723 ms
10  103.244.50.242  1.136 ms 100.100.4.44  1.702 ms  2.738 ms
11  151.101.129.69  1.013 ms 103.244.50.244  1.745 ms 151.101.129.69  1.142 ms
Run Code Online (Sandbox Code Playgroud)

  • @NoahSparks 是的,它与答案一致。答案基本上是:如果您没有将 VPC IP 视为第一跳,那么一切都很好,它将通过端点;但是如果你看到一个,那么你是 NAT ed 并且端点可能配置错误。这就是文档所表明的。 (2认同)

小智 9

您可以打开 S3 日志记录并检查文件是否是从您的私有 IP 而不是公共 IP 访问的。如果您的日志显示私有 IP 正在访问您已正确配置的存储桶。祝你好运!


小智 6

我建议在没有互联网访问的子网中启动 ec2 实例(允许 IAM 角色列出 s3 存储桶)。

路由表中基本上只有 2 个活动规则(您的 VPC 子网范围和 s3 终端节点)。

连接到实例并运行命令:

aws s3 ls /**
Run Code Online (Sandbox Code Playgroud)

它应该会因超时而失败,因为 boto 默认情况下会创建对全局 s3 url (s3.amazonaws.com) 的请求。

export AWS_DEFAULT_REGION=us-east-1** ## your region here
aws s3 ls /**
Run Code Online (Sandbox Code Playgroud)

应列出 us-east-1 区域中的存储桶(vpc 路由器会将您的请求路由到 s3.us-east-1.amazonaws.com)。