AWS CFN Lambda не отправляет все сообщения в SQS

#aws-lambda #amazon-cloudformation #amazon-sqs

Вопрос:

Я новичок в AWS cloudformation, и у меня проблема с моими стеками. У меня они работали, но где-то что-то пошло не так.

Как будто у меня есть стек ArtifactBucket с файлами zip для моего .Основные лямбды сети и ключ пользователя, роли и KMS IAM.

У меня есть этот основной стек, в котором есть Creator lambda , который отправит сообщение в SQS Queue . Функция процессора получит это сообщение и отправит его в SNS, который затем отправит мне электронное письмо (см. подписку).

Все это прекрасно развертывается в консоли AWS, но я обнаружил, что, когда я вызываю лямбду, мне нужно вызвать ее несколько раз, прежде чем я получу сообщение, и некоторые из сообщений будут потеряны. Например.. Я отправлю 5 сообщений одно за другим и получу только 4 сообщения.

Я подозреваю, что это проблема с таймаутом на лямбде и в очереди, но я изо всех сил пытаюсь определить ее.

Заметили ли вы что-нибудь очевидное, чего мне либо не хватает в этом основном шаблоне, или есть проблема со свойствами очереди и значениями времени лямбда?

    "DelaySeconds" : 0,
   "MessageRetentionPeriod" : 900,
   "ReceiveMessageWaitTimeSeconds" : 5,
   "VisibilityTimeout" : 120,
 

