6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon Q Developerの日本語対応によって運用調査は楽になる?

Posted at

はじめに

 先月末に、Amazon Q Developerについて、マネジメントコンソール、モバイルアプリケーション、Microsoft Teams、Slackのチャットアプリケーションで日本語対応が発表されました。

 このアップデートでマネジメントコンソールにて、日本語で質問をしても日本語で回答をもらえるようになりました。
AIO-001.png

 2025年4月に、CloudWatch Operational Investigationの試行をした際、日本語に対応していないことから、エンタープライズの運用担当者には少々ハードルが高いかなと感じていました。

 今回のAmazon Q DeveloperのアップデートでOperational Investigationも日本語でやりとりできれば、運用担当者により身近な存在になるのではと思い、試してみました。

調査対象の環境

 今回はServerlessのシンプルな構成で試しました。
API GatewayにCloudWatch Alarmを設定して、Latencyが1秒以上となった場合にアラームを発報し、運用調査機能を自動起動、SNS経由でSlackへ投稿する形にしました。

環境.png

設定

それでは、運用調査機能周りの設定をしていきます。

事前設定(Slack & Amazon Q Developer in chat applications)

マネジメントコンソールから設定する方法は前回のブログで記載していましたので、今回はCloudFormationで設定していきます。

 なお、Amazon Q Developer in chat applicationsにおけるワークスペース作成はマネジメントコンソールの操作が必要ですので、そこは手動で対応しました。

Amazon Q Developer in chat applicationsを開き、チャットクライアントを設定Slackを選択、クライアントを設定をクリックします。

AIO-100.png

続いてSlackのサイトに遷移しますので、連携したいワークスペースを選択し、ワークスペースにアクセスする権限を許可します。

AIO-101.png

 作成されたSlackワークスペースが表示されます。この画面で表示されるワークスペースIDをCloudFormationのパラメータで使用するので、控えておきます。

AIO-102.png

 SNSトピック、サブスクリプションの作成、Amazon Q Developer in chat applicationsのチャネル設定のyamlとなります。(権限周りは環境に応じて変更をお願いします)

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Amazon Q Developer in chat applications for Slack Ops'

Parameters:
  SlackWorkspaceId:
    Type: String
    Description: 'Slack Workspace ID'

  SlackChannelId:
    Type: String
    Description: 'Slack Channel ID'

Resources:
  # SNS Topic
  ChatSlackTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: 'slack-ops-topic'
      DisplayName: 'Topic for Amazon Q Developer'

  # IAM Role for Amazon Q Developer in Chat applications
  AmazonQSlackOpsRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: 'AmazonQ-Slack-Ops-Role'
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: chatbot.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/AdministratorAccess'

  SlackOpsChannelConfiguration:
    Type: AWS::Chatbot::SlackChannelConfiguration
    Properties:
      ConfigurationName: 'slack-ops-channel'
      SlackWorkspaceId: !Ref SlackWorkspaceId
      SlackChannelId: !Ref SlackChannelId
      IamRoleArn: !GetAtt AmazonQSlackOpsRole.Arn
      SnsTopicArns:
        - !Ref ChatSlackTopic
      GuardrailPolicies:
        - 'arn:aws:iam::aws:policy/AdministratorAccess'
      LoggingLevel: 'INFO'
      UserRoleRequired: false

Outputs:
  # SNS Topic Information
  ChatSlackTopicArn:
      Description: 'ARN of the SNS topic'
      Value: !Ref ChatSlackTopic
      Export:
          Name: ChatSlackTopicArn

  # SlackOpsChannelConfiguration:
  SlackOpsChannelConfigurationArn:
      Description: 'ARN of the Slack ops Channel'
      Value: !Ref SlackOpsChannelConfiguration
      Export:
          Name: SlackOpsChannelConfigurationArn

 パラメータで指定している項目は各環境に合わせて設定をしてください。

パラメータ 設定内容
SlackChannelId Slackチャンネルの詳細ページで確認するID
欄外の画像参照
SlackWorkspaceId 先ほどのワークスペース作成時に表示されたワークスペースID

