Amazon Q Developer Operational Investigations とこれからの運用を考える

# はじめに
　今年、経済産業省が謳っていた2025年の崖と言われていた年になりました。IT人財不足が至る所で言われています。効率化を進めて、より価値を生む分野に人財を投入しようという流れになっていますね。
　私個人としては、ここ数年、クラウドネイティブの運用を学んでいく中で、オンプレミス・レガシーシステムの運用はつらいと改めて感じています。従来の運用を続けていくと担当してくれる人がいなくなってしまうのでは、と不安にもなります。
　様々な場面で非効率な部分を改善する手段として生成AIの活用も進んでおり、昨今の生成AIのムーブメントにAIOpsという運用に関わるキーワードも混ざっていますね。
　AIOpsの1つとして、運用の効率化に期待されるAmazon Q Developer Operational Investigations（運用調査）について取り組んでみましたので、備忘として残すと共に、これからの運用について考えてみました。

# Amazon Q Developer Operational Investigations とは
re:Invent2024でCEOのMatt氏から発表されました。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Investigations.html

ドキュメントの冒頭に以下が書かれています。
`Amazon Q Developer の運用調査機能は、システム内のインシデントへの対応に役立つ生成 AI を活用したアシスタントです。生成 AI を使用してシステムのテレメトリをスキャンし、問題に関連する可能性のある提案をすばやく表示します。`

テレメトリをスキャンして問題の原因特定に協力してくれるというものです。
現在、バージニアとオレゴンでプレビュー中となります。

それでは、設定方をみていきましょう。

# 始め方
## 前提
利用可能な環境はus-east-1かus-west−2になりますので、ご注意ください。
私はus-east-1を使用しました。

## 事前設定（Slack & Amazon Q Developer in chat applications）
Slack連携用のSNSトピックを作成しておきます。
すでに作成済みの方、Slackへの連携を行わない方は本項目を読み飛ばしていただいて大丈夫です。

Amazon SNSの画面で、SNSトピックを作成していきます。

スタンダードタイプで大丈夫です。
名前を設定して、他はデフォルトで`トピックの作成`をクリックします。
![aiops09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/972c12cb-77d9-4e8d-aa35-d967435ebd2d.png)

![aiops10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/faf7db29-21fd-4516-bdb6-a0ae90587971.png)

`サブスクリプションの作成`をクリックして、作成したトピック内にサブスクリプションを作成していきます。
プロトコルは`HTTPS`、エンドポイントは`https://global.sns-api.chatbot.amazonaws.com`となります。その他はデフォルトのまま`サブスクリプションの作成`をクリックします。

![aiops16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/2721ec11-a314-4a22-9e14-24a73674b572.png)

サブスクリプションができました。

![aiops17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/7f69fa1c-ef3c-4dac-9d4b-83e3dae1c8e8.png)

続いてAmazon Q Developer in chat applicationsの設定です。
検索バーでAmazon Q Developer in chat applications（旧称：AWS Chatbot）を入力して開きます。

`新しいクライアントを設定`を選択します。
![aiops22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/333fea10-cd3d-450c-bf50-6411c0d89e78.png)

ポップアップ画面で`Slack`を選択し、`設定`をクリックします。

![aiops06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/850c8a2f-78cc-46c0-bb21-4f57bd7ae55e.png)


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

![aiops07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/08ef162e-28a0-420d-b53b-20cbb9ff5088.png)

するとSlackワークスペースがAmazon Q Developer in chat applicationsに表示されます。

![aiops08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/84340ad5-3b22-4c88-9981-585676a4b30a.png)


次に`新しいチャネルを設定`を選択して、チャネルを追加していきます。
設定名はお好きな名称を入力していただいて、Slackチャンネルは`プライベート`を選択し、SlackのチャンネルIDを入力します。

![aiops11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/886c1ad8-3d05-4b65-9f2e-b20e25b9805a.png)

チャネルIDはSlackチャンネルの詳細ページで確認できます。

![aiops12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/d0b7612f-1668-414e-ab62-b077f262962a.png)


今回、アクセス許可はロール名を設定した以外に以下を設定しました。
ポリシーテンプレート：`Amazon Qオペレーションアシスタントのアクセス許可`　を追加
チャネルガードポリシー：`AIOpsOperatorAccess` を追加

![aiops13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/1caa5846-0256-4daa-9c6a-17ab3450fd29.png)


通知の項目で先ほど作成したus-east-1のSNSトピックを選択します。
`設定`をクリックして完了させます。

