-
Notifications
You must be signed in to change notification settings - Fork 1
/
aws-ec2-scheduler-central.yml
132 lines (118 loc) · 3.78 KB
/
aws-ec2-scheduler-central.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
AWSTemplateFormatVersion: 2010-09-09
Description: 'AWS EC2 Scheduler: Central'
Parameters:
IntervalMinutes:
Type: Number
Description: Enter interval time (in minutes)
MinValue: 1
MaxValue: 1440
Default: 60
ConstraintDescription: must be between 1 and 1,440.
ForceSchedule:
Type: String
Description: Select whether to enforce the tagging
AllowedValues:
- "true"
- "false"
Default: false
ConstraintDescription: must be a valid selection.
ForceStop:
Type: String
Description: Select whether to enforce the tagging
AllowedValues:
- "true"
- "false"
Default: false
ConstraintDescription: must be a valid selection.
SmartStop:
Type: String
Description: Select whether to enforce the tagging
AllowedValues:
- "true"
- "false"
Default: false
ConstraintDescription: must be a valid selection.
S3Bucket:
Type: String
Description: S3 bucket (in the same AWS Region) containing the Lambda code file
ConstraintDescription: must be non-empty.
S3Key:
Type: String
Description: S3 key of the Lambda code file
ConstraintDescription: must be non-empty.
Conditions:
Singular: !Equals [!Ref IntervalMinutes, 1]
Resources:
EC2Scheduler:
Type: AWS::Events::Rule
Properties:
Name: !Ref 'AWS::StackName'
Description: !Join ['', [Rule that triggers every, ' ', !Ref IntervalMinutes, ' ', !If [Singular, minute, minutes]]]
ScheduleExpression: !Join ['', [rate(, !Ref IntervalMinutes, ' ', !If [Singular, minute, minutes], )]]
Targets:
- Id: start-stop-ec2-instances
Arn: !GetAtt StartStopEC2Instances.Arn
Input: !Join ['', ['{ "IntervalMinutes" : ', !Ref IntervalMinutes, ', "ForceSchedule" : ', !Ref ForceSchedule,
', "ForceStop" : ', !Ref ForceStop, ', "SmartStop" : ', !Ref SmartStop, ' }']]
StartStopEC2Instances:
Type: AWS::Lambda::Function
Properties:
Runtime: python3.8
Role: !GetAtt LambdaEC2StartStopInstances.Arn
FunctionName: start-stop-ec2-instances
Handler: lambda_function.lambda_handler
Timeout: 900
Code:
S3Bucket: !Ref S3Bucket
S3Key: !Ref S3Key
StartStopEC2InstancesPermission:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !GetAtt StartStopEC2Instances.Arn
Action: 'lambda:InvokeFunction'
Principal: events.amazonaws.com
SourceArn: !GetAtt EC2Scheduler.Arn
LambdaEC2StartStopInstances:
Type: AWS::IAM::Role
Properties:
RoleName: lambda-ec2-start-stop-instances
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
AutoscalingDescribeUpdateGroup:
Type: AWS::IAM::Policy
Properties:
PolicyName: autoscaling-describe-update-group
Roles:
- !Ref LambdaEC2StartStopInstances
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- autoscaling:DescribeAutoScalingGroups
- autoscaling:UpdateAutoScalingGroup
Resource: '*'
EC2StartStopInstances:
Type: AWS::IAM::Policy
Properties:
PolicyName: ec2-start-stop-instances
Roles:
- !Ref LambdaEC2StartStopInstances
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- ec2:StartInstances
- ec2:StopInstances
- ec2:DescribeInstances
- ec2:DescribeTags
- ec2:DescribeRegions
Resource: '*'