はじめに
【背景】
コスト削減の為、検証環境にて平日夜間・休日中、
EC2/RDS/Auroraを自動で起動・停止する仕組みを作りました。
【利用サービス】
・SystemsManager(自作ランブック)
各種運用作業を自動化できるサービスです。
ランブックとは、運用作業の内容をYAML又はJSONで記述したものになります。
今回はAWS側で提供している各種起動・停止のランブックを呼び出す形で自作します。
ご参考:ランブックについて
・EventBridge
AWSで発生するイベントを検知、又はスケジューリング機能を使用することで、
様々なAWSサービスの実行トリガーとなるようなサービスです。
今回はスケジューリング機能を使用して、定刻になったら自作ランブックを実行します。
【その他考慮事項】
・起動時
RDS/Auroraの起動後にEC2を起動する必要があった為、
RDS/Auroraのステータス遷移を待つステップにて実現しました。
・停止時
EC2の停止後にRDS/Auroraを停止する必要があった為、
EC2のステータス遷移を待つステップにて実現しました。
SystemsManagerの自作ランブック作成
起動・停止の処理は、SystemsManagerの自作ランブックに記載します。
起動分
コンソールからSystemsManagerの画面に遷移し、左ペイン内の「ドキュメント」を押下します。
ドキュメント一覧画面の右上「Create Document」ボタンを押下し、更に「Automation」を押下します。
ドキュメントの編集画面にて「名前」欄を入力し、「エディタ」タブ内の「編集」を押下します。
ドキュメントエディタにデフォルトでテンプレートが記載されていますが、
全て削除して下記コードをコピペし、右下の「オートメーションを作成する」を押下します。
(ClusterName,DBClusterIdentifier,InstanceIdはサンプルの為、適宜修正してください。)
yaml形式の記述になります。
コードの解説は下記の通りです。
description: 'start instance'
schemaVersion: '0.3'
mainSteps:
- name: StartAuroraCluster
action: 'aws:executeAutomation'
inputs:
DocumentName: AWS-StartStopAuroraCluster
RuntimeParameters:
ClusterName: DB1-cluster
Action: Start
- name: StartRds
action: 'aws:executeAutomation'
inputs:
DocumentName: AWS-StartRdsInstance
RuntimeParameters:
InstanceId: DB2
- name: WaitForAuroraToStart
action: 'aws:waitForAwsResourceProperty'
inputs:
Service: rds
Api: DescribeDBClusters
DBClusterIdentifier: DB1-Cluster
PropertySelector: '$.DBClusters[0].Status'
DesiredValues:
- available
- name: StartEC2
action: 'aws:executeAutomation'
inputs:
DocumentName: AWS-StartEC2Instance
RuntimeParameters:
InstanceId:
- i-xxxxxxxxxxxxxxxxx
「mainSteps:」内に各ステップ(処理)を記載していきます。
-
StartAuroraClusterステップ
'aws:executeAutomation'というアクションを使用して、別のドキュメントを呼出します。
Auroraを起動する為、AWS側が提供しているドキュメント(AWS-StartStopAuroraCluster)を呼出します。
RuntimeParameters内に、呼出すドキュメントに必要なパラメーターを記載します。
必要なパラメーターはAuroraの識別子と、起動・停止の指定になります(起動(Start)を指定しています)。 -
StartRdsステップ
'aws:executeAutomation'というアクションを使用して、別のドキュメントを呼出します。
RDSを起動する為、AWS側が提供しているドキュメント(AWS-StartRdsInstance)を呼出します。
RuntimeParameters内に、呼出すドキュメントに必要なパラメーターを記載します。
必要なパラメーターはRDSの識別子のみになります。 -
WaitForAuroraToStartステップ
'aws:waitForAwsResourceProperty'というアクションを使用して、
「StartAuroraClusterステップ」で起動したAuroraが利用可能ステータスに遷移するのを待機します。
※RDSについてもステータス遷移の監視が必要ですが、
AWS-StartRdsInstance内のステップに組み込まれている為、RDS分については不要になります。 -
StartEC2ステップ
'aws:executeAutomation'というアクションを使用して、別のドキュメントを呼出します。
EC2を起動する為、AWS側が提供しているドキュメント(AWS-StartEC2Instance)を呼出します。
RuntimeParameters内に、呼出すドキュメントに必要なパラメーターを記載します。
必要なパラメーターはEC2のインスタンスIDのみになります。
停止分
上記起動分と同様の手順になる為、コードのみ記載します。
description: 'stop instance'
schemaVersion: '0.3'
mainSteps:
- name: StoptEC2
action: 'aws:executeAutomation'
inputs:
DocumentName: AWS-StopEC2Instance
RuntimeParameters:
InstanceId:
- i-xxxxxxxxxxxxxxxxx
- name: WaitForEC2ToStop
action: 'aws:waitForAwsResourceProperty'
inputs:
Service: ec2
Api: DescribeInstances
InstanceIds:
- i-xxxxxxxxxxxxxxxxx
PropertySelector: '$.Reservations[0].Instances[0].State.Name'
DesiredValues:
- stopped
- name: StopAuroraCluster
action: 'aws:executeAutomation'
inputs:
DocumentName: AWS-StartStopAuroraCluster
RuntimeParameters:
ClusterName: DB1-Cluster
Action: Stop
- name: StopRds
action: 'aws:executeAutomation'
inputs:
DocumentName: AWS-StopRdsInstance
RuntimeParameters:
InstanceId: DB2
「mainSteps:」内に各ステップ(処理)を記載していきます。
-
StoptEC2ステップ
'aws:executeAutomation'というアクションを使用して、別のドキュメントを呼出します。
EC2を停止する為、AWS側が提供しているドキュメント(AWS-StopEC2Instance)を呼出します。
RuntimeParameters内に、呼び出すドキュメントに必要なパラメーターを記載します。
必要なパラメーターはEC2のインスタンスIDのみになります。 -
WaitForEC2ToStopステップ
'aws:waitForAwsResourceProperty'というアクションを使用して、
「StoptEC2ステップ」で停止したEC2が停止済みステータスに遷移するのを待機します。 -
StopAuroraClusterステップ
'aws:executeAutomation'というアクションを使用して、別のドキュメントを呼出します。
Auroraを停止する為、AWS側が提供しているドキュメント(AWS-StartStopAuroraCluster)を呼出します。
RuntimeParameters内に、呼び出すドキュメントに必要なパラメーターを記載します。
必要なパラメーターはAuroraの識別子と、起動・停止の指定になります(停止(Stop)を指定しています)。 -
StopRdsステップ
'aws:executeAutomation'というアクションを使用して、別のドキュメントを呼出します。
RDSを停止する為、AWS側が提供しているドキュメント(AWS-StopRdsInstance)を呼出します。
RuntimeParameters内に、呼び出すドキュメントに必要なパラメーターを記載します。
必要なパラメーターはRDSの識別子のみになります。
SystemsManagerの自作ランブックを手動で実行してみる
停止処理を実行する自作ランブックを手動で実行してみます。
(ログインしているIAMユーザーの権限に起動・停止権限がある前提です。)
ドキュメントの一覧画面の「自己所有」タブ内に、先ほど作成した自作ランブックが存在するはずです。
ドキュメントのタイトルである「Stop-Instance」を押下します。
詳細画面の右上の「オートメーションを実行する」を押下します。
別タブで実行画面が表示されます。
パラメーターの指定はコード内に直書きしていて不要な為、そのまま右下の「実行」を押下します。
実行状況画面にて全てのステップのステータスが"成功"となっていることを確認します。
起動分も上記と同様の手順となる為、実行状況画面のみ記載します。
EventBridgeの設定
手動での稼働確認がとれたので、定刻で自動実行するようにEventBridgeの設定をします。
EventBridge用IAMロール作成
まず、EventBridgeにアタッチするIAMロールを作成します。
コンソールからIAMの画面に遷移し、左ペインの「ポリシー」を押下します。
ポリシー一覧画面にて右上の「ポリシーの作成」を押下します。
ポリシー作成画面にて、「JSON」タブ内の赤枠に下記JSONをコピペします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ec2StartStop",
"Effect": "Allow",
"Action": [
"ec2:RebootInstances",
"ec2:StartInstances",
"ec2:StopInstances"
],
"Resource": "*"
},
{
"Sid": "rdsStartStop",
"Effect": "Allow",
"Action": [
"rds:RebootDBCluster",
"rds:StartDBCluster",
"rds:StopDBCluster",
"rds:RebootDBInstance",
"rds:StopDBInstance",
"rds:StartDBInstance"
],
"Resource": "*"
},
{
"Sid": "other",
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"rds:Describe*",
"cloudwatch:*",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:Encrypt",
"kms:GenerateDataKey*",
"kms:DescribeKey",
"kms:CreateGrant",
"compute-optimizer:GetEC2InstanceRecommendations",
"compute-optimizer:GetEnrollmentStatus"
],
"Resource": "*"
}
]
}
タグの設定は不要の為、そのまま「次のステップ:確認」ボタンを押下します。
次にIAMロールを作成します。
IAM画面にて左ペイン内の「ロール」を押下し、右上の「ロールを作成」ボタンを押下します。
信頼されたエンティティタイプ「カスタム信頼ポリシー」を選択し、赤枠内に下記JSONをコピペします。
右下の「次へ」ボタンを押下します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": [
"events.amazonaws.com",
"ssm.amazonaws.com",
"rds.amazonaws.com",
"ec2.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
先程作成したIAMポリシーと、AmazonSSMFullAccessを選択し、右下の「次へ」ボタンを押下します。
(SystemsManagerへの操作権限として一番強い権限を付与していますが、
必要に応じてカスタムポリシー内に権限を絞って記載することをお薦めします。)
「ロール名」欄を入力し、右下の「ロールを作成」ボタンを押下します。
EventBridge用のIAMロール作成作業は以上です。
EventBridgeのルール作成
事前準備(IAMロール作成)が完了したので、自動実行のトリガーとなるEventBridgeのルールを作成します。
コンソールからEventBridgeの画面に遷移し、左ペイン内の「ルール」を押下します。
ルールの一覧画面にて「ルールを作成」ボタンを押下します。
ルール作成画面にて「名前」欄を入力し、ルールタイプは「スケジュール」を選択します。
その後、「次へ」ボタンを押下します。
平日夜間、及び、土日は停止しておきたいので、
火曜日~土曜日の24:00に停止処理が実行されるように下記の通り設定し、
左下の「次へ」ボタンを押下します。
・スケジュールパターン:特定の時刻
・cron式:(00 15 ? * 2-6 *)
※UTC時刻の為、日本時刻(JST)は設定時刻 + 9時間になります(15+9=24時)。
作成したSystemsManagerの自作ランブック(停止)をターゲットに設定し、
作成したIAMロールを使用するように設定します。
その後、右下の「次へ」ボタンを押下します。
タグの設定は不要なので、そのまま右下「次へ」ボタンを押下します。
最終確認画面に遷移するので、設定内容を確認し、
右下「ルールの作成」ボタンを押下します(画像割愛)。
以上で停止分のEventBridgeの設定は完了です。
そして、EC2/RDS/Auroraの自動起動・停止機能実装作業も全て完了です。
(起動分は同様の手順になる為、割愛します。)
稼働確認
EventBridgeにて設定したスケジュールで自動実行された結果、正常終了しているか確認してみます。
コンソールからSystemsManagerの画面に遷移し、左ペイン内の「自動化」を押下します。
実行状況画面にて作成した処理のステータスが"成功"となっていることを確認します。
おわりに
皆様のコスト削減の参考になれば幸いです。