【问题标题】:Timeout when accessing SQS from AWS Lambda using Java使用 Java 从 AWS Lambda 访问 SQS 时超时
【发布时间】:2020-12-11 05:40:45
【问题描述】:

我正在编写一个 Lambda 函数(用 Java 编写),它应该向 SQS 添加一条消息。

Lambda 有权访问任何 SQS (AmazonSQSFullAccess):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sqs:*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

我的代码使用的是标准 SQS 客户端: 私有最终 AmazonSQS sqs = AmazonSQSClientBuilder.standard().withRegion(Regions.EU_NORTH_1).build();

问题是 lambda 在尝试获取队列列表或发送消息时永远不会结束(超时):

ListQueuesResult 结果 = sqs.listQueues();

SendMessageRequest sendMsgRequest = new SendMessageRequest()
        .withQueueUrl(queueUrl)
        .withMessageBody(assetBody)
        .withDelaySeconds(0);
sqs.sendMessage(sendMsgRequest);

我的问题是我是否应该在实例化 sqs 客户端时提供凭据(lambda 是用 terraform 编写的,所以这样做并不容易/很好)还是我做错了什么?

Lambda 超时现在设置为 30 秒。

谢谢, 克里斯

【问题讨论】:

  • 函数是否在 VPC 中运行?
  • 这听起来像是网络超时。您是否将 lambda 放入 vpc 中,如果是,它是否在具有通往外部世界的路由的子网中?我建议不要在 vpc 中运行 lambda,除非它们需要访问内部资源

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


【解决方案1】:

如果存在权限问题,您可能会收到访问被拒绝或未经授权等错误。这看起来该函数根本无法与 sqs 通信(网络超时)。

vpc 之外的所有 lambda 函数都应该能够访问 Internet 上的任何资源。话虽如此,这里的 lambda 函数似乎位于 VPC 内部。

当 lambda 函数位于 VPC 内并且它想要访问互联网(在本例中为 sqs)时,lambda 函数应位于 VPC 的私有子网中。该子网的默认路由指向该 VPC 的公共子网中的 NAT 网关。

https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/

除此检查与 lambda 函数链接的安全组外,它应该有一个出站规则以允许来自所有端口的所有流量。 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2017-04-27
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多