EventBridgeルールを使用して、SSM Automationランブックを定期的に実行する
以下のページで、SSM Automationランブックを実行する方法をご紹介しました。
上記のページでは、ランブックを定期的に実行するために、メンテナンスウィンドウを使用する方法を取り上げました。
今回はEventBridgeルールを使用して、ランブックを定期的に実行することを考えます。
ランブックで実行する内容ですが、上述のページと同様に、EC2インスタンスのAMIを作成することとします。
構築する環境
1つのプライベートサブネット内に2つのEC2インスタンスを作成します。
インスタンスは最新のAmazon Linux 2とします。
インスタンスには、タグを付与し、後述のランブックの対象とします。
SSM Automationランブックを作成します。
ランブックの実行内容ですが、AWSが所有するランブックAWS-CreateImageを実行するものです。
同ブックを実行する対象ですが、特定のタグが付与されているインスタンスとします。
EventBridgeルールを作成します。
定期的(10分に1回)、ランブックを実行するように設定します。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。
https://github.com/awstut-an-r/awstut-fa/tree/main/122
テンプレートファイルのポイント解説
(参考)EC2インスタンス
Resources:
Instance:
Type: AWS::EC2::Instance
Properties:
IamInstanceProfile: !Ref InstanceProfile
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref PrivateSubnet
GroupSet:
- !Ref InstanceSecurityGroup
Tags:
- Key: !Ref TagKey
Value: !Ref TagValue
Code language: YAML (yaml)
タグ設定がポイントです。
タグ情報を使って、SSM Automationランブックの実行対象を指定します。
今回は以下の通りにタグを設定します。
- タグ名:CreateImage
- タグの値:Group1
SSM Automationランブック
Resources:
CreateImageRunbook:
Type: AWS::SSM::Document
Properties:
Content:
assumeRole: "{{AutomationAssumeRole}}"
description: Create an AMI for an EC2 instance with a specific tag.
schemaVersion: "0.3"
parameters:
AutomationAssumeRole:
type: String
description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
default: !GetAtt CreateImageRole.Arn
TagKey:
type: String
description: (Required) The tag key of Instance.
default: !Ref TagKey
TagValue:
type: String
description: (Required) The tag value of Instance.
default: !Ref TagValue
mainSteps:
- name: createImage
action: aws:executeAutomation
maxAttempts: 1
timeoutSeconds: !Ref WaitForSuccessTimeoutSeconds
onFailure: Abort
inputs:
DocumentName: AWS-CreateImage
TargetParameterName: InstanceId
Targets:
- Key: "tag:{{TagKey}}"
Values:
- "{{TagValue}}"
DocumentFormat: YAML
DocumentType: Automation
Name: !Sub "${Prefix}-CreateImageRunbook"
TargetType: /AWS::EC2::Instance
Code language: YAML (yaml)
タグで指定したインスタンスを対象として、AMIを作成するためのSSM Automationランブックを作成します。
ランブックを自作する方法については、以下のページをご確認ください。
ポイントはステップに関する設定です。
actionsプロパティに「aws:executeAutomation」と設定することで、ランブック内から別のランブックを実行することができます。
今回はinputs内のDocumentNameプロパティに「AWS-CreateImage」を指定することで、AMIを作成します。
Tragetsプロパティに先述のタグ情報を、TargetParameterNameに「InstanceId」を指定することで、タグが付与されているインスタンスを対象として、AWS-CreateImageが実行されます。
ランブック用IAMロール
Resources:
CreateImageRole:
Type: AWS::IAM::Role
DeletionPolicy: Delete
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: sts:AssumeRole
Principal:
Service:
- ssm.amazonaws.com
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole
Policies:
- PolicyName: CreateImagePolicy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- tag:GetResources
Resource:
- "*"
Code language: YAML (yaml)
AWS管理ポリシーAmazonSSMAutomationRoleに加えて、インラインポリシーでtag:GetResourcesを許可するように設定します。
EventBridgeルール
Resources:
EventsRule:
Type: AWS::Events::Rule
Properties:
Name: !Sub "${Prefix}-EventsRule"
ScheduleExpression: rate(10 minutes)
State: ENABLED
Targets:
- Arn: !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:automation-definition/${Runbook}:$DEFAULT"
Id: !Ref Runbook
RoleArn: !GetAtt EventsRuleRole.Arn
Code language: YAML (yaml)
ランブックを定期的に実行するために、EventBridgeルールを作成します。
ScheduleExpressionプロパティに「rate(10 minutes)」と指定することで、10分ごとにランブックを実行できます。
Targetsプロパティに、先述のランブックのARN等を指定します。
EventBridgeルール用IAMロール
Resources:
EventsRuleRole:
Type: AWS::IAM::Role
DeletionPolicy: Delete
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: sts:AssumeRole
Principal:
Service: events.amazonaws.com
Policies:
- PolicyName: !Sub "${Prefix}-StartAutomationExecutionPolicy"
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: ssm:StartAutomationExecution
Resource: !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:automation-definition/${Runbook}:$DEFAULT"
- Effect: Allow
Action: iam:PassRole
Resource: !Ref RunbookRoleArn
Code language: YAML (yaml)
インラインポリシーで2つのアクションを許可します。
1つ目はssm:StartAutomationExecutionです。
文字通り、ランブックの実行を許可する内容です。
2つ目はiam:PassRoleです。
先ほど確認したSSM Automationランブック用のIAMロールを、ランブックに渡すためです。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- EC2インスタンス:i-06de272d94a13fcef
- SSM Automationランブック:fa-122-CreateImageRunbook
- EventBridgeルール:fa-122-EventsRule
AWSマネージメントコンソールからSSM Automationランブックを確認します。
ランブックが正常に作成されています。
このランブックを実行するためには、3つのパラメータを指定する必要がありますが、いずれもデフォルト値が設定されていることがわかります。
EventBridgeルールを確認します。
10分ごとにスケジュールされていることがわかります。
ターゲットに先述のランブックが指定されていることも確認できます。
動作確認
1回目のAMI作成
準備が整いましたので、SSM Automationランブックの動作を確認します。
EventBridgeルールに従って、ランブックの実行が開始されました。
1度に3つのAutomationが実行されています。
1番下のAutomation実行の詳細を確認します。
今回作成されたランブックが実行されたことがわかります。
また実行されたステップを見ると、aws:executeAutomationが実行されていることがわかります。
このステップの詳細を確認します。
Input parametersを見ると、所定のタグが付与されているインスタンスを対象として、AWS-CreateImageを実行するものであることがわかります。
このAutomationを実行したことによって、3つのAutomation実行の内、中段のAutomationの実行が開始されたことがわかります。
次はこの中段のAutomationの詳細を確認します。
AWS-CreateImageが実行されたことがわかります。
また実行されたステップを見ると、3つのAutomation実行の内、1番上のAutomationの実行が開始されたことがわかります。
このAutomationの詳細を確認します。
Outputsを見ると、Automationの実行の結果、AMIが作成されたことがわかります。
作成されたAMIとこれに紐づくスナップショットを確認します。
確かに対象のインスタンスのAMIおよびスナップショットが作成されていることがわかります。
このようにEventBridgeルールによって、SSM Automationランブックが自動的に実行されて、タグによって対象に指定されたインスタンスのAMIを作成することができます。
2回目のAMI作成
EventBridgeルールによって、定期的にAMIが作成されることを確認します。
初回の実行からしばらく待機します。
初回から10分後に、2回目のAutomation実行が開始されました。
Automationが実行されて、AMIが作成されました。
作成されたAMIを確認します。
確かにAMIとスナップショットが作成されました。
確かにEventBridgeルールによって、SSM Automationランブックが定期的に自動的に実行されて、タグによって対象に指定されたインスタンスのAMIを作成することができました。
まとめ
EventBridgeルールを使用して、SSM Automationランブックを定期的に実行することによって、AMIを取得する方法を確認しました。