如何解决使用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。