#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 У меня действительно был этот рабочий механизм неделю или две назад, и я возился с чем-то, как вы делаете, затем все это рухнуло, и я сейчас застрял..: -)