failure-analysis-assistant (FA2) で AIops を実現する

# FA2

https://aws.amazon.com/jp/blogs/news/failure-analysis-assistant-aiops/

https://github.com/aws-samples/failure-analysis-assistant

- AI/ML を活用した障害分析の効率化を行います
- 従来の手動分析の課題を克服するために、LLM を使用して、ログやトレースなどのテレメトリデータを分析し、迅速な障害特定と原因究明を実現します

# Slack App 版と Chatbot Custom Action 版

- Failure Analysis Assistant (FA2) Slack App 版

https://github.com/aws-samples/failure-analysis-assistant/blob/main/README.md#failure-analysis-assistant-fa2

- Failure Analysis Assistant (FA2) AWS Chatbot Custom Action 版

https://github.com/aws-samples/failure-analysis-assistant/blob/chatbot-customaction/README.md#failure-analysis-assistant-fa2-aws-chatbot-custom-action-%E7%89%88

Slack App 版と Chatbot Custom Action 版の 2 つが存在する。
それぞれ、Git の構成図を見ればわかるが、
　前者は API Gateway 経由でリクエスト・レスポンスを返し、SLack へ送る。
　後者は Slack から Lamaba を呼び出し、回答内容は SNS トピック経由で、Chatbot を通じ、Slack に送られる。

回答内容はいずれも変わらない。今回は前者の方法で実装する。

# サンプルアプリケーションの作成

サンプルアプリケーションの作成は本題ではありませんので、基本的にドキュメントを参考にします。
既に Slack に通知するワークフローが存在する場合は不要です。

## サーバレスアプリケーションの作成

今回はテスト用に適当な SAM アプリケーションを準備しておきました。
sam init 「1 - AWS Quick Start Templates」 の 「7 - Serverless API」です。
API Gateway ＋ Lambda ＋ DynamoDB のお決まりパターンです。

```
$ sam init

You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.

Which template source would you like to use?
        1 - AWS Quick Start Templates
        2 - Custom Template Location
Choice: 1

Choose an AWS Quick Start application template
        1 - Hello World Example
        2 - Data processing
        3 - Hello World Example with Powertools for AWS Lambda
        4 - Multi-step workflow
        5 - Scheduled task
        6 - Standalone function
        7 - Serverless API
        8 - Infrastructure event management
        9 - Lambda Response Streaming
        10 - Serverless Connector Hello World Example
        11 - Multi-step workflow with Connectors
        12 - GraphQLApi Hello World Example
        13 - Full Stack
        14 - Lambda EFS example
        15 - DynamoDB Example
        16 - Machine Learning
Template: 7
```

## SNS トピックの作成

Chatbot と連携するための SNS トピックを作成しておきます。

https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-create-topic.html

## Chatbot の作成

Chatbot 作成し、先程作成した SNS トピックとサブスクライブします。

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

## CloudAlarm の作成

AWS/ApiGateway で 5XXError が発生した場合にアラートを出すように CloudAlarm を作成し、アクションには先程作成した SNS トピックを指定します。

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

## Chatbot から Slack にアラームへの通知確認

念の為、Chatbot から Slack にアラームの通知が来ていることを確認しておきましょう。

![スクリーンショット 2024-08-01 18.32.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/1865b1af-611d-a5f4-3f4f-2b5e6c388363.png)

これで、サンプルアプリケーションの準備が整いました。

# Athena テーブル

## データベースの作成

「aiops_db」というデータベースを作成しておきます。

```
CREATE DATABASES aiops_db;
```

## ALB テーブルの作成 

DDL で「alb_access_logs」というテーブルを作成しておきます。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/application-load-balancer-logs.html#create-alb-access-logs-table-partition-projection

## CloudTrail テーブルの作成 

DDL で「cloud_trail_logs」というテーブルを作成しておきます。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/application-load-balancer-logs.html#create-alb-access-logs-table-partition-projection

# API Gateway の準備

## API Gateway での CloudWatch ログ記録

AWS re:Post にある「解決策」を参考に、
[CloudWatch へのログ記録用の IAM ロールを作成する]と
[API ゲートウェイコンソールに IAM ロールを追加する]
を実施し、API Gateway が CloudWatch にログを送れるようにしておきます。

https://repost.aws/ja/knowledge-center/api-gateway-cloudwatch-logs

# Bedrock の準備

## Bedrock モデルアクセスの有効化

