SSM Session Managerの設定(ロギングなど)をCloudFormationで行う

概要

以下のようなSession Managerの設定をCloudFormationで行います。
また、そもそもどうやってSession Managerの設定をAPIで行うの?といった点も説明します。

結論のCloudFormationテンプレート

以下テンプレートでSession Managerの設定が可能です。
cloudWatchLogGroupNameなどの項目を書き換えて利用します。
CloudFormationスタックを更新することでSession Managerの設定も更新できますが、スタックを削除した時は何も起こりません。(設定が初期値に戻る、とかも無い)

CloudFormation経由で行う方法を模索

まずCloudFormationで設定を行おうとした場合、ドキュメントを見てもそれらしきリソースが見当たりません。

そこでカスタムリソースを視野に入れてAPI経由で設定を行う方法が無いか探してみると、ドキュメントに以下が記載されていました。

アカウントに Session Manager を設定すると、Session タイプの SSM ドキュメント SSM-SessionManagerRunShell が作成されます。
この SSM ドキュメントには、~するかどうかなど、セッションの設定が保存されます。

つまりSession Managerの設定を行うためにはSSM-SessionManagerRunShellという名前でSSMドキュメントを作成すればよい、ということになります。

CloudFormationでAWS::SSM::Documentリソースを作成してみる

以下のように、AWS::SSM::Documentを利用してSSMドキュメントを作成するのがシンプルで良いと思っていました。
実際、CloudFormationスタックの作成=SSMドキュメントの作成=Session Managerの初回設定まではうまくいきました。

ただし、Session Managerの設定(cloudWatchLogGroupNameなど)を書き換えてスタックを更新すると以下エラーが発生します。

CloudFormation cannot update a stack when a custom-named resource requires replacing. Rename SSM-SessionManagerRunShell and update the stack again.

これ自体はよく知られた(?)エラーで、エラーメッセージにある通り SSM-SessionManagerRunShell という名前を変更することで解消されます。
ただし「Session Managerの設定は SSM-SessionManagerRunShell という名前のSSMドキュメントに保存される」という仕様上、今回の場合は名前を変更することは出来ません。
(変更するとSession Managerのデフォルト設定としては利かなくなってしまう)

CloudFormationカスタムリソースでSSMドキュメントを作成してみる

ということで、最終的にこの形に落ち着きました。
カスタムリソース(Lambda)の処理の中で特筆すべき点は、既にドキュメントが存在する場合の update_document を実行する部分です。
update_document 実施後に update_document_default_version を実施することで最新の設定内容をドキュメントのデフォルトバージョンとして登録します。

ほか、周辺知識

今回設定したのはカスタムセッションドキュメントを利用しない場合のSession Managerの設定です。

Session Manager 設定を作成する (コマンドライン)

この手順を使用して、アカウントレベルの設定を上書きする Session Manager の詳細設定のカスタムセッションドキュメントを作成できます。カスタムセッションドキュメントを作成するときは、name パラメータに SSM-SessionManagerRunShell 以外の値を指定し、必要に応じて入力を変更します。カスタムセッションドキュメントを使用するには、AWS Command Line Interface (AWS CLI) からセッションを開始するときに、–document-name パラメータにカスタムセッションドキュメントの名前を指定する必要があります。コンソールからセッションを開始する場合、カスタムセッションドキュメントを指定することはできません。

つまり、AWSマネジメントコンソールからSession Managerを利用する限りにおいては、今回CloudFormationで組んだSession Managerの設定が必ず活きることになります。