Amazon web services Can';t从lambda向aws sqs发送消息,aws sdk未返回任何错误
我试图从lambda函数向已创建的sqs队列发送消息。当我运行代码时,它实际上停止了执行,aws sdk没有提供任何反馈 我还有一个函数,可以在手动插入消息时从队列中读取消息,我使用相同的代码创建会话。我相信这两种情况都可以使用 然后我尝试使用amazon提供的代码,但结果是一样的。 我的代码的唯一区别是如何创建会话。正如我上面提到的,这与我在手动将消息插入队列时读取消息的方式相同。在这个功能上,一切似乎都很完美Amazon web services Can';t从lambda向aws sqs发送消息,aws sdk未返回任何错误,amazon-web-services,go,aws-sdk,amazon-sqs,aws-sdk-go,Amazon Web Services,Go,Aws Sdk,Amazon Sqs,Aws Sdk Go,我试图从lambda函数向已创建的sqs队列发送消息。当我运行代码时,它实际上停止了执行,aws sdk没有提供任何反馈 我还有一个函数,可以在手动插入消息时从队列中读取消息,我使用相同的代码创建会话。我相信这两种情况都可以使用 然后我尝试使用amazon提供的代码,但结果是一样的。 我的代码的唯一区别是如何创建会话。正如我上面提到的,这与我在手动将消息插入队列时读取消息的方式相同。在这个功能上,一切似乎都很完美 func sendToOrderQueue(rID string, c Cour
func sendToOrderQueue(rID string, c Course) error {
log.Println(1)
var err error
sess := session.Must(session.New(&aws.Config{
Region: aws.String("eu-central-1"),
}), err)
svc := sqs.New(sess)
log.Println(2)
url := "https://sqs.eu-central-1.amazonaws.com/XXXXXX/myqueue"
log.Println(3)
result, err := svc.SendMessage(&sqs.SendMessageInput{
DelaySeconds: aws.Int64(10),
MessageAttributes: map[string]*sqs.MessageAttributeValue{
"Title": &sqs.MessageAttributeValue{
DataType: aws.String("String"),
StringValue: aws.String("The Whistler"),
},
"Author": &sqs.MessageAttributeValue{
DataType: aws.String("String"),
StringValue: aws.String("John Grisham"),
},
"WeeksOn": &sqs.MessageAttributeValue{
DataType: aws.String("Number"),
StringValue: aws.String("6"),
},
},
MessageBody: aws.String("Information about current NY Times fiction bestseller for week of 12/11/2016."),
QueueUrl: &url,
})
log.Println(4)
if err != nil {
log.Println("Error", err)
return err
}
log.Println(5, *result.MessageId, err)
return err
}
还有,我的serverless.yaml
service: client
frameworkVersion: ">=1.28.0 <2.0.0"
provider:
name: aws
runtime: go1.x
vpc: ${file(../security.yaml):vpc}
package:
exclude:
- ./**
include:
- ./bin/**
functions:
postFunction:
handler: bin/post
environment:
REDIS_URL: ${file(../env.yaml):environment.REDIS_URL}
HASH_KEY: ${file(../env.yaml):environment.HASH_KEY}
events:
- http:
path: /func
method: post
cors: ${file(../cors.yaml):cors}
服务:客户端
框架版本:“>=1.28.0我也有同样的问题。
查看CloudWatch labmda的日志。出现如下错误
任务在10.01秒后超时
这是lambda的超时。关于sqs,您没有错误,因为lambda的超时小于http.Client insvc.SendMessage
(SendMessage只是对aws api的POST请求)lambda在收到sqs的任何响应之前被终止。在我的例子中,lambda的响应时间为10秒,http请求的响应时间为30秒。将LogLevel
添加到aws.Config
,如下所示:
&aws.Config{
LogLevel:aws.LogLevel(aws.LogDebug),
}
您将在CloudWatch日志中看到此http请求。您还可以将lambda的超时设置为http.Client timeout的2-3倍,并在日志中看到重试(默认情况下为3次重试)
看起来lambda无法解析sqs或类似的主机,因为当VPC配置错误时,我会遇到相同的错误
UPD
修复了该问题。如果您在lambda中使用VPC,它应该具有从VPC访问SQS的特殊配置。请查看此处我也有同样的问题。
查看CloudWatch labmda的日志。出现如下错误
任务在10.01秒后超时
这是lambda的超时。关于sqs,您没有错误,因为lambda的超时小于http.Client insvc.SendMessage
(SendMessage只是对aws api的POST请求)lambda在收到sqs的任何响应之前被终止。在我的例子中,lambda的响应时间为10秒,http请求的响应时间为30秒。将LogLevel
添加到aws.Config
,如下所示:
&aws.Config{
LogLevel:aws.LogLevel(aws.LogDebug),
}
您将在CloudWatch日志中看到此http请求。您还可以将lambda的超时设置为http.Client timeout的2-3倍,并在日志中看到重试(默认情况下为3次重试)
看起来lambda无法解析sqs或类似的主机,因为当VPC配置错误时,我会遇到相同的错误
UPD
修复了该问题。如果您在lambda中使用VPC,它应该具有从VPC访问SQS的特殊配置。请查看此处谢谢-这是一个很大的帮助。我需要确保有一个安全组,该组允许所有流量,而不仅仅是TCP进出。此安全组已分配给我的VPC中的SQS端点。谢谢-这是这是一个很大的帮助。我需要确保有一个安全组,允许所有流量,而不仅仅是TCP,进出。这个安全组被分配到我的vpc中的SQS端点。