この記事の目的
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を学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.06.30
【Terraformハンズオン】AWS Certificate Manager (ACM) で発行したSSL証明書とALBを紐付けてみよう
インターネット上での通信を安全に保つためには、SSL/TLS証明書が必要です。ACMは、AWSが提供するSSL/TLS証明書の管理サービスで、証明書の発行、管理、更新を簡単に行えます。こちらの記事では、ACMの特徴、利用するメリット、実際の利用方法について解説します。
- AWS
2024.08.27
【Terraformハンズオン】NAT GatewayにセカンダリIPアドレスを追加する方法
AWSが提供するNAT Gatewayは、プライベートサブネットにあるサーバーなどのリソースがインターネットに接続するために必要な仕組みです。今回は、このNAT Gatewayに「セカンダリIPアドレス」を追加する方法と、セカンダリIPの基礎を解説します。
- AWS
- Terraform
2024.10.17
AWS Lambdaの基本 Lambda関数のバージョン管理を理解しよう
この記事では、Lambda関数の中でも「バージョン管理」について解説していきます。
- AWS
- ハンズオン