amazon-web-services - 尝试连接到 sqs 时 AWS Lambda 超时

标签 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 但它在本地工作。这个log Transmission Error Connect error可能是什么原因?

最佳答案

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

但是,Amazon SQS存在于互联网上,不存在于VPC中。

因此,您要么需要一种方法让 Lambda 函数访问 Internet,要么需要一种方法使 Amazon SQS 在 VPC 内可用。

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

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

相反,推荐的配置是:

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

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

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

If you use Amazon VPC to host your AWS resources, you can establish a connection between your VPC and Amazon SQS. You can use this connection to send messages to your Amazon SQS queues without crossing the public internet.

关于amazon-web-services - 尝试连接到 sqs 时 AWS Lambda 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58193986/

相关文章:

python - AWS Lambda 超时

java - 如何模拟 - 从 s3 读取文件

java - 如何使用 Open JDK 11+ 作为自定义运行时执行 AWS lambda?

amazon-web-services - AWS Cognito - 用户池联合与身份池联合

laravel-5 - Lumen 5.1 SQS 队列配置

c++ - 使用 aws-sdk-cpp-sqs 库时遇到 Free() 无效指针

php - 使用作业队列上传到 AWS S3 存储桶

amazon-web-services - 在 AWS CloudFormation 和 Serverless 中组织堆栈和共享资源

amazon-web-services - 如何异步调用 AWS Lambda 函数

amazon-web-services - Lambda 错误未触发 Lambda 目标