首页 > 解决方案 > 无法从 lambda 向 aws sqs 发送消息,并且 aws-sdk 没有返回错误

问题描述

我正在尝试将消息从我的 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 的日志,执行打印 123,仅此而已。没有 4没有 错误没有 5

我在这里做错了什么?

标签: amazon-web-servicesgoaws-sdkamazon-sqsaws-sdk-go

解决方案


我有同样的问题。查看 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


推荐阅读