尝试连接到 sqs 时 AWS Lambda 超时

Jwa*_*622 3 amazon-sqs amazon-web-services aws-lambda

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

\n\n

我在日志中看到此错误:

\n\n
[INFO]  2019-10-01T14:29:58.303Z    e8ad5b4e-119a-48c1-b320-1d855c4efb22    Getting SQS queue url from <some_sqs_queue>...\n\xef\x85\x81    14:30:16\n[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/"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是在本地工作但不能在 lambda 上工作的相关代码:

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

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

它甚至没有得到,sqs_queue_url但它可以在本地工作。导致此日志 Transmission Error Connect 错误的可能原因有哪些?

\n

Joh*_*ein 9

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

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

因此,您需要一种使 Lambda 函数能够访问 Internet 的方法,或者一种使 Amazon SQS 在 VPC 内可用的方法。

选项 1:允许 AWS Lambda 函数访问 Internet

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

相反,推荐的配置是:

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

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

您可以在 VPC 中为 Amazon SQS创建Amazon VPC 终端节点:

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