Amazon-Web-Services

儘管有正確的 IGW、NAT 和路由表條目,AWS lambda 還是無法訪問網際網路?

  • October 10, 2018

我正在嘗試使用 AWS Lambda,使用一小段程式碼可以從 S3 獲取一些文件。不幸的是,當我將 Lambda 函式放入 VPC 時,我什至無法訪問網際網路資源,儘管我相信 VPC 配置正確。

我有以下程式碼範例,它展示了我正在嘗試做的事情:由於網路問題,urlopen 呼叫只是保持超時(如果我將我的 Lambda 設置在 VPC 之外,它就可以正常工作)。

import json

def lambda_handler(event, context):
   # TODO implement

   import urllib.request
   contents = urllib.request.urlopen("https://api.ipify.org?format=json").read()


   return {
       "statusCode": 200,
       "body": json.dumps( str(contents) )
   }

我已經收集了我的 VPC 等配置,有人可能會發現它周圍的任何問題嗎?我相信我已經避免了基本問題,所以無法訪問網際網路資源讓我非常困惑。

VPC:
   Name: S3 CONNECTION TEST
   VPC ID: vpc-09025133f1b68a1cc
   State: available
   IPv4 CIDR: 10.0.0.0/24

Subnet:
   Name: S3-connection-check-subnet
   Subnet ID: subnet-0e2904283f7b644e3
   State: available
   VPC: vpc-09025133f1b68a1cc | S3 CONNECTION TEST
   Routing Table: rtb-0e0d8951583d0c5ca | S3 CONNECTIVITY check

Internet Gateway:
   Name: S3 connection test
   ID: igw-07aabbe0d979d0ca3
   State: attached
   VPC: vpc-09025133f1b68a1cc | S3 CONNECTION TEST 

NAT Gateway:
   Name: S3 connection test NAT
   ID: nat-06d25cfd034108851
   Status: available
   Status Message: -
   Elastic IP Address: (some valid public IP address)
   Private IP address: 10.0.0.203
   Network interface: eni-0fefa7310a1bcf050
   VPC: vpc-09025133f1b68a1cc | S3 CONNECTION TEST
   Subnet: subnet-0e2904283f7b644e3 | S3-connection-check-subnet

Routing Table:
   Name: S3 CONNECTIVITY check
   Route Table ID: rtb-0e0d8951583d0c5ca
   Explicit association: 1 Subnet
   Main: Yes
   VPC: vpc-09025133f1b68a1cc | S3 CONNECTION TEST

   Routes:
       Route 1:
           Destination: 10.0.0.0/24
           Target: local
           Status: Active
           Propagated: No
       Route 2:
           Destination: 0.0.0.0/0
           Target: nat-06d25cfd034108851
           Status: Active
           Propagated: No

Lambda function:
   Name: Test-S3-Read
   VPC: vpc-09025133f1b68a1cc
   Subnets: subnet-0e2904283f7b644e3 (10.0.0.0/24) | xx-xxxx-xx S3-connection-check-subnet
   Security Groups: sg-0e5ee380770e6e4cd (Allow All) | Allow All

Security Groups:
   Name: sg-0e5ee380770e6e4cd (Allow All) | Allow All
   Inbound rules: 
       Rule 1:
           Type: ALL Traffic
           Protocol: ALL
           Port Range: All
           Source: 0.0.0.0/0
   Outbound rules: 
       Rule 1:
           Type: ALL Traffic
           Protocol: ALL
           Port Range: ALL
           Destination: 0.0.0.0/0      

根據邁克爾的回答,我終於能夠弄清楚這一點。(非常感謝他! :))

由於我一直在努力解決這個問題,我正在捕捉最終的解決方案,以防萬一有人遇到同樣的問題。

我最終使用了三個Subnets、一個Internet Gateway、一個NAT Gateway和兩個不同的Routing tables(除了 VPC 的主路由表):

  • 一個僅使用專用路由表託管 NAT 網關的小型子網

    • 它的路由表包含兩個條目:

      • VPC 特定流量(在我的情況下10.0.0.0/24)被路由到local
      • 其他流量 ( 0.0.0.0/0) 被路由到Internet Gateway
  • 使用另一個路由表託管 Lambda 服務的兩個子網

    • 該路由表包含兩個條目:

      • VPC 特定流量(在我的情況下10.0.0.0/24)被路由到local
      • 其他流量 ( 0.0.0.0/0) 被路由到NAT Gateway

實際上,AWS 文件對此有很好的解釋,查看他們的範例設置圖對我有很大幫助。

引用自:https://serverfault.com/questions/934820