2015-12-18 14 views

Odpowiedz

19

Zastosowanie Aws::Event::Rule z ScheduleExpression i 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" 
     ] 
    } 
    } 
} 
+0

Według dokumentów, w ScheduleExpression musi być wiele minut, a nie minut. http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/ScheduledEvents.html –

+0

@ timmah.faase Nie prawda? "Poprawne wartości: minuta | minuty | godzina | godziny | dzień | dni" – dsvensson

+2

Masz prawo do liczby pojedynczej na "1", np. "1 minuta", ale w przeciwnym razie musi użyć liczby mnogiej, np. "10 minut". Gramatyka jest egzekwowana! – helloPiers

8

Niestety, skonfigurowanie zaplanowanych źródeł zdarzeń dla funkcji lambda nie jest obecnie obsługiwane przez CloudFormation. Będziesz musiał wdrożyć swoją lambdę za pomocą CloudFormation, a następnie ręcznie skonfigurować zaplanowane zdarzenia.

CloudFormation obsługuje typ zasobu AWS::Lambda::EventSourceMapping. Jednak ten zasób ogranicza konfigurowanie strumieni Kinesis lub DynamoDB, więc prawdopodobnie nie jest to pomocne.

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


** Update - od kwietnia 2016 roku, jest obecnie obsługiwane przy użyciu CloudWatch Wydarzenia - https://aws.amazon.com/about-aws/whats-new/2016/04/amazon-cloudwatch-events-now-supported-in-aws-cloudformation-templates/

3

Od tego tygodnia (18 kwietnia 2016) jest obecnie możliwe, aby dodać zaplanowana reguła zdarzenia CloudWatch, która uruchomi twoją funkcję Lambda.

Pole AWS::Event::Rule ma pole ScheduleExpression dla harmonogramu w stylu crona i tablicę Targets, która może przyjmować ARN funkcji Lambda.

5

I rozwiązać ten sam problem.

"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"] } 
    } 
} 
+0

Dziękuję za dodanie pełnego przykładu pracy. – Seamus

+0

W LambdaInvokePermission właściwość SourceAccount zatrzymała działanie dla mnie – jhanson

Powiązane problemy