我正在编写一个lambda函数(在java中),它应该向sqs添加一条消息。
lambda有权访问任何sq(amazonsqsfullacces):
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"sqs:*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
我的代码使用的是标准的sqs客户机:private final 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 timeout现在设置为30秒。
谢谢,克里斯
1条答案
按热度按时间olmpazwi1#
如果存在权限问题,则可能会出现访问被拒绝或未经授权之类的错误。看起来函数根本无法与sqs通信(网络超时)。
专有网络之外的所有lambda功能都应该能够访问互联网上的任何资源。也就是说,这里的lambda函数似乎在专有网络中。
当lambda函数位于专有网络中并且它想要访问intenet(在本例中是sqs)时,lambda函数应该位于专有网络的私有子网中。该子网的默认路由指向该专有网络的公用子网中的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-安全组规则