![aiops14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/158fb23c-38ba-4969-8768-38b8b64b29c1.png)

チャネル設定が完了しました。

![aiops15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/12261043-81cb-46be-af5b-ab7695386a95.png)

設定済みチャネルの項目にある`テストメッセージを送信`をクリックすると、Slackに通知が入り、Amazon Qが登場しました。
![aiops20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/58b93dcd-57f2-4b6f-b42e-9af780d04f77.png)


## AI Operations設定
いよいよ、AI Operationsの設定を行っていきます。

Cloudwatchの画面に`AIオペレーション`があります。
![aiops01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/74bcee47-a5a7-4b85-8179-cd45bb9083ba.png)

まずは`設定`を選択して始めていきます。

ステップ1では、保持期間の指定などができます（デフォルト値90日）が、そのまま`次へ`をクリックします。
![aiops02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/82a399e0-fd9e-4e55-b149-595ec3bb8df2.png)

続いてステップ2でIAMロールの作成やX-Rayとの統合、Application Signalsとの連携もできるようになっています。今回はデフォルトのまま進めていきます。

![aiops03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/5ff9b436-4872-4413-9592-98cfc6e2a332.png)
![aiops04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/c10a5072-c295-4281-bf3f-ed91a062a05a.png)

最後にステップ3で、チケット発行システム統合（JiraとServiceNowが選べる）、チャット統合（Slack、Teams、chimeが選べる）が設定できるようになっています。

![aiops05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/ad5ec5cd-f8e4-4e2c-b93f-584d2ec6ccb0.png)

`SNSトピックを選択`をクリックして先ほど作成したトピックを選択します。
`セットアップを完了`を選択して完了です。
とてもシンプルです。
![aiops21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/47856c88-fa3e-442a-935f-163ea894b509.png)


## 今回、調査対象とした環境
Web3層構造をECSとAuroraの組み合わせで実現した形です。
フロントのALBの後ろにフロントエンドのコンテナタスク、内部ALBの後ろにバックエンドのコンテナタスク、さらにその後ろにAuroraがあるといった構成です。

![aiops700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/e2da3793-98e0-412d-b16b-bff48320dfa9.png)


Amazon CloudwatchメトリクスでAlarmを検知したことを契機にAmazon Q Developerを起動して自動で調査を開始するというものです。

![aiops701.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/5b4ed8fd-d0da-4331-b413-f6a976410109.png)

## Cloudwatch Alarm設定
調査開始の契機とするためのAlarmを作成します。

Cloudwatch Alarmの設定画面の最下段に「調査アクション - プレビュー」ができています。
「調査アクションの追加」をクリックすると、グループ選択の項目が出てきます。
ここで、`DefaultInvestigationGroup`を選択するのみです。
あとはこれまで通りのAlarm設定を行います。

![aiops30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/8eb0131b-e91e-4a62-a633-5a6ad4054257.png)


# 動作検証
それでは動作検証を始めていきます。
踏み台インスタンスからバックエンドのコンテナタスクに高負荷を掛けて、ユーザー側でリクエストに対するレスポンスを遅くしました。
ALB側のターンアラウンドタイムで閾値を超過したことを契機に、Cloudwatch Alarmが発報されました。
![aiops42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/85148d96-a4a7-4239-85a9-9e2b2814fecb.png)

## Amazon Q Developer Operational Investigations 起動！
調査の画面に遷移するとAlarm発報を契機にすでに調査が始まっていました。

![aiops41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/609c883e-0079-4e8c-90fa-2785c5aeeb44.png)

中身を見てみると以下の図のようなフィード欄（左側）と提案欄（右側）が表示されます。

![aiops43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/536a12fb-6a0d-4eb6-ba9b-b5606358ed5f.png)

右側の提案欄に表示された情報を「承諾」するか「破棄」するか、ボタン選択で決めていきます。
承諾した情報はフィード欄に表示される形となります。

![aiops44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/cf7cacaf-48a4-474a-8a1a-85ccc034fe76.png)


面白かった点として、全く関係ないリソースも提案に含まれてきました。
（画像は私が以前作って、同一リージョンで消し忘れていたDynamoDBのリソースです）

![aiops45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/fcd50823-67e0-443a-8a66-95f4b14e716c.png)


さて、10分弱で最初の分析結果が表示されました。

![aiops46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/e79b23e1-1e14-4755-8fe5-255eff8b7fe5.png)

以下、Google翻訳の結果です。

