1. ホーム
  2. 記事一覧
  3. TerraformとEventBridge Schedulerを活用したEC2インスタンスの時限起動によるコスト削減

2023.10.31

TerraformとEventBridge Schedulerを活用したEC2インスタンスの時限起動によるコスト削減

この記事の目的

AWSの仮想サーバーAmazon EC2は、多くの企業や個人がクラウド上でのアプリケーションホスティングの主要な選択肢として利用されています。しかし、開発環境やステージング環境など、24時間稼働する必要がないインスタンスが常に稼働していると、不必要なコストが発生します。特に大規模なプロジェクトや多数のインスタンスを運用している場合、これらの余分なコストは企業の負担となり得ます。これらの問題をIaCツールであるTeraformを使用し、EventBridgeのスケジューラーで簡単にコスト削減していきたいと思います。

この記事で紹介すること

  • Terraformを使用してEventBridge Schedulerの設定を自動化する方法
  • EC2インスタンスを指定した時間帯だけ起動・停止するスケジュールの設定方法
  • この方法を実装することで実際に得られるコスト削減効果の紹介

TerraformとEventBridge Schedulerの基本

Terraformとは

Terraformは、HashiCorp社が開発した「Infrastructure as Code (IaC)」ツールであり、クラウドリソースのプロビジョニングと管理を自動化するためのものです。Terraformを使用すると、様々なクラウドサービスのリソースを統一的な文法で定義し、宣言的にインフラの状態をコードで管理することができます。

こちらの記事でTerraformの導入方法や使用方法を解説しています。

https://envader.plus/article/162

AWS EventBridge Schedulerとは

AWS EventBridge Schedulerは、AWSのサービスの一つで、定期的なスケジュールや特定のイベントに応じてAWSリソースを操作するためのサービスです。特定の時間や間隔での実行を定義することができる「Cron」や「Rate」式を使用して、様々なAWSサービスとの連携を実現します。

こちらの記事でRDSインスタンスを時限起動した方法を解説しています。

https://envader.plus/article/243

どのようにコスト削減が期待できるのか

EventBridge Schedulerを使用することで、開発環境やステージング環境のEC2インスタンスを特定の時間帯だけ稼働させることができます。例えば、夜間や週末など、実際の作業が行われていない時間帯にインスタンスを自動的に停止することで、インスタンスの稼働時間を減少させることができます。結果、EC2の時間課金によるコストを大幅に削減することが期待できます。Terraformはこれら一連の設定をコードで管理するものです。

実装手順

iam

まずはIamロールを準備します。

iam.tf

# EC2 Scheduler IAM Role
resource "aws_iam_role" "ec2_scheduler" {
  name = "ec2-scheduler-role"
  assume_role_policy = file("./resources/assume_policy.json")
}

resource "aws_iam_policy" "ec2_scheduler" {
  name = "ec2-scheduler-policy"
  policy = templatefile("./resources/ec2_scheduler_policy.json", {
    account_id = data.aws_caller_identity.current.id
  })
}

resource "aws_iam_role_policy_attachment" "ec2_scheduler" {
  role = aws_iam_role.ec2_scheduler.id
  policy_arn = aws_iam_policy.ec2_scheduler.arn
}

assume_policy.json

resourcesディレクトリを作成し配下に作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": ["scheduler.amazonaws.com"]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

ec2_scheduler_policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:StartInstances",
        "ec2:StopInstances"
      ],
      "Resource": [
        "arn:aws:ec2:*:${account-id}:instance/*",
      ]
    }
  ]
}

変数

いくつか変数を使用しているので、それらを指定します。

main.tf

これらを追加します。

# 現在のAWS IDを取得
data "aws_caller_identity" "current" {}
# 変数を指定
variable "ec2_scheduler_target" {}

terraform.tfvars

以下を追加。

# keyに対象インスタンスのIDを入力
ec2_scheduler_target = {
    "i-9999999999" = ["cron(0 8 ? * MON-FRI *)", "cron(0 20 ? * MON-FRI *)"]
}

EventBridgeのコード

aws_scheduler_scheduleリソースを使用して起動と停止をスケジュールします。

