以前、「Change Managerによる変更管理と本番アクセス統制」の7編に渡る記事を執筆しました。 アーキテクチャは以下に示す通りで、ハイライトされた部分がハンズオンのスコープです。 関連記事は以下になります。 Systems Managerのドキュメント画面を開き、「ドキュメントの作成」→「オートメーション」をクリックします。 「コード」をクリックします。 「AddUserToGroup-automation.yaml」のコードを貼り付け、任意の名前を付けます。 「ランブックを作成」をクリックするとドキュメントが作成されます。 「RemoveUserFromGroup-automation.yaml」も同様に作成します。 以上で2つのドキュメントが作成できました。 続いて、System ManagerのChange Manager画面を開き、「テンプレートを作成」をクリックします。 「エディタ」をクリックします。 「AddUserToGroup-template.yaml」のコードを貼り付け、任意の名前を付けます。 「保存してプレビュー」をクリックするとテンプレートが作成されるので、「レビューのために送信」をクリックします。 「RemoveUserFromGroup-template.yaml」も同様に作成します。 自己承認はできないため、他の権限のあるユーザで「承認」をクリックします。 「RemoveUserFromGroup-template」も同様に承認します。 テンプレートのステータスが承認済みになり、使えるようになります。 最後に、定期的にIAMユーザのタグを確認し、TTL切れのユーザをグループから強制離脱させるためのLambda関数を作成します。 「jump-chengemanager-lambda-checkgroup.py」のコードを貼り付けてデプロイします。 「一般設定」でタイムアウトを「1分」に変更します。 「アクセス権限」でロール名をクリックし、ロールに権限を追加します。 ロールに「AmazonSNSFullAccess」とIAMチェック用のポリシーを追加します。 IAMチェック用のポリシーは以下の通り。 環境変数に、Lambda関数の実行結果を受け取るためのSNSトピックARNを追加します。 member01 が Prodアカウントで本番作業をするために、グループ追加やグループ離脱を申請し、leader01 が承認するケースを実施します。 member01 が MemberGroup のみに所属し、タグが付与されていないことを確認します。 member01 は現時点でProdアカウントにスイッチロールできません。 「Change Manager」で「リクエストを作成」をクリックします。 「AddUserToGroup-template」を選択します。 ランブックのパラメータに、自身のIAMユーザ名、追加したいグループ名、グループ離脱予定の時間としてTTLを入力します。 「承認のために送信」をクリックします。 指定したSNSトピックに基づいた宛先に通知が届きます。 「承認」をクリックするとコメントを入力できるので、任意のコメントを入力して「承認」をクリックします。 問題が無ければステーガが成功になります。 member01 を確認すると、申請したグループとタグが追加されています。 再度、Prodアカウントにスイッチロールしてみます。 今度はスイッチロールに成功しました。 続いて、グループの離脱を申請します。 リクエスト名を付けます。 ランブックのパラメータに、自身のIAMユーザ名、離脱したいグループ名を入力します。 「承認のために送信」をクリックします。 問題が無ければステータスが成功になります。 member01 を確認すると、申請したグループとタグが削除されています。 再度、Prodアカウントにスイッチロールしようとすると想定通り失敗します。 Lambda関数を使って強制的にグループを離脱させます。 Lambda関数「jump-chengemanager-lambda-checkgroup」を実行します。 タグの値が現在より未来の時間なので、グループとタグの削除は行われません。 次に、タグの値を過去の時間に変更します。 再度、Lambda関数「jump-chengemanager-lambda-checkgroup」を実行します。 すると、TTL切れのユーザがグループから強制離脱された旨のメールが届きます。 member01 を確認すると、Lambda関数によりグループとタグが削除されていることが分かります。 今回は手動でLambdaを起動しましたが、組織の運用に合わせてEventBridgeで定期起動させるとよいでしょう。
概要
今回は、その中で紹介した Change Manager のテンプレートと定期チェック用 Lambda 関数のソースコードを公開しましたので、その利用方法を解説します。
システム実装
ドキュメント作成


ここでは、ファイル名の「AddUserToGroup-automation」と名前を付けます。
コード内の Account ID にはAWSアカウントIDを入力します。


テンプレート作成


ここでは、ファイル名の「AddUserToGroup-template」と名前を付けます。






Lambda関数作成
任意の名前を付け、ランタイムはPythonの最新版を使います。
ここでは、ファイル名の「jump-chengemanager-lambda-checkgroup」と名前を付け、ランタイムは「Python 3.13」を指定します。




AccountID は自身のAWSアカウントIDを入力します。{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"iam:UntagUser",
"iam:RemoveUserFromGroup",
"iam:ListUserTags"
],
"Resource": [
"arn:aws:iam::<AccountID>:group/*",
"arn:aws:iam::<AccountID>:user/*"
]
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "iam:ListUsers",
"Resource": "*"
}
]
}
キーは「topic_arn」で、値は受信できるSNSトピックARNを入力します。
動作確認
また、ユーザがグループ離脱申請を忘れた場合に、Lambda関数で強制離脱させるケースも実施します。グループ追加







承認者はこのリンクをクリックすると、該当するリクエストの承認画面にアクセスできます。


うまく行かない場合は、ランブックのパラメータを見直してみてください。




グループ離脱
「RemoveUserFromGroup-template」を選択します。
離脱用のテンプレートは自動承認となっています。


うまく行かない場合は、ランブックのパラメータを見直してみてください。



Lambda関数によるグループ離脱
member01 はグループとタグが追加されている状態とします。
タグの値は現在より未来の時間を設定しています。








