第 10 回:サーバレスでの EC2 電源管理をプログラミング無しでチャレンジ!【押忍!ソフト道場】
前回の NAT Gatewayに引き続き、今回は EC2 の電源管理による費用削減を考えていきましょう。
ソフト道場の「SIerが目利きする。今日から使えるAWSレシピ」 第10回
- 2020年03月26日公開
第 10 回:サーバレスでの EC2 電源管理をプログラミング無しでチャレンジ!【押忍!ソフト道場】
はじめに
こんにちは。NTT テクノクロスの渡邉です。
前回の NAT Gatewayに引き続き、今回は EC2 の電源管理による費用削減を考えていきましょう。 該当する CloudFormation(以下 CFn) のノウハウ探索に手こずった経験も踏まえ、本稿ではサンプルも一部公開します。
具体例を。
ある日、社内の研修管理者から、以下のような依頼が届きました。
- 新入社員向けの技術研修を、来週 1 週間ほど開催したい。さしあたり研修に使う VM(EC2) を AWS 環境に構築して欲しい。
- 起動台数としては、受講者分 50 台弱、講師向け 15 台欲しい。VM イメージ(AMI)は準備済。
- コスト管理上、不要な時間EC2 は停止して欲しい。ただし研修中断のリスクを加味し、スポットインスタンスは利用しなくて良い。
要件を聞き、下記のような検討を行いました。
- 台数こそ多いが、基本的には EC2 の構築で良さそう。類似の依頼に備え、構築手順は CloudFormation でドキュメント化を検討。
- 電源管理は、起動・停止バッチをLambda &CloudWatch Eventsによる Cron 実行する?
2016~2017年あたりは大抵、こういったケースはAPI実行するだけのLambdaを定期実行して対応していましたね。
今回の要件は特定インスタンスの定期的な電源のON/OFFのみ。
AWS Systems Manager Automation(以下 SSM Automation)を利用すれば、既存のLambdaを使い回すまでもなく、そもそもコーディング自体不要なのでは?
ということで今回はCloudWatch Events + AWS SSM Automationで起動・停止を自動化をCFnで実現してみました。
(CFn + )CloudWatch Events + SSM Automation
SSM を軽く調べると、"専用の SSM ドキュメントを記載し、EC2 にパッチ適用やメンテナンスを行う"などと大変そうな印象を受けますが、SSM Automation に関してはAWS が用意したタスクを実行するだけ。 プログラミング不要、かつコスト管理の自動化を手軽に実施できます。
実施したいアクションである"EC2 の起動/停止"についても、対応するタスク("AWS-StartEC2Instance"、"AWS-StopEC2Instance")が用意済みなので、今回はこちらを適応しましょう。
ちなみに実施したい構成を簡単に図にすると、以下となります。
上記仕様を元に、定義したCFnテンプレートが以下となります。
# Cloudformation テンプレートの記述イメージ
# EC2 定義。後述の「CloudWatch Events + SSM」のInputにて参照。
StuInstance01:
Type: "AWS::EC2::Instance" # EC2定義の詳細は割愛
StuInstance02:
Type: "AWS::EC2::Instance" # EC2定義の詳細は割愛
# ~ EC2定義は以下略 ~
# SSMを実行するIAM Roleの記載を抜粋
CronExecutionRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- events.amazonaws.com
Action:
- "sts:AssumeRole"
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole
RoleName: stu-cron-role
# CloudWatch Events + SSM(日本時間18時に、EC2をStop)の記載を抜粋
StuStopEventRule:
Type: AWS::Events::Rule
Properties:
Description: StopEventRule
Name: StuStopEventRule
ScheduleExpression: "cron(0 9 * * ? *)"
State: ENABLED
Targets:
- Arn: !Sub "arn:aws:ssm:${AWS::Region}::automation-definition/AWS-StopEC2Instance:$DEFAULT"
Id: StopEC2Instance01
RoleArn: !GetAtt CronExecutionRole.Arn
Input: !Sub |
{
"InstanceId":[
"${StuInstance01}", "${StuInstance02}", ...
]
}
上記の例では省略しましたが、EC2 起動用の定義は "Stop" を "Start" に置きかえるイメージで作れますよ!
コンソールから CloudWatch Events + SSM Automation を適応させるだけなら、先人たちのノウハウを見つけられますが、CFn に落とし込んだ事例を見つからずEventsのTargets周りが少々泥臭い...... この辺りは、次回への宿題とします。
ちなみに
今回得られたノウハウはこんな感じです。
- SSM Automation + EC2 のサンプルはAWS 公式ブログ(英語)にて、実は具体的に掲載されている。
- マネージドポリシー"AmazonSSMAutomationRole"には EC2 起動/停止の権限が含まれているので、今回の要件ではこれで OK。(注) シビアな権限管理が求められる際はきちんと設計しましょう。
- CloudWatch Events ルールのターゲットに SSM Automation を設定する場合は、"automation-definition"フォーマットの ARN を選択しましょう。コンソールから判別し辛い場合は、AWS が公開するこの辺りも参照。
特に Targets 周りはコンソールでは分からない仕様もあるので、AWS が公開するドキュメントをしっかり読み込むのが大切ですね。
おわりに
研修本番では環境トラブルも無く、期待通りのコストにて無事に終了したようで何よりです。
CFn 化したことで再利用しやすいのもいい感じですね。
それではまた。
AWS基盤上での商用メール配信システムや画像解析処理システム構築経験を持つ。最近ではAWS関連の支援業務も兼務。 部署名にクラウドが付いてなくても頑張ります。 自家製チャーシューやほうれん草のおひたし、レトルトを用いない麻婆豆腐など自炊も随時勉強中。