使用Java从AWS Lambda访问SQS时超时

问题描述

我正在编写一个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秒。

谢谢, 克里斯

解决方法

如果存在权限问题,您将能够收到错误消息,例如访问被拒绝或未授权。看来该功能根本无法与sqs通信(网络超时)。

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

当Lambda函数位于VPC内并且要访问Intenet(在本例中为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