SSM Automation の推奨 Runbook を利用できるようになった AWS Chatbot を利用して ECS タスクの停止理由を調査してみた

SSM Automation の推奨 Runbook を利用できるようになった AWS Chatbot を利用して ECS タスクの停止理由を調査してみた

Clock Icon2025.01.14

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

先日、AWS Chatbot が Systems Manager Automation の追加で 20 個の推奨ランブックをサポートしました。とても素晴らしいアップデートですね。

アップデートの内容を見るに ECS の停止理由を調査するランブックが実行できそうですね。

With this launch, customers can run AWS Systems Manager automations to resolve issues when they receive AWS Security Hub and Amazon ECS event notifications in chat channels. AWS Chatbot displays contextual action buttons on Security Hub and ECS event notifications and customers can click on them to run automations to resolve the finding. For example, they can run the automation to disable public accessibility of Amazon RDS database instances or run the automation to troubleshoot why an Amazon ECS task in an Amazon ECS cluster failed to start.

https://aws.amazon.com/jp/about-aws/whats-new/2025/01/20-additional-aws-systems-manager-automation-runbook-recommendations-chatbot/

そこで今回は ECS のタスク停止理由を、今回のアップデートを使って調査してみようと思います。

IAM ロールの作成

まずは IAM ロールの作成を行います。チャンネルロールとユーザーロールを作成します。

ともに ReadOnlyAccess を設定します。後ほど説明しますが、今回のアップデートはユーザーロールを主に利用する仕組みのようです。

信頼ポリシーは両方以下で設定します。

assume_chatbot.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "chatbot.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

SNS

