AWS Lambda 与 SQS 的连接超时

Ami*_*mar 0 amazon-sqs amazon-web-services amazon-vpc boto3 aws-lambda

我正在处理一项涉及在 VPC 内运行的Lambda 函数 的任务。

此函数应该将消息推送到SQS,并且 lambda 执行角色具有策略:添加了AWSLambdaSQSQueueExecutionRoleAWSLambdaVPCAccessExecutionRole

拉姆达函数:

# 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 秒。但错误不断出现。

如果有人过去遇到过类似的问题,或者想知道如何解决这个问题,请帮帮我。

提前谢谢你。

Jim*_*dan 8

如果您在 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 。


Joh*_*ein 6

当 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 网关时才值得。