エンジニアブログ

EC2の起動停⽌スケジュール設定で簡単料⾦削減︕

2024年8月2日掲載

導⼊

ソニービズネットワークス 開発本部の樋田です。皆さん、AWS EC2を運用するにあって悩みはありますか?EC2を時間で停止・起動したい、スナップショットを定期的に取得したい等々、色々あると思います。

特にEC2の起動停止については、料金を削減するためにやりたい!と思ってる方が多いんじゃないかと思います。弊社のお客様でもEC2の従量課金というのは、AWS利用料の中でも比重が高い場合が多く、何か料金を削減する方法はないかというご相談をいただくことがあります。

そこで本記事では、EC2の料金を削減するために、起動停止スケジュールの設定方法についてお話ししていきたいと思います。

AWSコンソールでの対応方法

AWSコンソールで起動停止スケジュールを設定したい場合、AWSの公式サイトでは以下の三つの方法を紹介しています。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Stop_Start.html

  • AWS Lambda および Amazon EventBridge ルールを使用する。
  • AWS でインスタンススケジューラを使用する。
  • Amazon EC2 Auto Scalingを利用する。

Auto Scalingは純粋な起動停止スケジュールというよりは、EC2で運用しているシステムの負荷に応じて、適切な台数を起動させておくというものなので、今回の要件からは外れます。また、インスタンススケジューラもまるで一つのサービスのように見えるのですが、実は何個かサービスを組み合わせて起動停止スケジュールを実現するシステムのことを「インスタンススケジューラ」と表現しています。こちらも利用するには少し手間なので、今回は三つの中で比較的実装の手間が少ない「AWS Lambda および Amazon EventBridge ルールを使用する」について見ていきましょう。

公式に記載されている大まかな手順については、以下の通りです。

  1. Lambda関数用のカスタムAWS Identity and Access Management (IAM) ポリシーとIAMロールを作成
  2. EC2 インスタンスを停止および開始する Lambda 関数を作成
  3. Lambda 関数をテスト
  4. スケジュールに従って関数を実行する EventBridge スケジュールを作成

https://repost.aws/ja/knowledge-center/start-stop-lambda-eventbridge

それでは公式の手順に従い、Lambda用にIAMロールとIAMポリシーを作成していきます。

IAMポリシーの作成

  • アクセス許可の設定を設定

IAMポリシー

作成するIAMポリシーの内容は以下になります。今回は公式が紹介しているものをそのまま利用します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}

続いてIAMロールを作成します。

IAMロールの作成

  • 信頼されたエンティティとしてLamdaを設定

IAMロール

  • 許可の追加で先ほど作成したポリシーを選択

IAMロール

停止用のLamdaを作成

  • 関数名、ランタイム、アクセス権限を設定し関数を作成

Lambda

  • コードを設定

Lambda

コードの詳細は以下の通りです。公式のコードそのままでは使えないので、コード内で停止したいEC2とそのEC2がデプロイされているリージョンを指定します。

import boto3
region = 'EC2のあるリージョン'
instances = ['対称のインスタンスID', '対称のインスタンスID']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
  ec2.stop_instances(InstanceIds=instances)
  print('stopped your instances: ' + str(instances))

同様にして、起動のLambdaを作成します。

Lambdaを定期実行するEventBridgeを設定

  • EventBridgeのルール名やルールタイプを設定

EventBridge

  • 毎日0時に停止のLambdaを実行するようスケジュールを設定

EventBridge

  • 実行するLambdaを選択

EventBridge

同様にして、起動用のEventBridgeを設定します

やりたいことは単純だけど、実現しようとすると意外と手間

公式の手順を見て皆さんはどう思いましたか?細かい部分は省略していますが、個人的には意外と手間だな…と思いました。起動・停止するLambdaを作って、そのLambdaが利用するIAMロールを作って、定期実行するためにEventBridgeを設定して…と、結構やらないといけないことがあります。利用するサービスも複数あるので、メンテナンスやアップデートもちょっと手間ではないでしょうか?

弊社のサービスでは、そんなお悩みを解決する手段をご用意しています!

クラウドポータルとは

弊社が提供するサービスで、クラウドポータルというものがあります。クラウドポータルは、AWSの運用を管理・自動化することを目的として弊社が独自に開発したツールです。前述したようなEC2起動停止のスケジュール設定をしたいけど、設定自体が結構手間、使っているサービスがよくわからない等AWS運用管理のよくある悩みを解決します。

https://biz.nuro.jp/service/managed-cloud-portal/feature/

では、そのクラウドポータルを使うとどういった手順になるのか、を次でご紹介させていただきます。

クラウドポータルの設定手順

  • EC2一覧ページでスケジュール設定したいEC2のスケジュールボタンをクリック

ポータル

  • スケジュールの名前、アクション(起動、停止、停止・起動)、曜日、時間を設定

ポータル

起動スケジュールも同様の手順で設定いただくことが可能です。また、起動停止する時間や曜日を変更する際も簡単に実施いただくことが可能で、メンテナンスも楽々です。

いかがでしょうか?一つのアクションにつき、一項目のみ設定いただくことでスケジュールが作成できるので、公式の手順よりずいぶん簡単にスケジュール設定ができるかと思います。

他にもスナップショットのスケジュールやリストアの方法等、クラウドポータルではAWSコンソールより簡単に設定できるものがたくさんあるので、次回以降でまたそちらの手順をご紹介できればと思います。

関連コラム

このコラムに関連する製品

  • AWS運用支援サービス

    手軽に運用できるツールから
    24時間365日有人監視まで3つのサービスで
    AWSの運用を支援

    詳細はこちら

  • AWS運用管理・自動化ツール「クラウドポータル」

    「はじめてでも運用できる」
    「もっと使いこなせる」
    独自開発ツール

    詳細はこちら

  • 運用内製化支援~セキュリティ改善サービス

    ベストプラクティスに沿った改善案を提案し、運用の内製化を支援します。


    詳細はこちら

このコラムに関連する
導入事例

EC2の起動停⽌スケジュール設定で簡単料⾦削減︕

SHARE
シェアシェア ポストポスト
EC2の起動停⽌スケジュール設定で簡単料⾦削減︕
SHARE
ポスト シェア