[アップデート] Amazon Q Developer in chat applications がジャストインタイムノードアクセス機能の承認/却下をサポートしました

[アップデート] Amazon Q Developer in chat applications がジャストインタイムノードアクセス機能の承認/却下をサポートしました

Clock Icon2025.05.04

こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。

Amazon Q Developer in chat applications がジャストインタイムノードアクセス機能の承認/却下をサポートしました。

https://aws.amazon.com/jp/about-aws/whats-new/2025/05/amazon-q-developer-chat-applications-aws-systems-manager-node-access-approvals/

アップデート内容

まず初めにジャストインタイムノードアクセス機能とは、Session Manager を利用したノード(EC2 インスタンス)へのログイン権限を、一時的に付与する機能です。機能の付与は承認制で自動承認/手動承認がサポートされています。

Untitled(159).png

ノードへのログインを承認ベースにすることで、アクセス権限の管理(細かいポリシー制御)や付与・剥奪の手間を大幅に削減できます。

ジャストインタイムノードアクセス機能自体の検証は以下のブログにまとまっているため、併せてご覧ください。(私も拝読させていただきました。)

https://dev.classmethod.jp/articles/aws-systems-manager-just-in-time-node-access/

今回のアップデートは承認/拒否のやりとりを、 Amazon Q Developer in chat applications で行えるようになりました。

Amazon Q Developer in chat applications を利用することで、従来、承認者はマネジメントコンソールを通じて承認を行う必要があったものが、 Slack や Teams 経由でリクエストできるようになったというものです。非常に便利ですね。運用負荷が下がりそうです。

Untitled(159) (1).png

やってみた

それでは、実際に Amazon Q Developer in chat applications 経由で AWS Systems Manager のジャストインタイムノードアクセスを利用します。

今回は Slack を利用します。Slack と Amazon Q Developer in chat applications の連携は済んでいるものとします。

https://docs.aws.amazon.com/chatbot/latest/adminguide/slack-setup.html

https://aws.amazon.com/jp/builders-flash/202006/slack-chatbot/

また、ジャストインタイムノードアクセスの有効化 まで済んでいるものとします。

[アップデート] SSM Session Managerでのノード接続時の承認管理に役立つジャストインタイムノードアクセス機能が追加されました | DevelopersIO

Slack チャンネルの作成

まずは Slack チャンネルを作成します。誰でも承認できるとマズいので、プライベートチャンネルで作成します。

チャンネルが作成できたら /invite @Amazon Q を忘れないようにしましょう。

IAM ロールの作成

承認者用の IAM ロールを作成します。ロール名は任意の名前で設定します。

Slack チャンネルから通知が来た時に、承認者はそのロールを使って承認/拒否を行うイメージです。

信頼ポリシー.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "chatbot.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

IAM ポリシーは以下のドキュメントの IAM policy for access request approvers に沿って作成します。

region, account id 部分は適宜置き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAccessRequestDescriptions",
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeOpsItems",
                "ssm:GetOpsSummary",
                "ssm:ListOpsItemEvents"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowGetSpecificAccessRequest",
            "Effect": "Allow",
            "Action": [
                "ssm:GetOpsItem"
            ],
            "Resource": "arn:aws:ssm:region:account id:opsitem/*"
        },
        {
            "Sid": "AllowApprovalRejectionSignal",
            "Effect": "Allow",
            "Action": [
                "ssm:SendAutomationSignal"
            ],
            "Resource": "arn:aws:ssm:*:*:automation-execution/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/SystemsManagerJustInTimeNodeAccessManaged": "true"
                }
            }
        },
        {
            "Sid": "QuickSetupConfigurationManagers",
            "Effect": "Allow",
            "Action": [
                "ssm-quicksetup:ListConfigurationManagers",
                "ssm-quicksetup:ListConfigurations",
                "ssm-quicksetup:GetConfigurationManager",
                "ssm-quicksetup:ListQuickSetupTypes",
                "ssm-quicksetup:GetConfiguration"
            ],
            "Resource": "*"
        },
        {
            "Sid": "QuickSetupDeployments",
            "Effect": "Allow",
            "Action": [
                "cloudformation:ListStacks",
                "cloudformation:DescribeStacks",
                "organizations:DescribeOrganization",
                "organizations:ListDelegatedAdministrators"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowSsmJitnaPoliciesCrudOperations",
            "Effect": "Allow",
            "Action": [
                "ssm:GetDocument",
                "ssm:DescribeDocument"
            ],
            "Resource": [
                "arn:aws:ssm:region:account id:document/*"
            ],
            "Condition": {
                "StringEquals": {
                    "ssm:DocumentType": [
                        "ManualApprovalPolicy",
                        "AutoApprovalPolicy"
                    ]
                }
            }
        },
        {
            "Sid": "AllowSsmJitnaPoliciesListOperations",
            "Effect": "Allow",
            "Action": [
                "ssm:ListDocuments",
                "ssm:ListDocumentVersions"
            ],
            "Resource": "*"
        },
        {
            "Sid": "IDCPermissions",
            "Effect": "Allow",
            "Action": [
                "sso:DescribeRegisteredRegions",
                "sso:ListDirectoryAssociations",
                "identitystore:GetUserId",
                "identitystore:DescribeUser",
                "identitystore:DescribeGroup",
                "identitystore:ListGroupMembershipsForMember"
            ],
            "Resource": "*"
        }
    ]
}

