无法从lambda向aws sqs发送消息,并且aws-sdk没有返回错误

时间:2019-05-31 13:13:02

标签: amazon-web-services go aws-sdk amazon-sqs 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                                                                    
  }

另外,我的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

我在这里做什么错了?

1 个答案:

答案 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