LoginSignup
1
1

More than 1 year has passed since last update.

【AWS】オートメーションでEC2を自動停止・起動する手順(画像付き)

Posted at

はじめに

EC2インスタンスを検証環境と本番環境で分けている場合、検証環境を丸一日起動させたくないときに自動で停止起動を組み込みたい。

使用環境

  • VPC
    EC2インスタンスを配置するのに必要
  • EC2
    自動停止・起動する対象
  • Systems Manager(SSM)
    今回の主役
  • Amazon EventBridge
    SSMターゲットを紐付けるために必要

やってみた

ドキュメントを作成する

「AWS Systems Manager」を開き、左から「共有リソース」>「ドキュメント」を開きます。
「Create document」から「Automation」をクリックします。
スクリーンショット 2022-05-04 23.54.45.png

名前を入力して、エディタを開きます。
今回はご自身がわかるように設定してください。
スクリーンショット 2022-05-05 0.20.42.png

エディタの中身を以下の通りにしました。
パラメータの説明は後述の通りです。

---
description: Exec AWS-StopEC2Instances Tags:Staging
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
  Environment:
    type: String
    default: Staging
    description: (Required) Staging or Product 
    allowedValues:
    - Staging
    - Product
  AutomationAssumeRole:
    type: String
    description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
    default: ""
mainSteps:
  - name: StopEC2Instances
    action: aws:executeAwsApi
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: AWS-StopEC2Instance
      TargetParameterName: "InstanceId"
      Targets:
        -
           Key: tag:Environment
           Values: 
             - "{{ Environment }}"
パラメータ 内容
description エディタの概要を書く
schemaVersion スキーマのバージョンを書く
★以下の公式ドキュメントを参考にしてみてください
SSMドキュメントスキーマの機能と例
assumeRole このオートメーションを実行するロールを持つIAMユーザ(ARN形式)を書く
★記載がなければIAMユーザアカウントの管理者権限で実行される
★今回はパラメータセクション内にある「AutomationAssumeRole」を参照するようにしています
ベストプラクティスは以下の公式ドキュメントを参考にしてください
委任管理者を使用して、オートメーションを実行する
IAMを使用して、オートメーションのロールを設定する
Parameters パラメータを入力する箇所を定義できます
今回はEC2の使用環境を意味する「Environment」と実行する委任ロールが付与された「AutomationAssumeRole」を定義しました
以下の画像を参考にパラメータと反映される箇所をインプットしてみてください。
スクリーンショット 2022-05-06 10.38.59.png
mainSteps ドキュメントに記載されている実行オブジェクトをステップとして定義されています。
セクションの書き方は以下の公式ドキュメントを参考にしてみてください。
Systems Manager Automationアクションのリファレンス
AWS APIオペレーションの呼び出しと実行
StartAutomationExecution
★ドキュメント上には以下の画像のように表示されます。
スクリーンショット 2022-05-06 10.56.10.png

作成したら、「自己所有」に作成されています。
スクリーンショット 2022-05-05 0.21.09.png

今回はEC2を停止起動するので、停止と起動で1つずつ作りましょう。
スクリーンショット 2022-05-05 0.23.47.png

動作確認してみる

EC2を停止

作成した停止ドキュメントを選択して、オートメーションを実行します。
スクリーンショット 2022-05-06 11.53.51.png

「シンプルな実行」で入力パラメータは「Staging」、AssumeRoleは「なし」で実行します。
スクリーンショット 2022-05-06 11.56.15.png

実行が開始されます。
スクリーンショット 2022-05-06 11.58.01.png

実行履歴は「変更管理」>「自動化」内で確認できます。
スクリーンショット 2022-05-06 12.00.39.png
作成したドキュメント内のステップ実行履歴
スクリーンショット 2022-05-06 12.04.26.png
「AWS-StopEC2Instance」というAWSが所有しているドキュメントを実行した履歴
スクリーンショット 2022-05-06 12.05.14.png
スクリーンショット 2022-05-06 12.05.23.png

停止ができました。
スクリーンショット 2022-05-06 12.14.56.png

EC2を起動

作成した起動ドキュメントを選択して、オートメーションを実行します。
スクリーンショット 2022-05-06 12.15.47.png

実行履歴を見れば成功しています。
スクリーンショット 2022-05-06 12.19.41.png
スクリーンショット 2022-05-06 12.20.46.png
スクリーンショット 2022-05-06 12.21.05.png
スクリーンショット 2022-05-06 12.21.12.png

EC2も起動できました。
スクリーンショット 2022-05-06 12.24.15.png

Amazon EventBridgeでスケジューリング

Cloudwatch Eventsは古いサービスなので、Amazon EventBridgeで実施します。
サービスを起動して、「イベント」>「ルール」、「ルールを作成」をクリックします。
スクリーンショット 2022-05-06 12.27.32.png

今回は決まった時間に停止と起動を行いたいので、「スケジュール」タイプのルールタイプを指定します。
スクリーンショット 2022-05-06 12.31.33.png

スケジュールはCron形式で行います。
※例では、毎日21時に停止する想定です。
書き方は以下の公式ドキュメントを参考にしてください。
スケジュールに従って実行する Amazon EventBridge ルールの作成
スクリーンショット 2022-05-06 12.33.51.png

ターゲットを作成したSystems Managerオートメーションのドキュメントを指定してあげます。
スクリーンショット 2022-05-06 12.38.38.png

作成しようとしたら、エラーが発生しました。(22年/4月段階)
理由は、実行ロールを指定する際にEC2を停止・起動するポリシーを持ったIAMロールが必要でした
新規で作成することはできないようですので、IAMポリシー作成後、ロールにアタッチしていきます。
スクリーンショット 2022-05-06 17.13.44.png

IAMロールとポリシーを作成

まずはEC2の停止・起動のポリシーを作成します。
({Your Instance}はご自身のAWSアカウントIDを入れてください)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:StopInstances",
            "Resource": "arn:aws:ec2:*:{Your Instance}:instance/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "ec2:StartInstances",
            "Resource": "arn:aws:ec2:*:{Your Instance}:instance/*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "tag:GetResources",
            "Resource": "*"
        }
    ]
}

Systems Managerのオートメーションから実行されるので、専用のIAMロールを作成します。
IAMロールからユースケースを「EC2」選択。
許可ポリシーが以下の画像を参照。
スクリーンショット 2022-05-06 17.47.53.png

信頼関係を選択して、信頼ポリシーを編集します。
スクリーンショット 2022-05-06 17.54.08.png

再びEventBridgeに戻ってきた

実行ロールに先ほど作成したロールを指定する。
スクリーンショット 2022-05-06 18.07.46.png

無事に作成できました。
スクリーンショット 2022-05-06 18.08.57.png

起動分のルールも作成します。
スクリーンショット 2022-05-06 18.09.47.png
スクリーンショット 2022-05-06 18.10.43.png

無事に作成完了です。
スクリーンショット 2022-05-06 18.11.15.png

最後に

EventBridgeからSSMオートメーションが起動され、EC2インスタンスが停止・起動とされればOKです。
実行履歴はCloudTrailからも確認することができます。
実行しない場合は以下の理由が考えられますので、切り分けの参考としてください。

  • EC2のタグがドキュメントのパラメータセクションと紐づいていない
  • イベントが有効にされていない
  • イベントスケジュールの設定が誤っている(基準時刻がローカルタイムゾーンとなっているとか)

参考

SSMドキュメントの構文
aws:executeAutomation – 別のオートメーションを実行する

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1