Bla*_*out 1 go amazon-sqs amazon-web-services aws-sdk aws-sdk-go
我正在尝试将消息从我的 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
}
Run Code Online (Sandbox Code Playgroud)
另外,我的 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}
Run Code Online (Sandbox Code Playgroud)
检查 cloudwatch 的日志,执行打印 1 , 2 , 3而没有其他内容。没有 4,没有 错误,没有 5。
我在这里做错了什么?
我有同样的问题。查看 CloudWatch labmda 的日志。有一个错误,如
任务在 10.01 秒后超时
这是 lambda 的超时。您没有关于 sqs 的错误,因为 lambda 的超时小于内部 http.Client 的默认超时svc.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 超时大 2-3 倍,您将在日志中看到重试(默认为 3 次重试)。
看起来 lambda 无法解析 sqs 的主机或类似的东西,因为当 VPC 配置错误时我会遇到相同的错误。
UPD 修复了问题。如果您在 lambda 中使用 VPC,它应该具有特殊配置才能从 VPC 访问 SQS。在这里查看https://docs.aws.amazon.com/en_us/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-sending-messages-from-vpc.html
| 归档时间: |
|
| 查看次数: |
2926 次 |
| 最近记录: |