以下の内容はhttps://yuj1osm.hatenablog.com/entry/2025/01/12/163136より取得しました。


【ハンズオン】Change Managerによる変更管理と本番アクセス統制

概要

以前、「Change Managerによる変更管理と本番アクセス統制」の7編に渡る記事を執筆しました。
今回は、その中で紹介した Change Manager のテンプレートと定期チェック用 Lambda 関数のソースコードを公開しましたので、その利用方法を解説します。

アーキテクチャは以下に示す通りで、ハイライトされた部分がハンズオンのスコープです。

テンプレートとソースコードは以下のGitHubにあります。

github.com

関連記事は以下になります。

yuj1osm.hatenablog.com

yuj1osm.hatenablog.com

システム実装

ドキュメント作成

Systems Managerのドキュメント画面を開き、「ドキュメントの作成」→「オートメーション」をクリックします。

「コード」をクリックします。

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

「ランブックを作成」をクリックするとドキュメントが作成されます。

「RemoveUserFromGroup-automation.yaml」も同様に作成します。

以上で2つのドキュメントが作成できました。

テンプレート作成

続いて、System ManagerのChange Manager画面を開き、「テンプレートを作成」をクリックします。

「エディタ」をクリックします。

「AddUserToGroup-template.yaml」のコードを貼り付け、任意の名前を付けます。
ここでは、ファイル名の「AddUserToGroup-template」と名前を付けます。

「保存してプレビュー」をクリックするとテンプレートが作成されるので、「レビューのために送信」をクリックします。

「RemoveUserFromGroup-template.yaml」も同様に作成します。

自己承認はできないため、他の権限のあるユーザで「承認」をクリックします。

「RemoveUserFromGroup-template」も同様に承認します。

テンプレートのステータスが承認済みになり、使えるようになります。

Lambda関数作成

最後に、定期的にIAMユーザのタグを確認し、TTL切れのユーザをグループから強制離脱させるためのLambda関数を作成します。
任意の名前を付け、ランタイムはPythonの最新版を使います。
ここでは、ファイル名の「jump-chengemanager-lambda-checkgroup」と名前を付け、ランタイムは「Python 3.13」を指定します。

「jump-chengemanager-lambda-checkgroup.py」のコードを貼り付けてデプロイします。

「一般設定」でタイムアウトを「1分」に変更します。

「アクセス権限」でロール名をクリックし、ロールに権限を追加します。

ロールに「AmazonSNSFullAccess」とIAMチェック用のポリシーを追加します。

IAMチェック用のポリシーは以下の通り。
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": "*"
        }
    ]
}

環境変数に、Lambda関数の実行結果を受け取るためのSNSトピックARNを追加します。
キーは「topic_arn」で、値は受信できるSNSトピックARNを入力します。

動作確認

member01 が Prodアカウントで本番作業をするために、グループ追加やグループ離脱を申請し、leader01 が承認するケースを実施します。
また、ユーザがグループ離脱申請を忘れた場合に、Lambda関数で強制離脱させるケースも実施します。

グループ追加

member01 が MemberGroup のみに所属し、タグが付与されていないことを確認します。

member01 は現時点でProdアカウントにスイッチロールできません。

「Change Manager」で「リクエストを作成」をクリックします。

「AddUserToGroup-template」を選択します。

リクエスト名を付けて、SNSトピックを追加します。

ランブックのパラメータに、自身のIAMユーザ名、追加したいグループ名、グループ離脱予定の時間としてTTLを入力します。

「承認のために送信」をクリックします。

指定したSNSトピックに基づいた宛先に通知が届きます。
承認者はこのリンクをクリックすると、該当するリクエストの承認画面にアクセスできます。

「承認」をクリックするとコメントを入力できるので、任意のコメントを入力して「承認」をクリックします。

問題が無ければステーガが成功になります。
うまく行かない場合は、ランブックのパラメータを見直してみてください。

member01 を確認すると、申請したグループとタグが追加されています。

再度、Prodアカウントにスイッチロールしてみます。

今度はスイッチロールに成功しました。

グループ離脱

続いて、グループの離脱を申請します。
「RemoveUserFromGroup-template」を選択します。

リクエスト名を付けます。
離脱用のテンプレートは自動承認となっています。

ランブックのパラメータに、自身のIAMユーザ名、離脱したいグループ名を入力します。

「承認のために送信」をクリックします。

問題が無ければステータスが成功になります。
うまく行かない場合は、ランブックのパラメータを見直してみてください。

member01 を確認すると、申請したグループとタグが削除されています。

再度、Prodアカウントにスイッチロールしようとすると想定通り失敗します。

Lambda関数によるグループ離脱

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

Lambda関数「jump-chengemanager-lambda-checkgroup」を実行します。

タグの値が現在より未来の時間なので、グループとタグの削除は行われません。

次に、タグの値を過去の時間に変更します。

再度、Lambda関数「jump-chengemanager-lambda-checkgroup」を実行します。

すると、TTL切れのユーザがグループから強制離脱された旨のメールが届きます。

member01 を確認すると、Lambda関数によりグループとタグが削除されていることが分かります。

今回は手動でLambdaを起動しましたが、組織の運用に合わせてEventBridgeで定期起動させるとよいでしょう。




以上の内容はhttps://yuj1osm.hatenablog.com/entry/2025/01/12/163136より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14