BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS】EC2の自動起動・自動停止を実装する方法


2022/12/10 最新の情報に更新しました。また一部の文章を修正・更新しています。


こんにちは!
BFT名古屋支店の佐野です。

今回はEC2インスタンスが一定時刻に起動、停止する仕組み作りについてのお話です。
EC2インスタンスは起動している間だけ料金が発生するので、誰も触っていない時間帯に起動させておくのは非常にコスト面で悪く、もったいないです。
多くの場合は「使わない時は停止しておく」運用をされていると思いますが、手動だとうっかり停止し忘れてしまう……なんてことも多々あるでしょう。
ですので、そもそも忘れてしまってもいいように、起動や停止を自動化してしまおうというのが、今回の趣旨になります。


はじめに:EC2の自動起動・自動停止の前提条件

今回のEC2インスタンス自動起動・自動停止には、Systems ManagerとEventBridgeというふたつのAWSサービスを使用します。
それらを使い、EC2インスタンスの状態を制御するには、以下が必要となります。

  1. EventBridgeからSystems Managerを操作するためのポリシーを含んだIAMロール
  2. 指定時刻にSystems Managerの機能を動かすためのEventBridgeルール

これが今回の起動停止の自動化を行なうための前提すべてになります。

この記事に辿りついた方には、もしかしたら

「Systems Managerを使ってEC2を管理するのだから、SSMエージェントの導入がいるのではないのか」

「プライベートサブネット内のEC2を操作する場合はどうなるのか。Systems Managerのエンドポイントがないと疎通できないのでは」

という疑問を持ちながら情報を集めている方がいるかもしれません。最初は筆者もそうでした。

しかし今回の手法の場合、SSMエージェントの導入は不要です。
また、たとえプライベートサブネット内のEC2を対象にする場合でもエンドポイントは必要ありません。
EventBridgeのルール追加だけという、本当に微々たるコストで実装することができます。


EventBridge用のIAMロールを作成

ではまず、先ほどの1.で述べたEventBridgeにSystems Managerを操作するための権限を与えるIAMロールを作成していきましょう。
まずはIAMコンソールに入り、左ペインからロールを選んで、さらにロールの一覧画面右側の「ロールの作成」を選びます。

「信頼されたエンティティを選択」画面となったら、〈他のAWSサービスのユースケース〉リストからSystems Managerを選びます。
またここでは検索が効きますので、Systems Managerと入力すればすぐに出てきます。

その後、リストの下に出てくる〈Systems Manager〉ラジオボタンを選択し、「次へ」をクリックして進みます。

「許可を追加」画面となったら、このIAMロールに割り当てるポリシーを選択していきます。
今回の場合はAWS管理ポリシーである〈AmazonSSMAutomationRole〉のみを付与するため、検索欄に入力してフィルタをかけ、出てきたAmazonSSMAutomationRoleポリシーのチェックボックスを選択します。
チェックを入れたら、「次へ」をクリックして進みます。

「名前、確認、および作成」画面となります。
〈ロール名〉に作成するロールの任意の名前を入力しましょう。
今回の例では“test_ec2stopstart_role”としています。

その後、「ロールを作成」クリックします。
ロールの一覧画面に戻り、「ロール〈ロール名〉が作成されました」と表示されれば、ロールの作成は完了です。
ただ作成したロールは今のところSystems Managerにしか関連付けられないため、EventBridgeが利用できるように少し編集していきます。


EventBridge用のIAMロールの信頼関係を変更

ロールを作成する際、「信頼されたエンティティを選択」画面でSystems Managerを選択しました。
あれはIAMロールがどのAWSサービスで利用できるか、どのAWSサービスで使う権限を付与するか、の選択となります。
なので現在は「Systems Managerの権限を持つSystems Manager用IAMロール」というものになっています。
しかし今回はSystems Managerへの権限をEventBridgeに与える、つまり「Systems Managerの権限を持つEventBridge用IAMロール」にする必要があります。
そのために、一度IAMロールの信頼関係を編集し、EventBridgeへの信頼関係を与えていきます。

ロールの一覧画面から作成したIAMロールを選択し、以下のように信頼関係タブを選択、 その後「信頼ポリシーを編集」を選択します。

「信頼ポリシーの編集」画面となり、json形式でポリシーの信頼関係を編集することができます。
ここで内容が以下の通りになるように変更しましょう。
(具体的には"Service"の部分を編集します)

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

