📚

Systems Manager AutomationでリソースID以外でターゲットを指定する方法

2020/12/18に公開

SystemsManager Automationのドキュメントでリソース指定にIDを使いたくない

AWSではSystemsManager Automation(以下、SSM Automation)という機能があります。その機能を利用したEC2バックアップ方法について記事を書きました。
実際はこのドキュメントをメンテナンスウィンドウを利用して定期的に実行しています。

https://zenn.dev/chittai/articles/20201028-aws-ec2-backup

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-maintenance.html

ここでの運用はバックアップ対象を直接ドキュメントに記述しています。ですが、これだと困ることがあります。例えば、EC2/Volumeのリストアを行い、リソースIDが変わるケースです。
リストアする毎にリソースIDを修正しなければなりません。それは耐えられないので、直接リソースIDを記入する運用を変えたいと思います。

ここで、ポイントとして上げられるのは下記になります。

  1. 操作対象のリソースにTagをつける
  2. Tagベースでリソースグループを作成する
  3. メンテナンスウィンドウのターゲットでリソースグループを指定する
  4. メンテナンスウィンドウのタスクで疑似パラメータを使用する
  5. 1タスクで操作する対象は1種類のリソースとする(EC2,EBSなどちゃんと分けて管理する)

構成について

まず、構成について紐解きます。Automationのタスクを定期的に実行するには、メンテナンスウィンドウを利用する必要があります。このメンテナンスウィンドウでは
タスクという単位で操作を登録することができます。そして、操作対象をターゲットという単位で登録することができます。このターゲットはリソースグループ単位でもEC2インスタンス単位でも登録できます

そして、リソースグループはTagベースでの登録が可能です。なので、操作したい対象に同じタグをつけ、リソースグループでまとめることでリソースIDを直書きせずに
対象を指定することができます。

対象リソースにTagをつける

今回は、linux, windows2019というインスタンスにAutomation:Yesというタグを追加しました。このタグベースでリソースグループを作成します。

Tagベースでリソースグループを作成する

リソースグループ作成画面からTagベースでリソースグループを作成します。

メンテナンスウィンドウのターゲットでリソースグループを指定する

メンテナンスウィンドウのターゲットで先ほど作成したリソースグループを登録します。

メンテナンスウィンドウのタスクで疑似パラメータを使用する

ここからも大事なポイントとなります。次に、タスクを登録します。今回はAWS-StopEC2Instanceを実行します。想定される動作は、先程作成したリソースグループに登録されているEC2インスタンスすべてが停止されることです。

先程登録したリソースグループのターゲットを登録します。

リソースグループを操作するのに必要な権限をロールに付与します。
それと、EC2インスタンスを停止できる権限があるロールを選択します。(今回はAdministrator権限がついたロールを使用しています)

}
"resource-groups":"GetGroupQuery",
"resource-groups":"GetGroup",
"resource-groups":"GetTags"
}

ここで一番大事なのは、InstanceIdのボックスに{{RESOURCE_ID}}を記述することです。これは疑似パラメータといいます。この疑似パラメータを
記述することで、リソースグループに登録したリソースのID情報がAWS-StopEC2Instanceに自動で渡されて実行されます。動作として、各リソースに対して
順番に子タスクが作成されそれぞれ実行されます。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/mw-cli-register-tasks-parameters.html

以上で完了です。

感想

{{RESOURCE_ID}}が登録されたリソースを順に置き換わるので、複数のリソースタイプが登録されていると、ドキュメントの引数と型があわずに基本失敗します。
なので、リソースごとにタスクとリソースグループを登録するのが良いかと思います。

Discussion