Slackで通知したいチャンネルを右クリック、チャンネル詳細を表示するをクリックすると以下の詳細画面が出てきます。その最下段にチャンネルIDが表示されています。

AIO-008.png

SlackでAmazon Q Developerを招待

 SlackのチャンネルにAmazon Q Developerを追加します。
 先ほどチャンネルIDを参照するために開いたページで、インテグレーションタブを開き、アプリを追加するを選択します。

AIO-009.png

 表示された画面でAmazon Q Developerの追加をクリックして、チャンネルにAmazon Q Developerを招待します。

AIO-010.png

この状態で、Amazon Q Developer in chat applicationsのワークスペースで設定済みチャネルにチェックを入れてテストメッセージを送信をクリックするとSlackで通知の受信確認ができます。

AIO-011.png

AIO-012.png

Operational Investigation機能の設定

 ドキュメントを調べたら、Operational InvestigationもCloudFormationで作成可能となっていました。調査グループの作成はCloudFormationで構築します。

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Create Operational Investigation & CloudWatch Alarm'

Resources:
 # Investigation Group
 InvestigationGroup:
   Type: AWS::AIOps::InvestigationGroup
   Properties:
     ChatbotNotificationChannels:
         - SNSTopicArn: !ImportValue ChatSlackTopicArn
           ChatConfigurationArns:
               - !ImportValue SlackOpsChannelConfigurationArn
     IsCloudTrailEventHistoryEnabled: true
     Name: 'InvestigationGroup for Slack'
     RoleArn: !GetAtt AIOpsAssistantRole.Arn

 # IAM Role for Investigation Assistant
 AIOpsAssistantRole:
   Type: AWS::IAM::Role
   Properties:
     RoleName: 'AIOpsAssistantRole'
     AssumeRolePolicyDocument:
       Version: '2012-10-17'
       Statement:
         - Effect: Allow
           Principal:
             Service: 
               - aiops.amazonaws.com
               - cloudwatch.amazonaws.com
           Action: sts:AssumeRole
     ManagedPolicyArns:
       - arn:aws:iam::aws:policy/AIOpsConsoleAdminPolicy
       - arn:aws:iam::aws:policy/ReadOnlyAccess

Outputs:
 InvestigationGroupArn:
   Description: 'ARN of the Investigation Group'
   Value: !GetAtt InvestigationGroup.Arn

 アラーム発生時に自動で運用調査機能を起動できるようにCloudFormationでアラームを作成しようと思ったのですが、CloudWatchから調査を作成できるようにするためのグループポリシー、リソースポリシーを作成する必要があり、追加のLambdaの準備等手間がかかるので今回はスキップして、GUIで設定しました

動作確認

 いよいよ動作確認していきます。
 Lambda関数を更新して、関数内で2秒のWaitを入れるようにしました。結果として、リクエストすると必ずアラームが発生する状態になっています。
 リクエストを発行すると、予定通りアラームが発生し、Slack側に投稿されてきました。

AIO-200.png

また、運用調査機能のInvestigation Openedのメッセージも出力されました。

AIO-205.png

 調査結果の提案も送られてきました。ただ、英語です。言語を変える設定項目はないので、日本語で通知する機能はなさそうです。

AIO-201.png

 そのままメンションして、送られてきたテキストを貼り付けて日本語への翻訳を依頼してみます。

AIO-203.png

 しっかり日本語訳をして回答してくれました。ただ、毎回メンションしてメッセージを貼り付けて依頼するのは面倒です。ちなみに、具体性のない質問だけを投げても新規の会話が始まってしまいます。

 AIO-204.png

 一方で、日本語であっても、情報が少しでもあるとそれを元に調査を行ってくれるようになっています。この点は日本語対応してくれたことで、とても活用できるポイントになったと考えます。(というよりこれで最低限はクリアかなと思いました)
AIO-206.png

 とはいえ、元々想定していた運用調査機能での日本語のやりとりは、なかなか難しいことがわかりました。運用調査機能が自動でログを読み取って提案してくれる点を有効活用したいものです。
 どうしたものかと思い、暫定対策としてメッセージの翻訳を行いSlackに投稿する形を考えることにしました。

