ふりぶろぐ
Web Engineer's Blog
AWS

【節約】EC2を自動起動・自動停止する【コスト削減】

EC2の自動起動・自動停止

EC2を自動起動・自動停止する方法について解説します。
同じ方法でRDSの自動起動・自動停止もできます。

環境
  • AWS
    • EC2
    • CloudWatch Events
    • SSM

業務時間中にしか使っていないのに検証用のインスタンスを常に起動している…

なんてことはありませんか?

EC2は使っていなくても起動しているだけでお金がかかってしまいます。

数日間であればまだ良いのですが、年単位になるとかなり大きな損失になると思います。

そこで、必要なときだけインスタンスを起動するように設定したいと思います。

IAMロールの準備

CloudWatch EventsからSSMを操作するためのIAMを作成しておきます。

まずはIAMのロール→ロールの作成と進んでください。

ユースケースの選択でCloudWatch Eventsを選択します。

ユースケースの選択

そしてあとはそのまま作成してください。
今回はec2-start-and-stop-roleという名前で作成しました。

その後、ロールの一覧画面から作成したロール(ec2-start-and-stop-role)を選択し、詳細ページを開きます。

次に ポリシーをアタッチします からAmazonSSMAutomationRoleをアタッチします。
AmazonSSMAutomationRole以外のポリシーは削除します。

最終的にはこのようなロールができていると思います。

CloudWatch Eventsだけで設定可能!

では実際に自動起動・自動停止の設定していきます。

今まではLambdaとCloudWatch Eventsを使う方法が主流だったみたいですが、今はCloudWatch Eventsだけで出来ちゃいます。

まずはCloudWatchのルール→ルールの作成と進んでください。

ルールの作成

自動停止の設定

今回は平日の24時に停止するように設定してみます。

イベントソースはスケジュールのCron 式を選択し、クーロン式には 0 15 ? * MON-FRI * を入力します。
Cron 式はUTCで入力する必要があるので日本時間(JST)の場合は9時間前となります。

ターゲットはSSM Automationを選択し、ドキュメントにAWS-StopEC2Instanceを設定します。

そして定数のInstanceIdに停止したいEC2インスタンスのIDを入力します。

ロールは既存のロールを使用を選択して先ほど作成したec2-start-and-stop-roleを選択しましょう。

複数のEC2インスタンスを指定したい場合は以下のように設定します。
[“i-XXXXXXXX”,”i-XXXXXXXXX”]

しかし、このように入力しても
i-XXXXXXXX,i-XXXXXXXXX
こちらに自動変換されてしまうバグ?があったので何度か入力してみてください。

ルールの設定(自動停止)

そして設定の詳細へと進み、任意の名前と説明を入力してください。

有効化にチェックを入れると作成した時点で定期実行設定が有効化されます。

私は以下のように設定しました。

  • 名前:StopEC2Instance
  • 説明:平日の24時にEC2インスタンスを停止します。
  • 有効化:✔

そして作成したら、設定を確認してみましょう。
ルールの一覧から作成したルールの詳細ページを開きます。

複数のインスタンスを指定した場合、入力の定数が以下のようになっているはずです。
{“InstanceId”:[“i-XXXXXXXX”,”i-XXXXXXXX”]}

この様になっていない場合はうまくInstanceIdを設定できていないので、編集画面からもう一度
[“i-XXXXXXXX”,”i-XXXXXXXXX”]
のように入力してみてください。

これで24時に自動停止する設定は完了しました。

自動起動の設定

次に8時に自動起動するように設定してみましょう。

手順はほぼ同じでCron 式とドキュメントの設定値を変えるだけです。
8時に設定する場合、9時間前だと日付を跨いでしまうのでSUN-THUとなります。

  • Cron 式:0 23 ? * SUN-THU *
  • ドキュメント:AWS-StartEC2Instance
ルールの設定(自動起動)

そして名前と説明を入力してルールを作成します。

  • 名前:StartEC2Instance
  • 説明:平日の8時にEC2インスタンスを起動します。
  • 有効化:✔

自動停止設定と同様に設定の確認を行ってください。

これで平日の8時に起動し、24時に停止する設定が完了しました。
不安な方はCron 式の設定を変えてみて動作確認してみてください!

あとがき

ドキュメントをAWS-StartRdsInstance、AWS-StopRdsInstanceにすることでRDSの自動起動・自動停止も可能です。

使わないときは停止して無駄のないような運用をしたいですね。

ABOUT ME
りーふ
たまにブログを書いてるWebエンジニア。 サーバーサイドメインでインフラとフロントエンドもたまにやります。 Javaが得意。 Play Frameworkが好き。 本業は迷惑をかけない程度に手を抜くスタイル。 意識高い系は苦手。