стек-шаблон:

 {
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "Template to create IntergrationQueue, Intergrator and use storage bucket",
  "Parameters": {
    "ArtifactBucketName": {
      "Type": "String"
    },
    "StorageBucketArn": {
      "Type": "String"
    },
    "JogDayIAMUserArn": {
      "Type": "String"
    },
    "JogDayIAMRoleArn": {
      "Type": "String"
    },
    "JogDayKMSKeyArn": {
      "Type": "String"
    }
  },
  "Resources": {  
    "DLQ": {
      "Type": "AWS::SQS::Queue",
      "DeletionPolicy": "Delete",
      "Properties": {
        "KmsMasterKeyId": {
          "Ref": "JogDayKMSKeyArn"
        }
      }
    },
    "Queue": {
      "Type": "AWS::SQS::Queue",
      "DeletionPolicy": "Delete",
      "DependsOn": "DLQ",
      "Properties": {
        "QueueName": "JogDayQueue",
        "DelaySeconds" : 0,
        "MessageRetentionPeriod" : 900,
        "ReceiveMessageWaitTimeSeconds" : 5,
        "VisibilityTimeout" : 120,
        "RedrivePolicy": {        
          "deadLetterTargetArn": {
            "Fn::GetAtt": [
              "DLQ",
              "Arn"
            ]
          },
          "maxReceiveCount" : 10          
        },
        "KmsMasterKeyId": {
          "Ref": "JogDayKMSKeyArn"
        },
        "Tags": [
          {
            "Key": "jogday",
            "Value": "jogday"
          }
        ]
      }
    },
    "JogDayTopic": {
      "Type": "AWS::SNS::Topic",      
      "DeletionPolicy": "Delete",
      "Properties": {
        "DisplayName": "JogDay topic",
        "KmsMasterKeyId" : {"Ref":"JogDayKMSKeyArn"},        
        "TopicName" : "JogDayEmailTopic",      
        "Tags": [
          {
            "Key": "jogday",
            "Value": "jogday"
          }
        ]
      }
    },
    "JogDayQueuePolicy": {
      "Type": "AWS::SQS::QueuePolicy",
      "Description" : "Intergration Queue Policy",
      "DependsOn" : ["Queue","CreatorLambdaFunction"],
      "DeletionPolicy" : "Delete",      
      "Properties": {      
        "Queues": [{ "Ref":"Queue" }],        
        "PolicyDocument": {
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": "sns.amazonaws.com"
              },
              "Action": [
                "SQS:SendMessage",
                "SQS:ReceiveMessage"
              ],
              "Resource": {
                "Fn::GetAtt": [
                  "Queue",
                  "Arn"
                ]
              },
              "Condition": {
                "ArnEquals": {
                  "aws:SourceArn":{
                    "Fn::GetAtt": [
                      "CreatorLambdaFunction",
                      "Arn"
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    },
    "JogDaySubscription": {
      "Type": "AWS::SNS::Subscription",      
      "DeletionPolicy": "Delete",
      "Properties": {      
        "TopicArn": {
          "Ref": "JogDayTopic"
        },
        "Endpoint": "some.email@gmail.com",
        "Protocol": "email"
      },
      "DependsOn": [
        "JogDayTopic"
      ]
    },
    "CreatorLambdaFunction": {
      "Type": "AWS::Lambda::Function",
      "DeletionPolicy": "Delete",    
      "Properties": {
        "Runtime": "dotnetcore3.1",
        "FunctionName": "CreatorFunction",
        "Description": "Function that will take a message and send it to a SQS queue",
        "Code": {
          "S3Bucket": {
            "Ref": "ArtifactBucketName"
          },
          "S3Key": "CreatorFunction.zip"
        },
        "Handler": "CreatorFunction::CreatorFunction.Function::FunctionHandler",
        "Role": { "Ref": "JogDayIAMRoleArn" },
        "DeadLetterConfig": {
          "TargetArn": {
            "Fn::GetAtt": [
              "DLQ",
              "Arn"
            ]
          }
        },        
        "Tags": [
          {
            "Key": "jogday",
            "Value": "jogday"
          }
        ],
        "Timeout": 120,        
        "KmsKeyArn": {
          "Ref": "JogDayKMSKeyArn"
        },
        "Environment": {
          "Variables": {
            "QueueName": {
              "Fn::GetAtt": [
                "Queue",
                "QueueName"
              ]
            },
            "DLQName": {
              "Fn::GetAtt": [
                "DLQ",
                "QueueName"
              ]
            }
          }
        }
      }
    },
    "CreatorLambdaFunctionInvokePermission": {
      "Type": "AWS::Lambda::Permission",
      "DeletionPolicy": "Delete",
      "Properties": {
        "FunctionName": {
          "Fn::GetAtt": [
            "CreatorLambdaFunction",
            "Arn"
          ]
        },
        "Action": "lambda:InvokeFunction",
        "Principal": {
          "Ref": "JogDayIAMUserArn"
        },
        "SourceAccount": {
          "Ref": "AWS::AccountId"
        }
      }
    },
    "ProcessorLambdaFunction": {
      "Type": "AWS::Lambda::Function",
      "DeletionPolicy": "Delete",    
      "DependsOn" : ["Queue","DLQ","JogDayTopic"],
      "Properties": {
        "Runtime": "dotnetcore3.1",
        "FunctionName": "ProcessorFunction",
        "Description": "Function that will receive a message from sqs and send it to sns",
        "Code": {
          "S3Bucket": {
            "Ref": "ArtifactBucketName"
          },
          "S3Key": "ProcessorFunction.zip"
        },
        "Handler": "ProcessorFunction::ProcessorFunction.Function::FunctionHandler",        
        "Role": { "Ref": "JogDayIAMRoleArn" },
        "DeadLetterConfig": {
          "TargetArn": {
            "Fn::GetAtt": [
              "DLQ",
              "Arn"
            ]
          }
        },        
        "Tags": [
          {
            "Key": "jogday",
            "Value": "jogday"
          }
        ],
        "Timeout": 120,
        "KmsKeyArn": {
          "Ref": "JogDayKMSKeyArn"
        },
        "Environment": {
          "Variables": {
            "QueueName": {
              "Fn::GetAtt": [
                "Queue",
                "QueueName"
              ]
            },
            "DLQName": {
              "Fn::GetAtt": [
                "DLQ",
                "QueueName"
              ]
            },
            "JogDayTopicArn": {"Ref" : "JogDayTopic" },         
            "JogDayTopicName": {
              "Fn::GetAtt": [
                "JogDayTopic",
                "TopicName"
              ]
            }       
          }
        }
      }
    },
    "ProcessorLambdaFunctionInvokePermission": {
      "Type": "AWS::Lambda::Permission",
      "DeletionPolicy": "Delete",
      "Properties": {
        "FunctionName": {
          "Fn::GetAtt": [
            "ProcessorLambdaFunction",
            "Arn"
          ]
        },
        "Action": "lambda:InvokeFunction",
        "Principal": {
          "Ref": "JogDayIAMUserArn"
        },
        "SourceAccount": {
          "Ref": "AWS::AccountId"
        }
      }
    },
    "ProcessorLambdaEventSourceMapping": {
      "Type": "AWS::Lambda::EventSourceMapping",
      "DeletionPolicy": "Delete",
      "DependsOn": ["ProcessorLambdaFunction","Queue"],
      "Properties": {
       "BatchSize" : 10,
       "Enabled" : true,
       "EventSourceArn" : {
          "Fn::GetAtt": [
            "Queue",
            "Arn"
          ]
        },
        "FunctionName" : {
          "Fn::GetAtt": [
            "ProcessorLambdaFunction",
            "Arn"
          ]
        }     
      }
    }
  },
  "Outputs": {
    "QueueArn": {
      "Value": {
        "Fn::GetAtt": [
          "Queue",
          "Arn"
        ]
      }
    },
    "DLQArn": {
      "Value": {
        "Fn::GetAtt": [
          "DLQ",
          "Arn"
        ]
      }
    },
    "JogDayTopicName":{
     "Value": {
        "Fn::GetAtt": [
          "JogDayTopic",
          "TopicName"
        ]
      }
    }
  }
}
 

Комментарии:

1. Возможно, проблема в ваших лямбда-функциях, а не в шаблоне.

2. Эй, спасибо за ваш ответ. Насколько я могу судить, лямбды работают нормально. Создатель лямбды просто отправляет сообщения в очередь, и я вижу, что сообщение постоянно оказывается в очереди. Затем функция процессора извлекает сообщения из очереди и отправляет их предположительно в sns…. Многократное нажатие кнопки тестирования в консоли AWS в конечном итоге отправляет сообщения, но не все из них.. Tbh У меня действительно был этот рабочий механизм неделю или две назад, и я возился с чем-то, как вы делаете, затем все это рухнуло, и я сейчас застрял..: -)