🔍
タグ指定でEC2インスタンスを起動・停止する
概要
起動・停止自体の方法は以下の記事に記載されている通りですが、内容がよくわからなかったので、設定の詳細について調べてみました。
結論
- SystemManagerの機能でタグによる絞込がサポートされているので有効活用しましょう。
- タイトルはEC2ですが、EC2に限らず、RDSやタグをサポートしているリソースであれば一通り操作できそうな感じがあります。
読み解く対象
設定するymlの中身は以下の通りです。
description: StartEC2Instances Using Tags:StartTime
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
StartTime:
type: String
default: 8am
description: (Required) 7am,8am,9am
allowedValues:
- 7am
- 8am
- 9am
AutomationAssumeRole:
type: String
description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
default: ""
mainSteps:
- name: StartEC2Instances
action: aws:executeAwsApi
inputs:
Service: ssm
Api: StartAutomationExecution
DocumentName: AWS-StartEC2Instance
TargetParameterName: "InstanceId"
Targets:
-
Key: tag:StartTime
Values:
- "{{ StartTime }}"
mainStepsの中身を見ていきます。
action
- mainStepsのactionはlambdaやstepfunctionの呼び出し等のあらかじめ決められた処理を実行できます。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-actions.html - 今回指定している、
aws:executeAwsApi
はAWSのAPIを呼び出す処理になります。つまりなんでもできる処理になります。 - ただし公式にも
すべての API オペレーションがテストされているわけではありません。
と記載されているので、利用する際には対応しているかのチェックをしたほうがよさそうです。 - https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-action-executeAwsApi.html
- なお、この処理自体はBoto3で実行しているようです。
input
- Service
- 名前空間を指定します。
- 今回は
ssm
なのでSystemManagerを指定しています。
- Api
- 実行するAPIの名前を指定します。
- 今回は
StartAutomationExecution
なので、start_automation_executionの関数を実行しています。 - https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ssm.html#SSM.Client.start_automation_execution
- この関数では、既に存在するオートメーションを名称を指定して実行します。
- DocumentName
- start_automation_executionの引数です。runbookの名前になります。
-
AWS-StartEC2Instance
なので、AWSがデフォルトで提供しているEC2起動の処理になります。 - (※要ログイン) https://ap-northeast-1.console.aws.amazon.com/systems-manager/documents/AWS-StartEC2Instance/content
- TargetParameterName
- DocumentNameで指定したrunbookのパラメータを指定します
- 対象のrunbookはinstanceIdを指定するので、
InstanceId
を設定しています。
- Targets
- ターゲットの名称を指定します。
-
tag:StartTime
なので、StartTimeのタグがStartTime
を指定しています。
Tagの指定方法はどこにあるのか
-
AWS-StartEC2Instance
の引数はinstanceId
のみです。実際にEventBridgeの画面から対象のSystemManagerを設定する場合はインスタンスIDを直接指定します
-
SystemManagerの画面からでもinstanceIdの指定になります。
-
しかし、記載しているスクリプトではInstanceIdを指定せずにtagのみを指定して動作させています。botoのリファレンスにもTagの記述の仕方はあるものの、絞込として使えるかについて記述がなく、非公式かと疑っていました。
-
SystemManagerのドキュメントを見ていたところ、以下の記述がありました
Amazon Elastic Compute Cloud (Amazon EC2) (中略) などの多くの AWS リソースはタグをサポートしています。タグをターゲットにすることにより、AWS リソースに対するオートメーションをすばやく実行できます。
- また、
例 1: Amazon EC2 インスタンスを再起動するために、キーと値のペアを使用してタグをターゲットにする
が例として挙げられていました。 - コマンドとしては以下の通りです。
aws ssm start-automation-execution \
--document-name AWS-RestartEC2Instance \
--targets Key=tag:Department,Values=HumanResources \
--target-parameter-name InstanceId \
--parameters "AutomationAssumeRole=arn:aws:iam::111122223333:role/AutomationServiceRole"
結論
SystemManagerのstart-automation-execution
が実行するときにTagで対象のInstanceIdを絞込してくれて、InstanceIdの分だけAWS-RestartEC2Instance
を実行していました。
EventBridgeのルールとSystemManagerのrunbook(オートメーション)が混ざっててわかりにくいですが、まとめてすっきりしました。
Discussion