https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-just-in-time-node-access-setting-up.html

手動承認ポリシーの作成

続いて手動承認ポリシーを作成します。ターゲットはすべてのノードまたは、タグベースで特定のノードのみ を指定できます。

今回はすべてのノードを選択しました。アクセス期間(再承認が不要な期間)は任意の時間を指定します。

2025-05-04 at 17.34.27-承認ポリシーを作成  Systems Manager  ap-northeast-1@2x.png

承認者を選択します。先ほど作成したロールを指定します。(私はロール名を just-in-time-node-access-manager としました。)

2025-05-04 at 17.38.11-承認ポリシーを作成  Systems Manager  ap-northeast-1@2x.png

最終的な作成イメージは以下のとおりです。

2025-05-04 at 17.38.29-Systems Manager  ap-northeast-1@2x.png

クライアント設定

Amazon Q Developer in chat applications と Slack の連携が済んでいると、設定から次のようにクライアントが表示されている状態になります。

クライアントをクリックし、新しいチャネルを設定 をクリックします。

2025-05-04 at 17.43.19-チャネル設定を表示  Systems Manager  ap-northeast-1@2x.png

チャネルの設定画面が表示されます。

通知タイプは承認者向けなので Notify approvers that access request requires their approval decision を選択します。

IAM ロールは先ほど作成したロール名(承認者と同じロール)を選択します。

チャネル ID も先ほど作成したチャネル ID を指定します。設定名はわかりやすいよう、私はチャネル名を指定しました。

2025-05-04 at 17.45.14-チャネル設定を表示  Systems Manager  ap-northeast-1@2x.png

完了すると次のような設定になります。

2025-05-04 at 17.48.39-チャネル設定を表示  Systems Manager  ap-northeast-1@2x.png

承認リクエストを送信

実際に承認リクエストを送信してみます。

ReadOnlyAccess 権限と、以下の IAM ポリシーを持った権限から承認リクエストを送信します。

