Amazon Qでリソースについてチャットする機能がめちゃくちゃ便利だった

# はじめに
去年のre:Inventで発表された、Amazon Q Developerですが、先月[リソースについてチャットする機能がGA](
https://aws.amazon.com/jp/blogs/devops/chat-about-your-aws-account-resources-with-amazon-q-developer/)されました。

本機能を使うことで、チャットからAWSアカウントのリソース一覧を取得できたりなど、色々と使い道がありそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/102b5672-a35f-88ee-b4ff-7512bd291e50.png)
※[AWSブログ](https://aws.amazon.com/jp/blogs/devops/chat-about-your-aws-account-resources-with-amazon-q-developer/)より掲載

# 前提条件
本機能を利用するためには、次の[前提条件](https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/chat-actions.html)を満たす必要があります。

## 権限付与
チャットするユーザーに次の権限が必要です。
* q:SendMessage 
* q:StartConversation
* q:GetConversation
* q:ListConversations
* q:PassRequest
* 質問するリソースの表示に必要なアクセス許可（例えば、S3バケットを一覧表示する場合、s3:ListAllMyBucketsが必要です。)

## クロスリージョン同意
Amazon Qはバージニア北部からリソースにアクセスするため、同意が必要です。

同意をするには、Amazon Qのチャットを開いた状態で、設定ボタン(右上の歯車マーク)を押し、「I consent to cross-Region calls」にチェックを入れて、「Apply」をクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/dc2ae363-b9a5-f450-8701-fd1cddcc6914.png)

:::note
Amazon QのAPIコール履歴は、バージニア北部のCloud Trailに記録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/18174169-a831-ca56-e3d7-3388cb37ecd5.png)

:::

ちなみに、同意せずにリソースについて質問すると、クロスリージョン同意を促すチャットが返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/d243a77c-0e5c-b856-c1d8-eb29f488a5fb.png)

# 制限
本機能は無料で利用することができますが、リソースに関する回答取得は、[25件のクエリ/月の制限](https://aws.amazon.com/jp/q/developer/pricing/)があります。

# EC2インスタンスの一覧を取得してみる
[公式ドキュメント](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/chat-actions.html#ask-questions)にチャット例が載っていますので、素直にこの形で質問をしてみます。基本的に、リソースの一覧を取得する場合は、対象のリソースとリージョンを指定することでリソースの情報を取得してくれるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/b279961a-d369-abdd-ccbc-dcaf4f68ce3c.png)
※[公式ドキュメント](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/chat-actions.html#ask-questions)より掲載

「List my EC2 instances in ap-northeast-1」と質問をしてみると、正しい回答が返ってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/0a9d54cf-075c-99f9-bdf7-063b704b0297.png)


更に、特定インスタンスの詳細について聞いてみましょう。「Please tell me detail of the {Instance Id}」と質問をしてみます。すると、次の情報が返ってきました。
* インスタンスタイプ
* イメージID
* セキュリティグループ
* サブネットID
* アタッチされているボリューム
* アタッチされているIAMロール
* インスタンスの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/394f0a1b-473b-3940-f21a-124e6ac15dd5.png)
※対象のEC2は削除しているが、サブネットとIAMロールは利用しているためマスキング

簡単に対象リソースの概要を知りたいときに使えそうですね。

:::note
権限のないリソースについてチャットをした場合、必要な権限が不足していることを教えてくれます。本機能はとても便利ですが、しっかりと権限管理していく必要がありそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/90c35e57-c8d1-420b-ac0e-08ee501e75d1.png)

:::


# 使われていないEBSボリュームと作成者を特定する
続いては、使われていない(=アタッチされていない)EBSボリュームと作成者を特定できるか試してみます。私の所属している部門では、AWSアカウントを検証環境として使うことが多いのですが、度々アタッチされていないボリュームが放置されているので、これができるとめちゃくちゃ便利です。

最初に、DemoNoAttachという名前でアタッチされていないEBSボリュームを作っておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/f830a5a6-6c91-7a1d-52a2-09d132692c8f.png)

これで準備万端です。満を持して、Amazon Qにチャットしていきます。最初は、List my EBS volume with no Instance in ap-northeast-1とチャットしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/3c093c9b-159f-f711-6253-d18f0deece3c.png)

あれ、うまくいかない。。。作ってすぐのリソースは反映されないかな？と思いましたが、何度試してもダメでした。

次に、「List my unattached EBS volume in ap-northeast-1」とチャットしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/f271bf6a-aa9a-7747-49cd-a6c8a3d2a09d.png)

するとちゃんと結果が返ってきました。やはり、指示の仕方が大切なようです。

ここから、対象ボリュームの作成者を質問するだけだと思ったのですが、めちゃくちゃ苦戦します。色々な質問をしてみますが、中々目当ての回答が返ってきません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/2dcac81f-5b18-0c40-5e30-a9757fc622cf.png)

次のようなチャットを試してみましたが、全滅。。。
* Who create {Volume Id}
* Please tell me who create {Volume Id}
* Please tell me the userName of {Volume Id}
* Please tell me user name that created the EBS volume {Volume Id}
* Please tell me the detail of {Volume Id}
* please findout who create {Volume Id} in ap-northeast-1

ちなみに、EC2インスタンスだと「Please tell me who create {Instance Id}」で作成者を特定できたので、恐らくAPIの仕様によるものだと推測します。(スクリーンショットは取り忘れた)

なので、方向を変えてCloud Trailのイベントから情報を取得してみることに。色々錯誤していき、中々惜しいラインまでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/a958175b-7d2e-163f-4cdf-48c879b9c57e.png)

View JSONの中身を確認すると、CreateVolumeのイベントは取ってこれているので、後ちょっとのはず。Cloud Trailのイベントを取ってこれているので、AWS CLIのコマンドに近い形でフィルターを指示すればいけるか？と思い試してみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3075801/395e4956-377e-9a80-66d8-18af8f6db99e.png)

いけました！！
少し複雑ですが、このようにチャットすると特定ができるようです。
```
list cloud trail resources with "EventName": "CreateVolume" and query 'Events[?Resources[?ResourceName=={Volume Id}]] in ap-northeast-1
```

# さいごに
本機能は無料なので、使いこなせるとかなり普段の作業が捗りそうです。今後も色々な使い方を模索していきたいと思います。