![](/img/trans.png)
[英]AWS SQS on Lambda throws argument must be ArrayBuffer when sending message using SQSClient
[英]Lambda time out on SQS sending message
我設置了一個非常簡單的 Lambda 來向 SQS 發送消息。 Lambda在一個VPC中,有兩個公共su.nets(我不完全了解aws.networking,我只是看到連接到su.nets的路由表有0.0.0.0/0作為路由之一,連接到Inte .net 網關)和一個安全組。 我已經仔細檢查了權限,它們工作正常,因為如果我刪除 Lambda 上的 VPC 設置,它就可以工作。
我嘗試按照文章中的建議創建端點: 從 VPC 發送 SQS ,但 Lambda 超時。
正如SO 解決方案鏈接中所建議的那樣,我嘗試在客戶端中添加 endpoint_url,但這也不起作用。
Lambda 密碼如下:
#Testing SQS push message.
import botocore
import boto3
def main(event, context):
session = boto3.Session()
sqs_client = session.client(
service_name='sqs',
endpoint_url='https://sqs.eu-west-1.amazonaws.com',
)
sqs_client.send_message(
QueueUrl='https://sqs.eu-west-1.amazonaws.com/***********/tutorial-queue-test',
MessageBody='msg sent from '
)
return {}
恢復我的設置我有:
我無法將 Lambda 保留在 VPC 之外,因為我需要使用 EFS,我會將其集成到 Lambda 中。
解決方案:畢竟我成功地正確啟動了 Lambda,我猜這是混合了錯誤的安全組規則,包括 Lambda 和 Endpoint,以及禁用的 VPC private DNS 名稱。 感謝大家的支持。
出於可讀性目的,我總結了使我成功啟動 Lambda 的主要解決方案:
放置在公共 su.net 中的 Lambda 沒有 inte.net 連接,因為它們不能使用 Inte.net 網關。
因此,根據最佳實踐,第一步是將 lambda 置於私有或隔離的 su.net 中。
然后,有兩個選擇:
如果您的 Lambda 需要 inte.net 連接,請添加一個 NAT 網關並添加一條從 Private su.net 到它的路由。 如果你 go 這個路由,你將不需要使用 VPC 端點。
如果您想避免使用 NAT 網關,只需將 lambda 放在隔離的 su.net 中,它將使用您創建的 VPC 端點。
如果端點啟用了私有 DNS,則無需提供自定義endpoint_url
,boto3 將按原樣工作。
如果這不起作用,請驗證端點是否在您的 Lambda 正在使用的 su.net 中創建。 還要驗證您是否已為終結點打開專用 DNS。
另請參閱: 為什么 VPC 中公共 su.net 內的 AWS lambda function 無法連接到 inte.net?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.