Amazon Bedrock Agent x Platform Engineering = より柔軟なツール提供

こちらは[Platform Engineering Advent Calendar 2024](https://qiita.com/advent-calendar/2024/platform-engineering)の20日目の記事です。

2024年は、Platform Engineeringという言葉が浸透してきた1年だったと感じています。
最初は、勤め先のSREチームがプラットフォームチームへと名前を変更された際に、少し戸惑いを覚えました。
しかしその後、[『ちいさく始めるプラットフォームエンジニアリング』](https://techbookfest.org/product/h21RurMmFNU2Aee7Kg8Hh4?productVariantID=k2eLkqZic28carLXArVy6M)の執筆に参加する機会をいただき、プラットフォームエンジニアリングがとても身近なものに感じられるようになりました。

一方、2024年も生成AIのビッグウェーブは勢いが止まる様子を見せません。
Platform Engineering × 生成AIで何かできるのではないかと考えています:thinking:

## 課題

先日、生成AIを利用したアプリケーションをリリースする一週間前に、ビジネスサイトから以下のような依頼がありました：
- 既存プランを参考に、利用回数を制限したい。ただし、利用回数の追加については調整可能としたい
- この仕様は確定ではなく、今後トークン数で制限する可能性や、別の販売方法になる可能性もある
- とりあえず「いい感じ」に対応してほしい
![work_shigoto_osame_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/79c88879-b229-be3c-7808-8f308ec8b5f6.png)


これらの要件を満たすために、実装の方向性として大まかに以下のパターンが考えられます：

- 定期的に（決まった時間ごとに）プランごとの使用回数を付与するバッチを作成する。
- プランごとに使用回数の上限を設定する仕組みを作る。

共通の対応としては、個別の依頼が来た場合、以下の手順を検討しています：
- DBを直接修正する。
- または、簡易的な管理画面を作成し、管理メンバーに操作権限を付与して対応してもらう。

ただし、要件が今後変更される可能性を考えると、画面やバッチの実装に過度な工数をかけたくないと考えています。

最終的に、柔軟に対応できるツールや仕組みをビジネスサイトに提供できれば良いと考えました。
これが最善策とは言えませんが、運用上の要件を満たす妥協点として、以下のアーキテクチャを提案します。
![名称未設定ファイル.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/55f4be47-2345-3ad4-d529-24e994bf8d5d.png)


Amazon Bedrock Agentに、Chatシステムの使用回数を管理するためのAmazon DynamoDBを操作するアクションを用意しました。そして、AWS Chatbotを使ってSlackの管理者がいるチャンネルに連携する仕組みを構築しました。これだけで十分です。

エージェントの作り方については、尺の都合上、以下の記事をご参照ください。

https://qiita.com/Syoitu/items/45174f5cae5f4ce4fe12

今回のエージェントが利用するプロンプトは下記の通りです。

```text
あなたはChatシステムの各クライアントの使用回数を保存するDynamoDBを管理するAIアシスタントです。
以下の厳密な指示に従って対応します:

【質問種別と対応方法】 
1. 一般知識質問:
   - 保有する知識ベースから最も関連性の高い情報を提供
   - 情報の信頼性と正確性を最優先とする

2. DynamoDBの使用状況:
   - アクショングループに登録済みのListDynamoDBアクションを使用してデータを取得する
   - 見やすい形で回答する。

3. DynamoDBのデータ修正依頼:
   - 依頼にclient_idとusage_countの存在を確認する
   - 実施する前に、一度ユーザーに確認して、確認取れたら実行しましょう
   - 必須パラメータ:
     * client_id: [説明: ターゲットID]
     * usage_count: [説明: 使用回数]

【追加ルール】
- DynamoDBに関連性ないの雑談に対して冷めた口調で回答してください。
```

DynamoDBを操作する2つのLambdaの実装については、尺の都合上、省略させていただきます、見たいリクエストがあれば、のちに載せておきます:relaxed:

Amazon Bedrock上で検証したところ、予測通りにデータの取得と更新が正常に行われました:point_up_tone1:

![スクリーンショット 2024-12-14 23.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/3cf53be0-695b-b9d9-7958-b7666b274cf4.png)




![スクリーンショット 2024-12-14 23.33.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/f2553adc-6ed2-a585-595e-0cc3cfdd592a.png)

該当のDynamoDBを確認したところ、データが更新されていることを確認できました。

![スクリーンショット 2024-12-14 23.38.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/f7963067-cae4-00f0-335f-0334fc48e855.png)

作成したAmazon Bedrock AgentをノーコードでSlackに連携する詳しい方法については、@moritalousさんの記事をご参照ください。

https://qiita.com/moritalous/items/b63d976c2c40af1c39e5

`チャンネルID`はSlackの`連携したいチャンネル名`から、`コピー` -> `リンクのコピー`から取得できます。
![4E4BB809-076E-4DDB-B696-0382F1607723.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/6347f1da-28a6-87c0-550f-9491ea4d6650.jpeg)

それとチャンネルガードレールポリシーに作ったエージェント操作できるポリシーを付与してください。

![07A56F16-539A-4E17-A36E-AD5E524A2F58_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/2ac6422f-b27b-132b-f46a-ba51f5235162.jpeg)

この状態で作成して、できたチャンネルを選択して、中にあるチャンネルロールにも`BedrockFullAccess`を付与してください。

最後はAmazon Chatbotで連携したSlackチャンネルに入って、下記のコマンドで連携してください。

```
@aws connector add {コネクター名} {Bedrock agentのエージェント ARN} {Bedrock agentのエイリアスID}
```

テストしてみたら、やりたいことは上手くできたようです。:relaxed:
![2024-12-16 17.15の画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/ce962257-a5bd-9936-78fe-53fef8b802ea.jpeg)

![2024-12-16 17.19の画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/c3d3055e-d44f-a491-611f-d2e1173af0ed.jpeg)

## 最後に
一見するとこの記事Platform Engineeringとはあまり関係がないように思えるかもしれませんが、
`効果的なソフトウェア開発のためのツール`を提供することに焦点を当てることで、うまく結びつけられたのではないかと考えています...