情報畑でつかまえてロゴ
本サイトは NTTテクノクロスが旬の IT をキーワードに
IT 部門が今知っておきたい最新テクノロジーに関する情報をお届けするサイトです

第 10 回:サーバレスでの EC2 電源管理をプログラミング無しでチャレンジ!【押忍!ソフト道場】

前回の NAT Gatewayに引き続き、今回は EC2 の電源管理による費用削減を考えていきましょう。

第 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")が用意済みなので、今回はこちらを適応しましょう。

ちなみに実施したい構成を簡単に図にすると、以下となります。

awstopic10-01.PNG

上記仕様を元に、定義した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関連の支援業務も兼務。 部署名にクラウドが付いてなくても頑張ります。 自家製チャーシューやほうれん草のおひたし、レトルトを用いない麻婆豆腐など自炊も随時勉強中。