AWS

EC2インスタンスサイズをSSMで自動変更してみた

shumpei

はじめに

しゅんぺいです。
業務でEC2インスタンスサイズを夜間に変更する必要があったため、指定日時に自動変更できないか試してみました。
今回はAWS Systems Managerのメンテナンスウィンドウ機能を使って実現したので、その要領を紹介いたします。
よりベターな方法はあるかもしれませんが、一例として参考になれば幸いです。

試したこと

変更対象

今回はt2.microのEC2インスタンスを用意しました。これをt2.smallにスケールアップします。

前提として、当該インスタンスは既にSystems Managerのマネージドノードに登録されているものとします。

マネージドノードへの登録方法については「Systems Manager コンソールの [マネージドインスタンス] に EC2 インスタンスが表示されないのはなぜですか?」が分かりやすく、参考になりました。

設定手順

メンテナンスウィンドウ作成・スケジュール登録

Systems Managerのコンソール画面を開き、メンテナンスウィンドウを作成します。
まず、適当なメンテナンスウィンドウ名を付けます。

つづいて、cron式でインスタンスサイズ変更を実行したい日時を指定します。その他項目も画像のように入力した後、「メンテナンスウィンドウの作成」ボタンを押下します。


メンテナンスウィンドウが作成されました。

IAMポリシー・ロール作成

つづいて、メンテナンスウィンドウタスク実行に必要なIAMロールを作成します。
まずはロールにアタッチするIAMポリシーを作成します。
コンソールを使用して、メンテナンスウィンドウのアクセス許可を設定します。」にポリシーの雛形があるのでこれを利用します。
雛形から不要な権限設定は削除します。
また、EC2インスタンスサイズの変更にはEC2インスタンスの状態確認・停止・属性変更・開始といった操作が必要なので、これらを許可する設定を追加します。
結果として出来上がったポリシーは次の通りです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:SendCommand",
                "ssm:CancelCommand",
                "ssm:ListCommands",
                "ssm:ListCommandInvocations",
                "ssm:GetCommandInvocation",
                "ssm:GetAutomationExecution",
                "ssm:StartAutomationExecution",
                "ssm:ListTagsForResource",
                "ssm:GetParameters"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": [
                        "ssm.amazonaws.com"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceStatus"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:ModifyInstanceAttribute",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:ap-northeast-1:【アカウントID】:instance/【インスタンスID】"
        }
    ]
}

上記ポリシーをアタッチしたIAMロールとして「resize-test-ssm-role」を作成しました。

タスク登録

つづいて、メンテナンスウィンドウにタスクを登録します。
「タスク」タブに「タスクの登録」ボタンがあります。
ドロップダウンメニューが表示されるので、「オートメーションタスクの登録」を押下します。

タスク登録画面に行き着きました。
まずはオートメーションドキュメントとして「AWS-ResizeInstance」を選択します。

ターゲットで、サイズ変更したいインスタンスを選択します。

入力パラメーターは次のように入力しました。

  • InstanceId:ターゲットで指定したのと同じインスタンスのID。
  • InstanceType:変更後のインスタンスサイズ。
  • SleepWait:PT5S(デフォルト)。
  • AutomationAssumeRole:このタスク用に作成したIAMロール・resize-test-ssm-roleのARN。


レート制御は次の画像のように入力しました。

IAMサービスロールは、入力パラメーターで指定したのと同じIAMロールを指定しました。

最後に「オートメーションタスクの登録」を押下します。

タスク登録されました。

結果確認

cronで指定した時刻のあと「履歴」タブを見ると、タスク実行が成功した旨が表示されていました。

EC2インスタンスのコンソール画面を見ると、確かにインスタンスサイズがt2.microからt2.smallへと変更されていました。

おわりに

Systems Managerからインスタンスタイプを変更する方法が紹介されているWeb記事は既にあったのですが、メンテナンスウィンドウを用いて変更日時を指定する方法は見つからなかったため、本記事を執筆してみました。
IAM権限設定周りが個人的なハマりポイントでしたが、試行錯誤の末、なんとか目的は達成できました。
本記事が同様の課題に取り組んでおられる方の一助となれば幸いです。

参考

AUTHOR
shumpei
shumpei
記事URLをコピーしました