我遇到了連線問題,使用以 Amazon VPC 為基礎的 AWS Lambda 函數時發生錯誤。如何對此問題進行疑難排解?
簡短描述
若您在嘗試以遠端端點或服務為目標執行 Amazon Virtual Private Cloud (Amazon VPC) Lambda 函數時遇到與連線相關的錯誤。此錯誤訊息可能是因為網路連線問題所致。例如,當您嘗試建立 DynamoDB 資料表時發生作業逾時。
解決方案
建立測試函數,並讓其擁有與您要測試之目標函數相同的網路組態。當您無法編輯目標函數,因此無法新增用以進行疑難排解的指令時,此功能非常有用。如需有關如何設定 Lambda 以存取 VPC 的詳細資訊,請參閱設定 Lambda 函數以存取 VPC 中的資源。
以下是一個測試函數的範例:
import socket
def connect_tcp(event, context):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(8)
hostname = "www.amazon.com"
port = 443
server_address = (hostname, port) # Server address and port
try:
IPAddr = socket.gethostbyname(hostname)
print("Hostname: " + hostname)
print("Host IP:" + IPAddr)
print("Attempting to connect ..")
sock.connect(server_address)
sock.shutdown(socket.SHUT_RDWR)
print("connected")
except Exception as e:
print("-- Error --")
print(e)
finally:
sock.close()
在此範例中,通訊端逾時設定為 8 秒,若連線無法在時間內建立,則連線失敗。如有必要,您可以調整逾時時間。
通訊端資料庫是一個執行階段相依項,預設情況下不會與 Python 的執行階段捆綁在一起。將其包含進部署套件中,或與函數相關聯的層中。如需如何使用 Zip 封存檔案部署相依項的資訊,請參閱使用 .zip 封存檔案部署 Python Lambda 函數。如需如何將相依項部署為層的資訊,請參閱搭配 Lambda 函數使用層。
注意: 嘗試複製目標函數的執行階段是最佳實務。測試函數是用 Python 編寫的,但可以將它移值到其他執行階段。
準備好測試函數後,請使用以下步驟進行疑難排解:
- 設定主機名稱和連接埠變數,使其與目標函數嘗試建立連線的變數相同。
- 複製目標函數的網路組態 (子網和安全群組)。
- 設定函數逾時時間以容納一定程度的逾時。最佳實務是確定函數逾時高於通訊端連線逾時,以確保可以連線。
- 執行測試。
如果測試失敗,則可能是連線問題,需要進行調查。如果測試成功,則 Lambda Amazon VPC 環境 (包括安全群組) 與端點之間應該可以連線。在這種情況下,目標函數或目標函數的其他依賴項可能存在問題。
注意: 最佳實務是在與目標函數發生錯誤的子網類似的子網中執行測試函數,因為錯誤可能會涉及多個具有不同路由設定檔的子網。
如果不知道發生錯誤的子網是哪一個,請依照下列步驟變更子網路,以確認發生問題的子網是哪一個:
- 指定第一個子網,並忽略可用性警告,因為您不會將其部署到生產平台。
- 測試函數。
- 指定下一個子網,然後再次測試。
- 重複上一個步驟,直到檢查所有子網為止。