変更したら「ポリシーの変更」をクリックして変更を適用します。

これでEventBridgeで使えるIAMロールが完成しました。
次はEventBridgeで自動停止、自動起動のルールを作成します。


EC2を指定時刻に自動起動(自動停止)するルールを作成

EventBridgeコンソールに入り、左ペインより「ルール」を選択します。
そしてルールの一覧画面となったら、「ルールを作成」を選択します。

「ルールの詳細」項目が出たら、まず作成するルールの名前を設定します。
画像の例では“test_ec2stopstart_event”としています。
〈イベントバス〉はdefaultのままとし、〈ルールタイプ〉で「スケジュール」を選択します。
その後「続行してルールを作成する」を選択します。
(EventBridge Schedulerを選んでしまわないように注意)

次に「スケジュールパターン」項目で、作成するイベントをいつ発生するかを設定します。
今回は例として日本標準時(JST)で毎日9:00に起動するスケジュールを組んでいきます。
〈スケジュールパターン〉で「特定の時刻(毎月第1月曜日の午前8時(IPST)など)に実行されるきめ細かいスケジュール。」を選択します。
Cron式の各入力欄で、分、時間は0を、日付は?を、月と曜日と年は*を入力します。
そして〈以後 10 回のトリガー日〉リストをローカルタイムゾーンにし、発生日が意図した通りになっていることを確認します。例えば2022/12/10に以上の設定を行なった場合、以下の画像の通りになるはずです。

なおCron式の法則については以下URLを参照ください。

docs.aws.amazon.com

最後に「ターゲット」項目では、イベントで起こす処理の内容と、その処理の対象、そして使用するIAMロールを設定します。
〈ターゲットタイプ〉で「AWS のサービス」を選択し、〈ターゲットを選択〉のリストから Systems Manager オートメーションを選択します。そして〈ドキュメント〉のリストからAWS-StartEC2Instanceを選択します。
このAWS-StartEC2Instanceというのが、対象のインスタンスを起動させるという処理を行ないます。
そして〈InstanceID〉の項目で、起動させる対象のインスタンスインスタンスIDを指定します。
インスタンスIDは、インスタンスに自動的に割り振られる[i-(17桁の英数字)]からなるIDで、一意のものです。 最後に〈実行ロール〉で「既存のロールを使用」を選択して、リストボックスから先ほど作成したEvent Bridge用のIAMロールを選択します。

すべて設定したら最下部の「次へ」を押下します。
その後、「タグ」項目で必要ならタグを追加し、「次へ」を押下します。
すると「レビューと作成」画面に入るため、設定した内容に間違いがないか確認して「ルールの作成」を押下すると、ルールが作成されます。 そしてルール一覧にここで作成したルールが表示されていれば、無事作成完了になります。


動作確認

ここまで設定し終えたら、あとは指定した時刻にイベントが実行され、問題なく起動することを確認するだけです。
しかしながら、実際にイベントによって起動したかどうかをログで欲しい! という方も多いと思います。
その場合、イベントが起動しているかどうかの確認は、CloudTrailのイベント履歴を見ることで行なうことができます。
以下画面のStartAutomationExecutionというイベントが、今回作成したイベントが実行された時に発生するものです。
またその後、インスタンスの起動イベントであるStartInstancesが発生しておりますので、これらを目印に確認してください。


自動停止したい場合は?

さて、ここまででEC2インスタンス自動起動についての手順をお送りしましたが、では自動停止の場合はどうすればよいのか。
これは途中「ターゲットを選択」項目で設定した〈ドキュメント〉を、AWS-StopEC2Instanceに変えることで停止の処理を行なうことができます。
ひとつのルールにはひとつのドキュメントの未設定可能なため、自動起動と自動停止をどちらも行ないたい場合は、それぞれ別のルールとして作成する必要があります。
なお自動停止を行なうルールの場合でも、使用するIAMロールは自動起動の時と同じになります。


さいごに

この自動起動・自動停止を実装することにより、無駄なコストの発生をかなり抑えることができるようになります。
通常の業務で利用時間を決めた運用を行なっている時はもちろん、検証用に個人で使っているEC2にも、落し忘れの保険として仕掛けておくのもよいかと思います。

また今回はEC2の自動起動・自動停止を取り扱いましたが、次回はAurora DBクラスターの自動起動・自動停止をお話いたします。
次回はその記事で、またお会いしましょう。