Не могу отправить сообщение от лямбды на aws sqs, и от aws-sdk не возвращается ошибка - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь отправить сообщение от моей лямбда-функции в очередь sqs, которая уже создана. Когда я запускаю код, он буквально останавливает выполнение, и aws-sdk не предоставляет никакой обратной связи.

У меня также есть функция для чтения из очереди, когда я вставляю сообщения вручную, я использую тот же код для создания сеанса. Который, я считаю, может быть использован в обеих ситуациях.

Затем я попытался использовать код, предоставленный amazon, но результат был тот же. 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}

Проверка журналов облачных часов на выполнение печать 1 , 2 , 3 и ничего больше. Нет 4 , нет Ошибка и нет 5 .

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 13 июня 2019

У меня та же проблема. Посмотрите в логах CloudWatch labmda. Есть ошибка типа

Тайм-аут задачи через 10,01 секунды

Это время ожидания лямбды. У вас нет ошибок в отношении sqs, потому что время ожидания lambda меньше, чем время ожидания по умолчанию для http.Client внутри svc.SendMessage (sendMessage - это просто запрос POST к aws api), и lambda завершается до того, как получит ответ от sqs. 10 секунд для лямбды и 30 секунд для запроса http в моем случае. Добавьте LogLevel к aws.Config как это:

&aws.Config{ Region: aws.String("eu-central-1"), LogLevel: aws.LogLevel(aws.LogDebug), }

и вы увидите этот http-запрос в журналах CloudWatch. Также вы можете установить лямбда-тайм-аут в 2-3 раза больше, чем http.Client timeout, и вы увидите повторы в журналах (3 попытки по умолчанию).

Похоже, что лямбда не может разрешить хост sqs или что-то в этом роде, потому что я получаю те же ошибки, когда VPC настроен неправильно.

UPD Исправлена ​​проблема. Если вы используете VPC в своей лямбде, он должен иметь специальную конфигурацию для доступа к SQS из VPC. Взгляните сюда https://docs.aws.amazon.com/en_us/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-sending-messages-from-vpc.html

...