AWSTemplateFormatVersion: "2010-09-09"
Description:
IAM Role and SSM Automation Document for Updating AutoScaling AMI.
# ------------------------------------------------------------#
# METADATA
# ------------------------------------------------------------#
Metadata:
"AWS::CloudFormation::Interface":
ParameterGroups:
- Label:
default: "IAM Role: CloudWatch Events executes SSM Automation"
Parameters:
- CloudWatchEventsRoleName
- CloudWatchEventsRolePolicyName
- Label:
default: "IAM Role: SSM Automation updates AutoScalingGroup AMI"
Parameters:
- SSMAutomationRoleName
- SSMAutomationRolePolicyName
ParameterLabels:
CloudWatchEventsRoleName:
default: "IAM Role Name"
CloudWatchEventsRolePolicyName:
default: "IAM Policy Name"
SSMAutomationRoleName:
default: "IAM Role Name"
SSMAutomationRolePolicyName:
default: "IAM Policy Name"
# ------------------------------------------------------------#
# PARAMETERS
# ------------------------------------------------------------#
Parameters:
CloudWatchEventsRoleName:
Type: String
Default: "EventsRoleForExecSSMAutomation"
CloudWatchEventsRolePolicyName:
Type: String
Default: "PolicyForExecSSMAutomation"
SSMAutomationRoleName:
Type: String
Default: "SSMRoleForUpdateAutoScalingGroupAMI"
SSMAutomationRolePolicyName:
Type: String
Default: "PolicyForUpdateAutoScalingGroupAMI"
# ------------------------------------------------------------#
# RESOURCES
# ------------------------------------------------------------#
Resources:
# IAM Role: CloudWatch Events executes SSM Automation
CloudWatchEventsRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Ref CloudWatchEventsRoleName
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- events.amazonaws.com
Action:
- sts:AssumeRole
Policies:
-
PolicyName: !Ref CloudWatchEventsRolePolicyName
PolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Action:
- "ssm:StartAutomationExecution"
- "iam:PassRole"
Resource: "*"
# IAM Role: SSM Automation updates AutoScalingGroup AMI
SSMAutomationRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Ref SSMAutomationRoleName
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- ssm.amazonaws.com
Action:
- sts:AssumeRole
Policies:
-
PolicyName: !Ref SSMAutomationRolePolicyName
PolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Action:
- "autoscaling:CreateLaunchConfiguration"
- "autoscaling:UpdateAutoScalingGroup"
- "ec2:CreateImage"
- "ec2:DescribeImages"
Resource: "*"
# SSM Automation Document
AutomationDocument:
Type: "AWS::SSM::Document"
Properties:
DocumentType: Automation
Content:
description: Automation Document for Updating AMI for AutoScaling Group
schemaVersion: '0.3'
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
AutomationAssumeRole:
type: String
description: "(Optional) The ARN of the role that allows Automation to perform the actions on your behalf."
default: !GetAtt SSMAutomationRole.Arn
InstanceId:
type: String
description: "(Required) Instance id of instance that ami is created from."
LaunchConfigPrefix:
type: String
description: "(Required) Name Prefix of Launch Configuration to create."
AutoScalingGroupName:
type: String
description: "(Required) Name of AutoScaling Group which already exists."
mainSteps:
- name: createImage
action: aws:createImage
inputs:
InstanceId: "{{ InstanceId }}"
ImageName: "{{ InstanceId }}_{{ global:DATE }}"
NoReboot: true
ImageDescription: "{{ InstanceId }}_{{ global:DATE }}"
- name: CreateLaunchConfiguration
action: aws:executeAwsApi
inputs:
Service: autoscaling
Api: CreateLaunchConfiguration
InstanceId: "{{ InstanceId }}"
ImageId: "{{ createImage.ImageId }}"
LaunchConfigurationName: "{{ LaunchConfigPrefix }}_{{ global:DATE }}"
- name: UpdateAutoScalingGroup
action: aws:executeAwsApi
inputs:
Service: autoscaling
Api: UpdateAutoScalingGroup
AutoScalingGroupName: "{{ AutoScalingGroupName }}"
LaunchConfigurationName: "{{ LaunchConfigPrefix }}_{{ global:DATE }}"
# ------------------------------------------------------------#
# OUTPUTS
# ------------------------------------------------------------#
Outputs:
AutomationDocument:
Description: Automation Document Name
Value: !Ref AutomationDocument