`内部の Application Load Balancer で TargetResponseTime が大幅に増加し、5 秒のしきい値を超えてアラームがトリガーされました。これは、さまざまなレイテンシー メトリック (InsertLatency、CommitLatency、SelectLatency) の急上昇とスループット メトリック (WriteIOPS、StorageNetworkReceiveThroughput) の低下によって証明された、RDS クラスターのパフォーマンス低下が原因でした。RDS ログでの接続の中止と ConnectionAttempts の急上昇が示すように、この問題は接続の問題によって悪化した可能性があります。このデータベース パフォーマンスの問題はバックエンド サービスに影響を及ぼし、システム全体の応答時間の増加を引き起こしました。`

中々、良い線をいっていますが、バックエンドのECSクラスタに関する言及はありませんでした。

さらに15分ほど経過した時点で追加の調査結果が表示されました。
アーキテクチャ図は提供していませんが、ECSのバックエンドサービスの高負荷について言及される形となりました。
![aiops47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/ae122514-4edd-4dd7-bdb7-4b0e68834d29.png)

以下、Google翻訳の結果です。

`ECS バックエンド サービスでは、データベース接続プールの飽和によりパフォーマンスが低下しました。これは、トラフィックの急激な増加によって RDS インスタンスへの接続試行が急増したことが原因と考えられます。この問題は、データベース操作のレイテンシの増加として現れ、挿入、コミット、および選択のレイテンシがすべて急増しました。ECS タスクではメモリ使用率とネットワーク受信バイトが増加し、RDS インスタンスでは書き込み IOPS が低下し、アクティブなトランザクションが増加しました。これらのパフォーマンスの問題により、イングレスおよび内部アプリケーション ロード バランサーの両方でターゲット応答時間が大幅に増加し、内部 ALB は 5 秒のしきい値を超えるとアラームをトリガーしました。`

ここまで最初のアラーム発生から30分弱です。

オンプレの場合、夜間に電話連絡をもらって、出社の準備をして家を出ようとする頃には調査結果が出てくることになります。すごいですよね。

# Slack連携
Amazon Q Developer in chatbot経由でSlackとの連携ができます。
先ほど実施したSNSトピックを経由してAmazon Q Developerからマネコンと同じ提案がSlackに投稿されます。
![aiops800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/03ddda9f-63d0-4662-b938-f5aa2520285b.png)

SlackでAmazon Q Developerから投稿された内容をAcceptかDiscardで選択していくのみです。とても簡単です。


# 気になる点
## クロスリージョン推論
ドキュメントを確認したところ、運用調査機能はクロスリージョン推論であることが明記されていました。
東京でクロスリージョン推論となる場合は、シドニーやムンバイとセットになります。
エンタープライズで国内リージョンの縛りがある方は気になるところですね。今後の国内リージョンでのクロスリージョンに期待です。

![aiops900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3925746/8f3c8dfa-12ff-4d2f-8543-59b428a4b4e7.png)

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Investigations-GetStarted.html#Investigations-GetStarted-Group

## コスト
プレビュー中のため、利用料金は不明です。
色々ログを読み取って、都度、推論が行われていると考えられますので、トークン量が少々心配です。
Amazon Q Developer for CLIのようにある一定までは無料というと始めやすいかなと感じています。
また、利用料課金となる場合でも、一般的なアラームは調査の対象外として、未知の障害、大規模障害に限定するなど使い所を考えれば課金も怖くないのではと考えています。

## 言語
現時点で全て英語なのが、運用担当者としてはハードルが高くなりますね。
Amazon Q Developer が順次日本語対応し始めていますので、東京でGAされる頃には日本語対応されることを期待しています。

# まとめ

　運用調査機能を扱ってみましたが、ログやメトリクスを読み取り、分析をして原因調査まで一連の運用担当者の作業を支援してくれます。使いこなせば、夜間の緊急経路対応の日も安心です。

　また、今回、AWS内のリソースを対象に実施しましたが、オンプレのリソースもCloudwatch Agentを利用してログやメトリクスを取得して、AWS上で監視を実施すれば、ある程度活用ができるのではないかと考えました。たとえシステムがオンプレにあったとしても、監視でAWSを利用することで効率化できるはず。あらゆる効率化の手段、可能性は考えていきたいですよね。
　オンプレ運用担当の方、諦めないでください。これから、まだまだ改善していく余地はあります。
 
 　Operational Investigationsについては、東京での早期GAを待ちたいと思います。
　この内容がオンプレ運用担当で悩むどなたかの参考になれば、幸いです。