モデルアクセスを追加しておきます。

Git では、「Claude v3 Sonnet のアクセス許可をしていること」と書かれていますが、2024/08/01 現在、東京リージョンでは Claude v3 Sonnet に未対応となりますので、**Claude v2.1** を使います。

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/model-access.html

# Slack App 設定 1

## Slack App の登録

Git の手順にある通り Slack App の登録を行います。

https://github.com/aws-samples/failure-analysis-assistant?tab=readme-ov-file#slack-app-%E3%81%AE%E7%99%BB%E9%8C%B2

# パラメータ

## parameter.ts の設定

parameter.ts を自身の環境に合わせて修正していきます。
**modelId** は先に説明した通り、Claude v2.1 を使いますので、Claude v2.1 の **modelId** にします。
**cwLogsLogGroups** は Lamnda と API Gateway の CloudWatch ログを指定しました。

```parameter.ts
export const devParameter: AppParameter = {
  env: {
    account: "<アカウントID>",
    region: "ap-northeast-1",
  },
  language: "ja",
  envName: "Development",
  modelId: "anthropic.claude-v2:1",
  cwLogsLogGroups: [
    "/aws/lambda/aiops-app-putItemFunction-H1cPrneg0xhR", 
    "/apigateway/aiops-app",   
  ],
  // It's just sample query. Please you optimize to your situation.
  cwLogsInsightQuery: "fields @message | limit 100",
  databaseName: "aiops_db",
  albAccessLogTableName: "alb_access_logs",
  cloudTrailLogTableName: "cloud_trail_logs",
  xrayTrace: true,
};
```

https://github.com/aws-samples/failure-analysis-assistant?tab=readme-ov-file#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E8%A8%AD%E5%AE%9A

# デプロイ

## cdk deploy

通常の CDK のデプロイと同じようにデプロイします

```
$ npm install
$ npx cdk deploy --all --require-approval never
```

https://github.com/aws-samples/failure-analysis-assistant?tab=readme-ov-file#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E8%A8%AD%E5%AE%9A

# Slack App 設定 2

## Slack App の設定

Git の手順にある通り Slack App の設定を行います。

https://github.com/aws-samples/failure-analysis-assistant?tab=readme-ov-file#slack-app-%E3%81%AE%E8%A8%AD%E5%AE%9A

## Slack App を Slack チャネルに追加

Git の手順にはありませんでしたが、Slack App を Slack チャネルに参加させる必要があります。該当のチャンネルで、<@アプリ名>を入力させることで参加させることができます。

![スクリーンショット 2024-08-02 18.47.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d10ba073-bcd1-ea21-b28e-1b051d881fd3.png)

# テスト

## テストシナリオ

CloudWatch アラームを発生させるために Dynamo DB に対してProvisionedThroughputExceededException エラーを意図的に発生させました。

## CloudWatch アラーム

CloudWatch アラームを発生させ、Slack に通知がきたことを確認します。これは、API Gateway で 5XXエラーが発生したことを意味します。

![スクリーンショット 2024-08-02 18.23.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d8e7896f-c80e-e1c0-ff1e-24b19bd4c05c.png)

## リクエスト

「エラーの通知内容（アラーム）の内容」を入力し、「ログ取得の開始時間」を入力します。「ログ取得の開始時間」は Slack に通知された時間が自動入力されるのでそのままで良いでしょう。

![スクリーンショット 2024-08-02 14.17.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/5a1ec408-3bac-4741-adf4-32101cbd7099.png)

## レスポンス

「FA２ によるエラーの原因の仮説」で意図した回答が得られました。
CloudWatch ログは CloudWatchLogs Insight を利用して、
S3 は Athena を利用して情報が収集されます。
![スクリーンショット 2024-08-02 18.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/366ec036-df1c-aba1-a10e-cd6d92b9b4af.png)
![スクリーンショット 2024-08-02 18.26.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a678fe71-6032-0188-ba8d-203dd05d6c56.png)
![スクリーンショット 2024-08-02 18.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/958bd81f-e124-176a-db52-c6b09fdd4fb2.png)

# セキュリティ

Git に書かれている通り、Slack のエンドポイントはパブリックに公開されているため、攻撃対象となる可能性があります。 そのため、API Gateway に対し、WAF をアタッチするなど考慮する必要があります。

https://github.com/aws-samples/failure-analysis-assistant?tab=readme-ov-file#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85