はじめに
先月末に、Amazon Q Developerについて、マネジメントコンソール、モバイルアプリケーション、Microsoft Teams、Slackのチャットアプリケーションで日本語対応が発表されました。
このアップデートでマネジメントコンソールにて、日本語で質問をしても日本語で回答をもらえるようになりました。
2025年4月に、CloudWatch Operational Investigationの試行をした際、日本語に対応していないことから、エンタープライズの運用担当者には少々ハードルが高いかなと感じていました。
今回のAmazon Q DeveloperのアップデートでOperational Investigationも日本語でやりとりできれば、運用担当者により身近な存在になるのではと思い、試してみました。
調査対象の環境
今回はServerlessのシンプルな構成で試しました。
API GatewayにCloudWatch Alarmを設定して、Latencyが1秒以上となった場合にアラームを発報し、運用調査機能を自動起動、SNS経由でSlackへ投稿する形にしました。
設定
それでは、運用調査機能周りの設定をしていきます。
事前設定(Slack & Amazon Q Developer in chat applications)
マネジメントコンソールから設定する方法は前回のブログで記載していましたので、今回はCloudFormationで設定していきます。
なお、Amazon Q Developer in chat applicationsにおけるワークスペース作成はマネジメントコンソールの操作が必要ですので、そこは手動で対応しました。
Amazon Q Developer in chat applicationsを開き、チャットクライアントを設定
でSlack
を選択、クライアントを設定
をクリックします。
続いてSlackのサイトに遷移しますので、連携したいワークスペースを選択し、ワークスペースにアクセスする権限を許可します。
作成されたSlackワークスペースが表示されます。この画面で表示されるワークスペースIDをCloudFormationのパラメータで使用するので、控えておきます。
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が表示されています。
SlackでAmazon Q Developerを招待
SlackのチャンネルにAmazon Q Developerを追加します。
先ほどチャンネルIDを参照するために開いたページで、インテグレーションタブを開き、アプリを追加する
を選択します。
表示された画面でAmazon Q Developerの追加
をクリックして、チャンネルにAmazon Q Developerを招待します。
この状態で、Amazon Q Developer in chat applicationsのワークスペースで設定済みチャネルにチェックを入れてテストメッセージを送信
をクリックするとSlackで通知の受信確認ができます。
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側に投稿されてきました。
また、運用調査機能のInvestigation Openedのメッセージも出力されました。
調査結果の提案も送られてきました。ただ、英語です。言語を変える設定項目はないので、日本語で通知する機能はなさそうです。
そのままメンションして、送られてきたテキストを貼り付けて日本語への翻訳を依頼してみます。
しっかり日本語訳をして回答してくれました。ただ、毎回メンションしてメッセージを貼り付けて依頼するのは面倒です。ちなみに、具体性のない質問だけを投げても新規の会話が始まってしまいます。
一方で、日本語であっても、情報が少しでもあるとそれを元に調査を行ってくれるようになっています。この点は日本語対応してくれたことで、とても活用できるポイントになったと考えます。(というよりこれで最低限はクリアかなと思いました)
とはいえ、元々想定していた運用調査機能での日本語のやりとりは、なかなか難しいことがわかりました。運用調査機能が自動でログを読み取って提案してくれる点を有効活用したいものです。
どうしたものかと思い、暫定対策としてメッセージの翻訳を行い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へ投稿します。イメージは以下の赤矢印のルートです。
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の追加実装などが必要になり、効率的ではないので見送りました。
とりあえず日本語にはできたものの、期待していた形とはちょっと違います。(暫定対策はAmazon Qが日本語対応する前から実施できたことです)
改善すべき点と次のアイデアが見えてきたところでボリュームが多くなってきてしまったので、本対策は次回の投稿にします。
まとめ
Amazon Qが日本語対応したことで、CloudWatch Operational Investigationの導入に向けたハードルが1つクリアされるかなと思ったのですが、そこまで甘くはありませんでした。ただ、今回の検証を通して、日本語でも調査を指定する情報があればAmazon QがAWSリソースを調査して回答してくれることは分かりました。運用改善の構想が具体的にイメージできたので、次は生成AIを活用した効率化を検証していきます。
SlackやTeamsといったコミュニケーションツールで運用調査が効率化されることで、サービスの回復が早期化できるとともに、システム障害の経路担当の心理的負担が減らせることを期待しています。こんな方式もあるよ、といったアイデアをお持ちでしたら、ぜひ教えてください。