# イベントブリッジによる自動停止
resource "aws_scheduler_schedule" "auto-stop" {
  for_each   = var.ec2_scheduler
  name       = "eventbridge-stop-scheduler"
  group_name = "default"

  flexible_time_window {
    mode = "OFF"
  }

  schedule_expression          = each.value.1
  schedule_expression_timezone = "Asia/Tokyo"

  target {
    arn      = "arn:aws:scheduler:::aws-sdk:ec2:stopInstances"
    role_arn = aws_iam_role.ec2_scheduler.arn
    input    = <<EOF
    {
        "InstanceIds": ["${each.key}"]
    }
    EOF
  }
}

# イベントブリッジによる自動開始
resource "aws_scheduler_schedule" "auto-start" {
  for_each   = var.ec2_scheduler
  name       = "eventbridge-start-scheduler"
  group_name = "default"

  flexible_time_window {
    mode = "OFF"
  }

  schedule_expression          = each.value.1
  schedule_expression_timezone = "Asia/Tokyo"

  target {
    arn      = "arn:aws:scheduler:::aws-sdk:ec2:startInstances"
    role_arn = aws_iam_role.ec2_scheduler.arn
    input    = <<EOF
    {
        "InstanceIds": ["${each.key}"]
    }
    EOF
  }
}

※targetのarnのstopInstancesはキャメルケースにする必要があります。 ※aws_scheduler_scheduleを使用するにはaws provider version 4.56.0以上が必要となります。

コスト削減効果

コストの試算

m5.largeインスタンスの平均的な料金を$0.096/時間と仮定します。 (この料金はAWSの公式サイトでの2023年10月時点の東京 (ap-northeast-1)リージョンのオンデマンド料金を基にしています。実際の料金はリージョンや契約内容により異なる場合がありますので、正確な料金はAWS公式サイトをご参照ください。)

https://aws.amazon.com/jp/ec2/pricing/on-demand/

1ヶ月間24時間稼働した場合のコスト

$0.124 * 24 * 30 = $87.68(13,152円)

※1ドルを150円で計算

平日の8時から20時のみ稼働した場合のコスト

1日の稼働時間は12時間となります。1ヶ月の平日は約22日ですので、

$0.124 * 12 * 22 = $33.08(4,962円)

したがって、

1ヶ月間24時間稼働した場合のコストは約$87.68 平日の8時から20時のみ稼働した場合のコストは約$33.08 この試算により、平日の8時から20時のみ稼働させる方法を採用することで、約$54.6日本円にして8,190円(63.36%)のコスト削減が期待できることがわかります。

注意点

定義の確認: Terraformの設定ファイルを適用する前に、terraform plan コマンドを使用して変更内容を確認しましょう。 IAMポリシー: 必要なIAMロールやポリシーが正しく設定されていることを確認してください。特にEventBridgeやEC2への適切なアクセス権限が必要です。 時刻設定: EventBridgeのスケジュール式が正しいタイムゾーンで設定されているか確認してください。

トラブルシューティング

EC2インスタンスが起動しない

  • EventBridgeのルールが正しく設定されているか確認してください。
  • EventBridgeのターゲットが正しくEC2インスタンスを指しているか確認してください。
  • CloudWatch LogsでEventBridgeのログを確認し、エラーメッセージをチェックしてください。

EC2インスタンスが予定よりも早く、または遅くシャットダウンされる

  • スケジュール式が正しいか確認してください。
  • 他のEventBridgeルールやLambda関数がEC2インスタンスに影響を及ぼしていないか確認してください。

Terraformがエラーを返す

  • 最新のterraform init コマンドを実行してプラグインを更新してください。
  • エラーメッセージを注意深く読み、指示に従って問題を解決してください。
  • 必要に応じて、terraform refresh コマンドを使用して実際のリソースの状態を取得してください。

コストが予想以上にかかっている

  • EC2インスタンスが予定外の時間に稼働していないか確認してください。
  • AWS Cost Explorerを使用して、コストの詳細を確認し、高いコストの原因を特定してください。

まとめ

この記事の内容の再確認

  • 本記事では、EC2インスタンスのコスト削減を目的として、TerraformとEventBridge Schedulerを使用した時限起動の実装方法を紹介しました。
  • TerraformとEventBridge Schedulerの基本について触れ、実際にどのようなコスト削減が期待できるのかを詳しく解説しました。
  • m5.largeインスタンスの24/7稼働と平日の8時から20時の運用パターンを比較し、約63.36%のコスト削減効果があることを確認しました。
  • 実装時の注意点と、潜在的な問題やトラブルの対処法についても触れました。

AWSの無料枠で簡単に実現できますので、興味がある方はぜひ実践してみてください。

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事