2

Не удается настроить AWS Lambda для запуска с помощью Rule-> Trigger как запланированного источника события с использованием CloudFormation (в действительности, используя Troposphere Python). Это стоило мне пару дней, и любая помощь будет оценена по достоинству.AWS Scheduled Event Rule для Lambda не работает в CloudFormation

Вот соответствующий CF JSON сниппет -

 "DataloaderRetrier": { 
     "Properties": { 
      "Code": { 
       "S3Bucket": "mycompanylabs-config", 
       "S3Key": "v3/mycompany-component-loader-lambda-0.5.jar" 
      }, 
      "FunctionName": "DataloaderRetriervitest27", 
      "Handler": "mycompany.ScheduledEventHandler::handleRequest", 
      "MemorySize": 320, 
      "Role": "arn:aws:iam::166662328783:role/kinesis-lambda-role", 
      "Runtime": "java8", 
      "VpcConfig": { 
       "SecurityGroupIds": [ 
        "sg-2f1f6047" 
       ], 
       "SubnetIds": [ 
        "subnet-ec3c1435" 
       ] 
      } 
     }, 
     "Type": "AWS::Lambda::Function" 
    }, 
    "DataloaderRetrierEventTriggerPermission": { 
     "Properties": { 
      "Action": "lambda:InvokeFunction", 
      "FunctionName": { 
       "Fn::GetAtt": [ 
        "DataloaderRetrier", 
        "Arn" 
       ] 
      }, 
      "Principal": "events.amazonaws.com", 
      "SourceAccount": { 
       "Ref": "AWS::AccountId" 
      }, 
      "SourceArn": { 
       "Fn::GetAtt": [ 
        "DataloaderRetrierEventTriggerRule", 
        "Arn" 
       ] 
      } 
     }, 
     "Type": "AWS::Lambda::Permission" 
    }, 
    "DataloaderRetrierEventTriggerRule": { 
     "DependsOn": "DataloaderRetrier", 
     "Properties": { 
      "Description": "Reminding the lambda to read from the retry SQS", 
      "Name": "DataloaderRetrierEventTriggerRulevitest27", 
      "ScheduleExpression": "rate(1 minute)", 
      "State": "ENABLED", 
      "Targets": [ 
       { 
        "Arn": { 
         "Fn::GetAtt": [ 
          "DataloaderRetrier", 
          "Arn" 
         ] 
        }, 
        "Id": "DataloaderRetrierEventTriggerTargetvitest27", 
        "Input": "{\"Hey\":\"WAKE UP!\"}" 
       } 
      ] 
     }, 
     "Type": "AWS::Events::Rule" 
    } 

Функция AWS Lambda показывает нулевые вызовы и события-> Правила Метрика показывает правильное число вызовов, однако все они терпят неудачу. Лямбда показывает триггер в разделе Триггеры, а в правиле отображается лямбда в его триггерных секциях. Они прекрасно соединяются.

Однако, если я вхожу и вручную создаю тот же самый триггер под правилом в веб-консоли, он с радостью начнет отправлять события в Лямбду.

PS - вот код тропосферы:

# DATALOADER RETRIER LAMBDA 
dataloader_retrier = t.add_resource(awslambda.Function(
    "DataloaderRetrier", 
    Code=awslambda.Code(
     "DataloaderRetrierCode", 
     S3Bucket='mycompanylabs-config', 
     S3Key='v3/mycompany-snowplow-loader-lambda-0.5.jar' 
    ), 
    FunctionName=suffix("DataloaderRetrier"), 
    Handler="mycompany.ScheduledEventHandler::handleRequest", 
    MemorySize="320", 
    Role="arn:aws:iam::166662328783:role/kinesis-lambda-role", 
    Runtime="java8", 
    VpcConfig=lambda_vpc_config 
)) 

dataloader_retrier_scheduled_rule = t.add_resource(events.Rule(
    "DataloaderRetrierEventTriggerRule", 
    Name=suffix("DataloaderRetrierEventTriggerRule"), 
    Description="Reminding the lambda to read from the retry SQS", 
    Targets=[events.Target(
     Id=suffix("DataloaderRetrierEventTriggerTarget"), 
     Arn=tr.GetAtt("DataloaderRetrier", "Arn"), 
     Input='{"Hey":"WAKE UP!"}' 
    )], 
    State='ENABLED', 
    ScheduleExpression="rate(1 minute)", 
    DependsOn="DataloaderRetrier" 
)), 

t.add_resource(awslambda.Permission(
    "DataloaderRetrierEventTriggerPermission", 
    Action="lambda:InvokeFunction", 
    FunctionName=tr.GetAtt("DataloaderRetrier", "Arn"), 
    Principal="events.amazonaws.com", 
    SourceAccount=tr.Ref("AWS::AccountId"), 
    SourceArn=tr.GetAtt("DataloaderRetrierEventTriggerRule", "Arn") 
)) 

ответ

3

Вам нужно удалить параметр SourceAccount из вашего AWS::Lambda::Permission ресурса.

Как описано в документации API AddPermission, параметр SourceAccount ограничивает «источник» разрешенного вызова указанным идентификатором учетной записи AWS, например, при указании уведомления о вебе S3 Bucket или CloudWatch.

Однако (и документы, вероятно, следует сделать более ясным по этому вопросу), в случае CloudWatch событий График экспрессии, source на событие является aws.events, а не свой собственный AWS ID счета, поэтому при добавлении этого параметр заставляет событие не запускать функцию Lambda.

+0

спасибо! ты спас меня от шапочного дома. – vivri

 Смежные вопросы

  • Нет связанных вопросов^_^