暫定対策 Amazon Translate活用

 翻訳を簡単に始めるなら、Amazon Translateと考えて、Lambdaで変換してSlackに投稿する形にしました。運用調査機能からSlackへ投稿する際、Amazon Q Developer in chat applicationsを経由します。Amazon Q Developer in chat applicationsでは、SNS Topicを指定していますので、SNS TopicからLambdaを起動し、並列処理する形にしました。Amazon Translateで日本語変換をしたら、Slackへ投稿します。イメージは以下の赤矢印のルートです。

環境2.png

AIO-207.png

Lambdaの参考コードは以下の通りです。今回はお試しでしたので、環境変数(SLACK_WEBHOOK_URL)でWebhookのURLをセットしました。実際に利用するならParameter Storeなどを活用する方が正しいです。
 なお、翻訳後、敢えてWebhookで投稿しているのは、翻訳後に元のSNS Topicに再連携したところ、それを契機にTranslate Lambdaが改めて起動してしまうという無限ループを発生させる凡ミスをやらかしたからです。。(気づいて良かった)

import os
import json
import boto3
import urllib3

translate = boto3.client("translate")
http = urllib3.PoolManager()

SLACK_WEBHOOK_URL = os.environ["SLACK_WEBHOOK_URL"]

def lambda_handler(event, context):
    for record in event["Records"]:
        message = record["Sns"]["Message"]
        print("Received SNS message:", message)

        try:
            msg_json = json.loads(message)
        except:
            msg_json = {"text": message}

        # メッセージ本文
        text = msg_json.get("eventSummary", "").strip()
        if not text:
            print("No message body, skipping Slack post")
            continue  # 空メッセージの時は投稿せずに進む

        # Translateで翻訳する
        try:
            translated_text = translate.translate_text(
                Text=text,
                SourceLanguageCode="en",
                TargetLanguageCode="ja"
            )["TranslatedText"]
        except Exception as e:
            print("Translation error:", e)
            translated_text = text

        # Slack用メッセージを作る
        slack_message = {
            "text": f"*翻訳:* {translated_text}"
        }

        print("Sending message to Slack:", json.dumps(slack_message, ensure_ascii=False))

        try:
            response = http.request(
                "POST",
                SLACK_WEBHOOK_URL,
                body=json.dumps(slack_message).encode("utf-8"),
                headers={"Content-Type": "application/json"}
            )
            print("Slack response status:", response.status)
        except Exception as e:
            print("Error sending to Slack:", e)

    return {"status": "ok"}

 改めて運用調査機能を起動するべくアラーム状態にしてみると、日本語変換された投稿を受け取れました。(1つ前の通知も翻訳されて表示されています)投稿を受け取るだけなので、Acceptなどは元々のAmazon Qからの投稿に対して行うことになります。なお、Accept/Discardを日本語の投稿で対応するにはLambdaの追加実装などが必要になり、効率的ではないので見送りました。

AIO-300.png

 とりあえず日本語にはできたものの、期待していた形とはちょっと違います。(暫定対策はAmazon Qが日本語対応する前から実施できたことです)
 改善すべき点と次のアイデアが見えてきたところでボリュームが多くなってきてしまったので、本対策は次回の投稿にします。

まとめ

 Amazon Qが日本語対応したことで、CloudWatch Operational Investigationの導入に向けたハードルが1つクリアされるかなと思ったのですが、そこまで甘くはありませんでした。ただ、今回の検証を通して、日本語でも調査を指定する情報があればAmazon QがAWSリソースを調査して回答してくれることは分かりました。運用改善の構想が具体的にイメージできたので、次は生成AIを活用した効率化を検証していきます。
 SlackやTeamsといったコミュニケーションツールで運用調査が効率化されることで、サービスの回復が早期化できるとともに、システム障害の経路担当の心理的負担が減らせることを期待しています。こんな方式もあるよ、といったアイデアをお持ちでしたら、ぜひ教えてください。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?