はじめに
EC2インスタンスを検証環境と本番環境で分けている場合、検証環境を丸一日起動させたくないときに自動で停止起動を組み込みたい。
使用環境
- VPC
EC2インスタンスを配置するのに必要 - EC2
自動停止・起動する対象 - Systems Manager(SSM)
今回の主役 - Amazon EventBridge
SSMターゲットを紐付けるために必要
やってみた
ドキュメントを作成する
「AWS Systems Manager」を開き、左から「共有リソース」>「ドキュメント」を開きます。
「Create document」から「Automation」をクリックします。
名前を入力して、エディタを開きます。
今回はご自身がわかるように設定してください。
エディタの中身を以下の通りにしました。
パラメータの説明は後述の通りです。
---
description: Exec AWS-StopEC2Instances Tags:Staging
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
Environment:
type: String
default: Staging
description: (Required) Staging or Product
allowedValues:
- Staging
- Product
AutomationAssumeRole:
type: String
description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
default: ""
mainSteps:
- name: StopEC2Instances
action: aws:executeAwsApi
inputs:
Service: ssm
Api: StartAutomationExecution
DocumentName: AWS-StopEC2Instance
TargetParameterName: "InstanceId"
Targets:
-
Key: tag:Environment
Values:
- "{{ Environment }}"
パラメータ | 内容 |
---|---|
description | エディタの概要を書く |
schemaVersion | スキーマのバージョンを書く ★以下の公式ドキュメントを参考にしてみてください SSMドキュメントスキーマの機能と例 |
assumeRole | このオートメーションを実行するロールを持つIAMユーザ(ARN形式)を書く ★記載がなければIAMユーザアカウントの管理者権限で実行される ★今回はパラメータセクション内にある「AutomationAssumeRole」を参照するようにしています ベストプラクティスは以下の公式ドキュメントを参考にしてください 委任管理者を使用して、オートメーションを実行する IAMを使用して、オートメーションのロールを設定する |
Parameters | パラメータを入力する箇所を定義できます 今回はEC2の使用環境を意味する「Environment」と実行する委任ロールが付与された「AutomationAssumeRole」を定義しました 以下の画像を参考にパラメータと反映される箇所をインプットしてみてください。 |
mainSteps | ドキュメントに記載されている実行オブジェクトをステップとして定義されています。 セクションの書き方は以下の公式ドキュメントを参考にしてみてください。 Systems Manager Automationアクションのリファレンス AWS APIオペレーションの呼び出しと実行 StartAutomationExecution ★ドキュメント上には以下の画像のように表示されます。 |
今回はEC2を停止起動するので、停止と起動で1つずつ作りましょう。
動作確認してみる
EC2を停止
作成した停止ドキュメントを選択して、オートメーションを実行します。
「シンプルな実行」で入力パラメータは「Staging」、AssumeRoleは「なし」で実行します。
実行履歴は「変更管理」>「自動化」内で確認できます。
作成したドキュメント内のステップ実行履歴
「AWS-StopEC2Instance」というAWSが所有しているドキュメントを実行した履歴
EC2を起動
作成した起動ドキュメントを選択して、オートメーションを実行します。
Amazon EventBridgeでスケジューリング
Cloudwatch Eventsは古いサービスなので、Amazon EventBridgeで実施します。
サービスを起動して、「イベント」>「ルール」、「ルールを作成」をクリックします。
今回は決まった時間に停止と起動を行いたいので、「スケジュール」タイプのルールタイプを指定します。
スケジュールはCron形式で行います。
※例では、毎日21時に停止する想定です。
書き方は以下の公式ドキュメントを参考にしてください。
スケジュールに従って実行する Amazon EventBridge ルールの作成
ターゲットを作成したSystems Managerオートメーションのドキュメントを指定してあげます。
作成しようとしたら、エラーが発生しました。(22年/4月段階)
理由は、実行ロールを指定する際にEC2を停止・起動するポリシーを持ったIAMロールが必要でした
新規で作成することはできないようですので、IAMポリシー作成後、ロールにアタッチしていきます。
IAMロールとポリシーを作成
まずはEC2の停止・起動のポリシーを作成します。
({Your Instance}はご自身のAWSアカウントIDを入れてください)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:StopInstances",
"Resource": "arn:aws:ec2:*:{Your Instance}:instance/*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "ec2:StartInstances",
"Resource": "arn:aws:ec2:*:{Your Instance}:instance/*"
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": "tag:GetResources",
"Resource": "*"
}
]
}
Systems Managerのオートメーションから実行されるので、専用のIAMロールを作成します。
IAMロールからユースケースを「EC2」選択。
許可ポリシーが以下の画像を参照。
再びEventBridgeに戻ってきた
最後に
EventBridgeからSSMオートメーションが起動され、EC2インスタンスが停止・起動とされればOKです。
実行履歴はCloudTrailからも確認することができます。
実行しない場合は以下の理由が考えられますので、切り分けの参考としてください。
- EC2のタグがドキュメントのパラメータセクションと紐づいていない
- イベントが有効にされていない
- イベントスケジュールの設定が誤っている(基準時刻がローカルタイムゾーンとなっているとか)