2016-08-08 9 views
0

Ich versuche, eine E-Mail-sendende Lambda-Funktion einzurichten, die von einem SNS-Thema in cloudformation ausgelöst wird, aber aus irgendeinem Grund funktioniert es nicht. Ich ging hinein und überprüfte alle Abhängigkeiten/Berechtigungen, nachdem das Lambda & sns ging und alles scheint in Ordnung zu sein, aber wenn ich zu dem Thema veröffentliche passiert nichts. Wenn ich Lambda in der Lambda-Konsole manuell teste, funktioniert es einwandfrei.SNS-Thema löst Lambda nicht aus

Cloudformation

"Resources": { 
    "CloudformationEventHandlerLambdaExecutionRole": { 
     "Type": "AWS::IAM::Role", 
     "Properties": { 
     "Path": "/", 
     "Policies": [ 
      { 
      "PolicyName": "CloudformationTrigger", 
      "PolicyDocument": { 
       "Statement": [ 
       { 
        "Effect": "Allow", 
        "Action": [ 
         "ses:*" 
        ], 
        "Resource": [ 
        "arn:aws:ses:*" 
        ] 
       } 
       ] 
      } 
      } 
     ], 
     "AssumeRolePolicyDocument": { 
      "Statement": [ 
      { 
       "Action": [ 
       "sts:AssumeRole" 
       ], 
       "Effect": "Allow", 
       "Principal": { 
       "Service": [ 
        "lambda.amazonaws.com" 
       ] 
       } 
      } 
      ] 
     } 
     } 
    }, 
    "CloudformationEventHandlerLambdaFunction": { 
     "Type": "AWS::Lambda::Function", 
     "Properties": { 
     "Handler": "lambda_function.lambda_handler", 
     "Role": { 
      "Fn::GetAtt": [ 
      "CloudformationEventHandlerLambdaExecutionRole", 
      "Arn" 
      ] 
     }, 
     "Code": { 
      "S3Bucket": { 
      "Ref": "Bucket" 
      }, 
      "S3Key": "CloudformationEventHandler.zip" 
     }, 
     "Runtime": "python2.7", 
     "Timeout": "30" 
     }, 
     "DependsOn": [ 
     "CloudformationEventHandlerLambdaExecutionRole" 
     ] 
    }, 
    "CloudformationEventHandlerLambdaInvokePermission": { 
     "Type": "AWS::Lambda::Permission", 
     "Properties": { 
     "Action": "lambda:InvokeFunction", 
     "SourceAccount": { 
      "Ref": "AWS::AccountId" 
     }, 
     "Principal": "sns.amazonaws.com", 
     "SourceArn": { 
      "Ref": "CloudformationTopic" 
     }, 
     "FunctionName": { 
      "Fn::GetAtt": [ 
      "CloudformationEventHandlerLambdaFunction", 
      "Arn" 
      ] 
     } 
     } 
    }, 
    "CloudformationTopic": { 
     "Type": "AWS::SNS::Topic", 
     "Properties": { 
      "DisplayName": "CloudformationIngestTopic", 
      "Subscription": [ 
       { 
        "Endpoint": { 
         "Fn::GetAtt": [ 
          "CloudformationEventHandlerLambdaFunction", 
          "Arn" 
         ] 
        }, 
        "Protocol": "lambda" 
       } 
      ] 
     }, 
     "DependsOn": [ "CloudformationEventHandlerLambdaFunction" ] 
    } 
    } 

Python SES Lambda

import boto3 

client = boto3.client('ses') 

def lambda_handler(event, context): 
    message = """ 
     Event: 
     {} 

     Context: 
     {} 
    """.format(event, context) 

    response = client.send_email(
      Source='***censored***', 
      Destination={ 'ToAddresses': [ ***censored***' ] }, 
      Message={ 
        'Subject': { 
          'Data': 'CFMTest' 
         }, 
        'Body': { 
          'Text': { 
            'Data': message 
           } 
         } 
       } 
      ) 

Antwort

1

Die SourceAccount für den AWS::Lambda::Permission Ressourcentyp sollte nur mit Cloudwatch-Protokollen, Cloudwatch Regeln, S3 und SES verwendet werden.
Nachdem ich dieses Feld von der Ressource CloudformationEventHandlerLambdaInvokePermission in Ihrer Vorlage entfernt habe, kann ich die Lambda-Funktion durch Veröffentlichung im SNS-Zweig aufrufen.

Weitere Informationen zu Lambda-Berechtigungen finden Sie in der Dokumentation this

Verwandte Themen