web-dev-qa-db-fra.com

Source d'événements planifiés AWS Lambda via cloudformation

J'ai déjà mon lambda/rôles définis dans cloudformation et j'aimerais également l'utiliser pour ajouter des sources d'événements planifiées ... y a-t-il des documents ou des exemples?

29
grosser

Utilisez Aws :: Event :: Rule avec un ScheduleExpression et un AWS::Lambda::Permission

// rule to periodically call the lambda
"TagWatcherRule": {
  "Type": "AWS::Events::Rule",
  "Properties": {
    "ScheduleExpression": "rate(10 minutes)",
    "Targets": [
      {
        "Id": "TagWatcherScheduler",
        "Arn": {
          "Fn::GetAtt": [
            "TagWatcherFunction",
            "Arn"
          ]
        }
      }
    ]
  }
},
// role may call the lambda
"InvokeLambdaPermission": {
  "Type": "AWS::Lambda::Permission",
  "Properties": {
    "FunctionName": {
      "Fn::GetAtt": [
        "TagWatcherFunction",
        "Arn"
      ]
    },
    "Action": "lambda:InvokeFunction",
    "Principal": "events.amazonaws.com",
    "SourceArn": {
      "Fn::GetAtt": [
        "TagWatcherRule",
        "Arn"
      ]
    }
  }
}
31
grosser

Malheureusement, la configuration des sources d'événements planifiés pour les fonctions lambda n'est actuellement pas prise en charge par CloudFormation. Vous devrez déployer votre lambda à l'aide de CloudFormation, puis configurer manuellement vos événements planifiés.

CloudFormation prend en charge un AWS::Lambda::EventSourceMapping type de ressource. Cependant, cette ressource est limitée dans la configuration des flux Kinesis ou DynamoDB, donc cela ne vous sera probablement pas utile.

http://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html


** Mise à jour - depuis avril 2016, elle est désormais prise en charge à l'aide de CloudWatch Events - https://aws.Amazon.com/about-aws/whats-new/2016/04/Amazon-cloudwatch-events-now -supported-in-aws-cloudformation-templates /

9
Jason

J'ai résolu le même problème.

"RoleForLambdaStopEC2Instances" : {
  "Type": "AWS::IAM::Role",
  "Properties": {
    "AssumeRolePolicyDocument": {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "Service": "lambda.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    },
    "Policies": [
      {
        "PolicyName": "LambdaStopEC2InstancesPolicy",
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ec2:StopInstances"
              ],
              "Resource": [
                "arn:aws:logs:*:*:*",
                "arn:aws:ec2:*"
              ]
            }
          ]
        }
      }
    ],
    "Path": "/"
  }
},
"LambdaStopEC2Instances": {
  "Type": "AWS::Lambda::Function",
  "Properties": {
    "Code": {
      "S3Bucket": "XXXXXXXXXXXXXXXXX",
      "S3Key": "XXXXXXXXXXXXXXXXXX"
    },
    "Handler": "stopEC2Instances.handler",
    "Role": { "Fn::GetAtt" : ["RoleForLambdaStopEC2Instances", "Arn"] },
    "Runtime": "nodejs4.3",
    "Timeout": "5"
  }
},
"StopEC2InstancesRule": {
  "Type" : "AWS::Events::Rule",
  "Properties" : {
    "Name" : "StopEC2Instances",
    "ScheduleExpression" : "cron(0 13 ? * MON-FRI *)",
    "State": "ENABLED",
    "Targets": [{
      "Arn": { "Fn::GetAtt": ["LambdaStopEC2Instances", "Arn"] },
      "Id": "stopEC2Instances"
    }]
  }
},
"LambdaInvokePermission": {
  "Type": "AWS::Lambda::Permission",
  "Properties": {
    "FunctionName" : { "Fn::GetAtt" : ["LambdaStopEC2Instances", "Arn"] },
    "Action": "lambda:InvokeFunction",
    "Principal": "events.amazonaws.com",
    "SourceAccount": { "Ref" : "AWS::AccountId" },
    "SourceArn": { "Fn::GetAtt": ["StopEC2InstancesRule","Arn"] }
  }
}
8
keiwt

Depuis cette semaine (18 avril 2016), il est désormais possible d'ajouter une règle d'événement CloudWatch planifiée qui déclenchera votre fonction Lambda.

AWS :: Event :: Rule possède un champ ScheduleExpression pour la planification de style cron et un tableau Targets qui peut accepter un ARN de fonction Lambda.

4
kiwidrew

AWS prend en charge l'exécution périodique via les sources .

 EventSource: "aws.config"
 MaximumExecutionFrequency: Twelve_Hours
 MessageType: "ScheduledNotification"
1
Ripon Banik