我正在尝试从lambda函数向已创建的sqs队列发送消息。当我运行代码时,它实际上停止了执行,aws-sdk没有提供任何反馈。
当手动插入消息时,我还具有从队列读取的功能,我使用相同的代码创建会话。我相信这两种情况都可以使用。
然后,我尝试使用亚马逊提供的代码,但结果是相同的。 https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/sqs-example-receive-message.html
代码上的唯一区别是我如何创建会话。就像我上面提到的那样,这是我在手动将消息插入队列中时阅读消息的相同方法。在该功能上,一切看起来都很完美。
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}
检查cloudwatch的日志执行情况打印 1 , 2 , 3 ,仅此而已。 否 4 ,否 错误和否 5
我在这里做什么错了?
答案 0 :(得分:0)
我有同样的问题。 查看CloudWatch labmda的日志。出现类似
的错误任务在10.01秒后超时
这是Lambda的超时。您没有关于sqs的错误,因为lambda的超时小于svc.SendMessage
内部的http.Client的默认超时(sendMessage只是对aws api的POST请求),并且lambda在得到来自sqs的任何响应之前被终止。在我的情况下,lambda为10秒,http请求为30秒。像这样将LogLevel
添加到aws.Config
:
&aws.Config{
Region: aws.String("eu-central-1"),
LogLevel: aws.LogLevel(aws.LogDebug),
}
,您将在CloudWatch日志中看到此http请求。您还可以将lambda的超时设置为http.Client超时的2-3倍,并且您会在日志中看到重试(默认情况下为3次重试)。
像lambda一样无法解析sqs主机或类似的东西,因为当VPC配置错误时,我会遇到相同的错误。
UPD 解决了问题。如果您在lambda中使用VPC,则应进行特殊配置以从VPC访问SQS。在这里Apache Commons IO