Ami*_*mar 0 amazon-sqs amazon-web-services amazon-vpc boto3 aws-lambda
我正在处理一项涉及在 VPC 内运行的Lambda 函数 的任务。
此函数应该将消息推送到SQS,并且 lambda 执行角色具有策略:添加了AWSLambdaSQSQueueExecutionRole和AWSLambdaVPCAccessExecutionRole。
拉姆达函数:
# Create SQS client
sqs = boto3.client('sqs')
queue_url = 'https://sqs.ap-east-1a.amazonaws.com/073x08xx43xx37/xyz-queue'
# Send message to SQS queue
response = sqs.send_message(
QueueUrl=queue_url,
DelaySeconds=10,
MessageAttributes={
'Title': {
'DataType': 'String',
'StringValue': 'Tes1'
},
'Author': {
'DataType': 'String',
'StringValue': 'Test2'
},
'WeeksOn': {
'DataType': 'Number',
'StringValue': '1'
}
},
MessageBody=(
'Testing'
)
)
print(response['MessageId'])
Run Code Online (Sandbox Code Playgroud)
测试执行结果如下:
{
"errorMessage": "2020-07-24T12:12:15.924Z f8e794fc-59ba-43bd-8fee-57f417fa50c9 Task timed out after 3.00 seconds"
}
Run Code Online (Sandbox Code Playgroud)
我将超时从基本设置增加到 5 秒和 10 秒。但错误不断出现。
如果有人过去遇到过类似的问题,或者想知道如何解决这个问题,请帮帮我。
提前谢谢你。
如果您在 VPC 中的 lambda 中使用 boto3 python 库,并且无法通过 vpc 终端节点连接到 sqs 队列,则必须在创建 sqs 客户端时设置 endpoint_url。第 1900 期描述了这背后的背景。
解决方案如下所示(对于 us-east-1 中的 sqs vpc 端点):
sqs_client = boto3.client('sqs',
endpoint_url='https://sqs.us-east-1.amazonaws.com')
Run Code Online (Sandbox Code Playgroud)
然后正常调用 send_message 或 send_message_batch 。
当 AWS Lambda 函数配置为使用 Amazon VPC 时,它会连接到 VPC 的指定子网。这允许 Lambda 函数与 VPC 内的其他资源进行通信。但是,它无法与 Internet 通信。这是一个问题,因为 Amazon SQS 公共终端节点位于 Internet 上,而该函数由于无法访问 Internet 而超时。
因此,您有 3 个选择:
选项 1:不连接到 VPC
如果您的 Lambda 函数不需要与 VPC 中的资源进行通信(例如您上面提供的简单函数),请不要将其连接到 VPC。当 Lambda 函数未连接到 VPC 时,它可以与 Internet 和 Amazon SQS 公共终端节点通信。
选项 2:使用 VPC 终端节点
VPC 终端节点提供了一种无需通过 Internet 即可访问 AWS 服务的方法。您将为Amazon SQS配置VPC 终端节点。然后,当 Lambda 函数希望连接 SQS 队列时,它可以通过终端节点而不是 Internet 访问 SQS。如果 Lambda 函数需要与 VPC 中的其他资源进行通信,这通常是一个不错的选择。
选项 3:使用 NAT 网关
如果 Lambda 函数配置为使用私有子网,并且在公有子网中配置了NAT 网关,并且私有子网的路由表指向 NAT 网关,则它能够访问 Internet 。这涉及额外费用,并且仅在需要额外的 NAT 网关时才值得。
| 归档时间: |
|
| 查看次数: |
1450 次 |
| 最近记录: |