続いて SNS トピックの作成です。スタンダードトピックで設定します。

](https://devio2024-media.developers.io/image/upload/v1722413937/2024/07/31/exfsnjxbxhpgzgeaaobq.png)

Terraform など IaC で作成する場合は以下のように EventBridge から通知を受け取れるようトピックポリシーを更新しましょう。

{
	"Version": "2008-10-17",
	"Id": "__default_policy_ID",
	"Statement": [
		{
			"Sid": "__default_statement_ID",
			"Effect": "Allow",
			"Principal": {
				"AWS": "*"
			},
			"Action": [
				"SNS:Publish",
				"SNS:RemovePermission",
				"SNS:SetTopicAttributes",
				"SNS:DeleteTopic",
				"SNS:ListSubscriptionsByTopic",
				"SNS:GetTopicAttributes",
				"SNS:AddPermission",
				"SNS:Subscribe"
			],
			"Resource": "arn:aws:sns:ap-northeast-1:123456789012:ecs-stop-topic",
			"Condition": {
				"StringEquals": {
					"AWS:SourceOwner": "123456789012"
				}
			}
		},
		{
			"Sid": "AWSEvents_ecs-stop-rule_Idc9711eb8-30d6-4fb8-a20c-660e8ec60234",
			"Effect": "Allow",
			"Principal": {
				"Service": "events.amazonaws.com"
			},
			"Action": "sns:Publish",
			"Resource": "arn:aws:sns:ap-northeast-1:123456789012:ecs-stop-topic"
		}
	]
}

EventBridge

EventBridge の設定を行います。

イベントパターンは停止を通知する ECS クラスターをフィルタリングして設定します。

{
	"source": ["aws.ecs"],
	"detail-type": ["ECS Task State Change"],
	"detail": {
		"clusterArn": [
			"arn:aws:ecs:ap-northeast-1:123456789012:cluster/sample-ecs"
		],
		"desiredStatus": ["STOPPED"],
		"lastStatus": ["STOPPED"]
	}
}

ターゲットは先ほど作成した SNS トピックを選択します。

SNS へ飛ばすイベントの内容は、一致したイベント を選択します。

インプットトランスフォーマーを利用すると今回のアップデートは利用できませんでした。

2025-01-14 at 22.16.18-ルールを編集  ターゲットを選択  Amazon EventBridge  ap-northeast-1@2x.png

Chatbot

チャンネル設定

最後に Chatbot のチャンネル設定を作成します。名前はチャンネル名は適宜変更してください。

2025-01-14 at 22.08.44-Slack チャネル設定を作成  AWS Chatbot  Global@2x.png

続いてロール設定です。先ほど作成したチャンネルロールを選択します。

2025-01-14 at 22.21.17-Slack チャネル設定を編集  AWS Chatbot  Global@2x.png

通知も適切な SNS トピックを選びましょう。

2025-01-14 at 22.09.09-Slack チャネル設定を作成  AWS Chatbot  Global@2x.png

ユーザーロール

ユーザーロールの設定です。ユーザーロールタブから先ほど作成したユーザーロールを設定します。

2025-01-14 at 22.09.47-Slack チャネル設定ロールを編集  AWS Chatbot  Global@2x.png

Slack と AWS App の認証が走るため 許可する をクリックします。

認証が完了すると、以下のようにユーザーロールが設定されます。

2025-01-14 at 22.10.08-Slack チャネル設定ユーザーロールの詳細  AWS Chatbot  Global@2x.png

Slack チャンネル側も次のように、認証成功しました!とメッセージが来ていますね。

ECS タスクの停止

それでは ECS タスクの停止を行います。 EventBridge で設定した ECS クラスター内の ECS タスクを停止します。

ECS タスク停止理由の調査

Slack に通知が来ました。見慣れない Get info というボタンが生えていますね。

ちなみに、以前はこのような通知でした。

image.png

Get info を押すと 2 つのメッセージがスレッドに続くように返信されています。

1 つは、オプションを引数に詳細が確認しますか?と聞かれて、もう 1 つはコマンドが実行された結果が返ってきていますね。

詳細を確認すると、チャットボットのユーザーロールで停止された ECS タスクの詳細が確認できていますね。AWS にログインせずにこの情報が見られるのは嬉しいですね。

参考までに次の内容が表示されていました。

Tasks (1):

- CapacityProviderName: FARGATE
  Attributes (1):
  -     Name: ecs.cpu-architecture
        Value: arm64
    ClusterArn: arn:aws:ecs:ap-northeast-1:123456789012:cluster/sample-ecs
    Attachments (1):
  -     Id: 9bd41c21-58c6-4914-a2a7-8a1c9ee6ca97
        Type: ElasticNetworkInterface
        Status: DELETED
        Details (5):
           -
            Name: subnetId
            Value: subnet-0ed7f489cdcc88d18
           -
            Name: networkInterfaceId
            Value: eni-0830b0c954bf9233f
           -
            Name: macAddress
            Value: 0a:7b:8f:8f:ab:03
           -
            Name: privateDnsName
            Value: ip-10-0-25-246.ap-northeast-1.compute.internal
           -
            Name: privateIPv4Address
            Value: 10.0.25.246
    AvailabilityZone: ap-northeast-1c
    Connectivity: CONNECTED
    ConnectivityAt: 2025-01-14 12:51 UTC
    Containers (1):
  -     ContainerArn: arn:aws:ecs:ap-northeast-1:123456789012:container/sample-ecs/8b0070915d314858a6d145acbf38a422/47985da5-c7f1-492b-b6c4-34a301f17882
        TaskArn: arn:aws:ecs:ap-northeast-1:123456789012:task/sample-ecs/8b0070915d314858a6d145acbf38a422
        Name: nginx
        Image: nginx
        ImageDigest: sha256:0e65e7b19ac0abab5c911b175ca20040c98200337337cbb366af24ab597927ea
        RuntimeId: 8b0070915d314858a6d145acbf38a422-2531612879
        LastStatus: STOPPED
        ExitCode: 0
        NetworkInterfaces (1):
           -
            AttachmentId: 9bd41c21-58c6-4914-a2a7-8a1c9ee6ca97
            PrivateIpv4Address: 10.0.25.246
        HealthStatus: UNKNOWN
        Cpu: 0
    Cpu: 512
    CreatedAt: 2025-01-14 12:51 UTC
    DesiredStatus: STOPPED
    LaunchType: FARGATE
    EnableExecuteCommand: false
    ExecutionStoppedAt: 2025-01-14 13:30 UTC
    Group: service:ecs-stop
    LastStatus: STOPPED
    HealthStatus: UNKNOWN
    Memory: 1024
    Overrides:
    ContainerOverrides (1): -
    Name: nginx
    PlatformVersion: 1.4.0
    PlatformFamily: Linux
    PullStartedAt: 2025-01-14 12:51 UTC
    PullStoppedAt: 2025-01-14 12:51 UTC
    StartedAt: 2025-01-14 12:51 UTC
    StartedBy: ecs-svc/9967756951932165084
    StopCode: UserInitiated
    StoppedAt: 2025-01-14 13:31 UTC
    StoppedReason: Task stopped by user
    StoppingAt: 2025-01-14 13:30 UTC
    TaskArn: arn:aws:ecs:ap-northeast-1:123456789012:task/sample-ecs/8b0070915d314858a6d145acbf38a422
    TaskDefinitionArn: arn:aws:ecs:ap-northeast-1:123456789012:task-definition/nginx-samples:6
    Version: 7
    EphemeralStorage:
    SizeInGiB: 20
    FargateEphemeralStorage:
    SizeInGiB: 20

もう片方の詳細について触れていきましょう。

2025-01-14 at 22.35.44-ecs-stop-channel (スレッド) -  - Slack@2x.png

すると --include 引数で渡すパラメーターを求められました。ただ、 --include 引数が何を入れるのかわかりません。Help を押してみます。

2025-01-14 at 22.43.10-ecs-stop-channel (スレッド) -  - Slack@2x.png

Help を押すと ecs describe-tasks の説明が出てきました。

Example ではどのようにコマンドを実行するか例題が記載されていますね(肝心の --include は指定がないですが。)

Parameters を押すと指定したかった include の情報が出てきましたね。タグを指定するようです。

2025-01-14 at 22.48.38-ecs-stop-channel (スレッド) -  - Slack@2x.png

ECS タスクにタグを付与していないため今回はコマンドはキャンセルしました。

まとめ

以上、「SSM Automation の推奨 Runbook を利用できるようになった AWS Chatbot を利用して ECS タスクの停止理由を調査してみた」でした。

追加の 20 個がどのアクションなのかドキュメントから探しきれず、ひとまず ECS でどのような動きになるのか確認してみました。わざわざ AWS コンソールにログインせずに見られるのはとても便利ですね。

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

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.