{
    "Version": "2012-10-17",
    "Statement": [{
            "Sid": "AllowJITNAOperations",
            "Effect": "Allow",
            "Action": [
                "ssm:StartAccessRequest",
                "ssm:GetAccessToken"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowOpsItemCreationAndRetrieval",
            "Effect": "Allow",
            "Action": [
                "ssm:CreateOpsItem",
                "ssm:GetOpsItem"
            ],
            "Resource": "arn:aws:ssm:*:*:opsitem/*"
        },
        {
            "Sid": "AllowListAccessRequests",
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeOpsItems",
                "ssm:GetOpsSummary",
                "ssm:ListOpsItemEvents",
                "ssm:DescribeSessions"
            ],
            "Resource": "*"
        },
        {
            "Sid": "RequestManualApprovals",
            "Action": "ssm:StartAutomationExecution",
            "Effect": "Allow",
            "Resource": "arn:aws:ssm:*:*:document/*",
            "Condition": {
                "StringEquals": {
                    "ssm:DocumentType": "ManualApprovalPolicy"
                }
                
            }
        },
        {
            "Sid": "StartManualApprovalsAutomationExecution",
            "Effect": "Allow",
            "Action": "ssm:StartAutomationExecution",
            "Resource": "arn:aws:ssm:*:*:automation-execution/*"
        },
        {
            "Sid": "AllowManualApprovalAutomationExecutionTagging",
            "Effect": "Allow",
            "Action": [
                "ssm:AddTagsToResource"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:automation-execution/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/SystemsManagerJustInTimeNodeAccessManaged": "true"
                },
                "ForAllValues:StringEquals": {
                    "aws:TagKeys": [
                        "SystemsManagerJustInTimeNodeAccessManaged"
                    ]
                }
            }
        },
        {
            "Sid": "CancelAccessRequestManualApproval",
            "Effect": "Allow",
            "Action": "ssm:StopAutomationExecution",
            "Resource": "arn:aws:ssm:*:*:automation-execution/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/SystemsManagerJustInTimeNodeAccessManaged": "true"
                }
            }
        },
        {
            "Sid": "DescribeEC2Instances",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "ec2:GetPasswordData"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowListSSMManagedNodesAndTags",
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeInstanceInformation",
                "ssm:ListTagsForResource"
            ],
            "Resource": "*"
        },
        {
            "Sid": "QuickSetupConfigurationManagers",
            "Effect": "Allow",
            "Action": [
                "ssm-quicksetup:ListConfigurationManagers",
                "ssm-quicksetup:GetConfigurationManager",
                "ssm-quicksetup:ListConfigurations",
                "ssm-quicksetup:ListQuickSetupTypes",
                "ssm-quicksetup:GetConfiguration"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowSessionManagerOperations",
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeSessions",
                "ssm:GetConnectionStatus"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowRDPOperations",
            "Effect": "Allow",
            "Action": [
                "ssm-guiconnect:ListConnections",
                "ssm:GetConnectionStatus"
            ],
            "Resource": "*"
        },
        {
            "Sid": "QuickSetupDeployments",
            "Effect": "Allow",
            "Action": [
                "cloudformation:ListStacks",
                "cloudformation:DescribeStacks",
                "organizations:DescribeOrganization",
                "organizations:ListDelegatedAdministrators"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowSsmJitnaPoliciesReadOnly",
            "Effect": "Allow",
            "Action": [
                "ssm:GetDocument",
                "ssm:DescribeDocument"
            ],
            "Resource": [
                "arn:aws:ssm:*:account id:document/*"
            ],
            "Condition": {
                "StringEquals": {
                    "ssm:DocumentType": [
                        "ManualApprovalPolicy",
                        "AutoApprovalPolicy"
                    ]
                }
            }
        },
        {
            "Sid": "AllowSsmJitnaPoliciesListOperations",
            "Effect": "Allow",
            "Action": [
                "ssm:ListDocuments",
                "ssm:ListDocumentVersions"
            ],
            "Resource": "*"
        },
        {
            "Sid": "ExploreNodes",
            "Effect": "Allow",
            "Action": [
                "ssm:ListNodesSummary",
                "ssm:ListNodes",
                "ssm:DescribeInstanceProperties"
            ],
            "Resource": "*"
        },
        {
            "Sid": "IdentityStorePermissions",
            "Effect": "Allow",
            "Action": [
                "sso:DescribeRegisteredRegions",
                "sso:ListDirectoryAssociations",
                "identitystore:GetUserId",
                "identitystore:DescribeUser",
                "identitystore:DescribeGroup"
            ],
            "Resource": "*"
        }
    ]
}

IAM policy for just-in-time node access users

2025-05-04 at 17.52.43-Systems Manager  ap-northeast-1@2x.png

承認リクエストが飛んできました。Request Reason が日本語でやりとりできて良いですね。

サーバー情報は Instance ID で判断しないといけないため、何かしらのマッピング情報をどこかに書いておく必要がありそうです。Name タグが記載されていると嬉しそうですね。

試しに Reject してみましょう。Comment も追記できるようです。

返信する形で、実行したコマンドの表示および、承認リクエストのステータスが更新されました。

リクエスタ側からも次のように理由/コメントが表示される形でアクセスリクエストが却下されていました。

2025-05-04 at 18.03.25-アクセスリクエスト oi-602827388007  Systems Manager  ap-northeast-1@2x.png

承認が却下されたため、再度、リクエストを送信します。

2025-05-04 at 18.06.03-Systems Manager  ap-northeast-1@2x.png

別投稿の形で新しいコメントが投稿されていました。

急ぎのようなので、承認しました。

こちらも却下と同じくコメントに返信する形で、実行したコマンドの表示および、承認リクエストのステータスが更新されました。

リクエスタ側からもセッションが開始できるようになりました。

2025-05-04 at 18.07.42-アクセスリクエスト oi-300a0b926f00  Systems Manager  ap-northeast-1@2x.png

おまけ

承認/却下をした後、再度、承認/却下を押すとエラーになりました。ちゃんとチェックしてクリックしましょう。


承認後に Reject を押した後の挙動


却下後に Approve を押した後の挙動

Slack なので Request Reason にメンションできるか試してみましたが、残念ながら反応しませんでした。


メンションが反応せず、道半ばで途絶えたコメント

まとめ

以上、「Amazon Q Developer in chat applications がジャストインタイムノードアクセス機能の承認/却下をサポートしました。」でした。普段チャットでコミュニケーションしている企業の場合、非常に便利な機能なのではないでしょうか。

参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.