尝试连接到sqs时AWS Lambda超时

时间:2019-10-02 00:59:27

标签: amazon-web-services aws-lambda amazon-sqs

尝试连接SQS时,我的lambda超时。 Lambda具有允许其连接到SQS的作用,但它位于VPC和子网内。该问题的解决方案可能是什么?

我在日志中看到此错误:

[INFO]  2019-10-01T14:29:58.303Z    e8ad5b4e-119a-48c1-b320-1d855c4efb22    Getting SQS queue url from <some_sqs_queue>...
    14:30:16
[CRITICAL]  2019-10-01T14:30:16.743Z    e8ad5b4e-119a-48c1-b320-1d855c4efb22    ## Transmission Error Connect timeout on endpoint URL: "https://us-west-2.queue.amazonaws.com/"

这是相关的代码,可在本地使用,但不适用于lambda:

 sqs = boto3.client(
        'sqs', # region_name="us-west-2",
        aws_access_key_id=credentials.access_key,
        aws_secret_access_key=credentials.secret_key,
        aws_session_token=credentials.token,
        config=Config(connect_timeout=6, read_timeout=10, retries={'max_attempts': 2})
    )

try:
    logger.info(f"Getting SQS queue url from {sqs_queue}...")
    queue_url = sqs.get_queue_url(QueueName=sqs_queue)['QueueUrl']
    # iterate over entries in batches of 10
    for batch in [entries[index:index + sqs_batch_limit] for index in range(0, len(entries), sqs_batch_limit)]:
        logger.info(f"Sending batch of {len(batch)} records to sqs...")
        sqs.send_message_batch(
            QueueUrl=queue_url,
            Entries=batch
        )
        logger.info("Sent batch of records to sqs successful")

它甚至没有得到sqs_queue_url,但它在本地工作。此日志“传输错误连接”错误的可能原因是什么?

1 个答案:

答案 0 :(得分:1)

您可以将AWS Lambda函数“位于VPC和子网内”。

但是,Amazon SQS存在于Internet上,而不存在于VPC中。

因此,您将需要一种方法使Lambda功能访问Internet,或者需要使Amazon SQS在VPC中可用。

选项1:允许AWS Lambda函数访问互联网

未将Lambda函数配置为使用VPC时,它可以直接与Internet通信。但是,将 配置为使用VPC时,它无法直接访问Internet。

相反,推荐的配置是:

  • 将Lambda函数附加到VPC中的专用子网
  • 在公共子网中启动 NAT网关,并更新专用路由表以通过NAT网关发送Internet绑定流量

选项2:使Amazon SQS可在VPC内访问

您可以在VPC中创建Amazon VPC Endpoint for Amazon SQS

  

如果您使用Amazon VPC托管AWS资源,则可以在VPC和Amazon SQS之间建立连接。您可以使用此连接将消息发送到您的Amazon SQS队列,而无需通过公共互联网。