Kiroに自然言語で依頼するだけでAWSリソース一覧を取得することができる環境をつくってみた

こんにちは。SCSK渡辺(大)です。

今年は秋刀魚が非常に美味しいですね。
水揚げ量が昨年の2倍らしいので、まだまだ楽しめそうです。

何をつくったのか

Kiroに自然言語で依頼するだけでAWSリソース一覧を取得することができる環境 をつくりました。

サンプル:実行画面



 

完了するとMarkdown形式のテキストファイルが出来上がります。

 

サンプル:IAMユーザーの一覧

Kiroへの依頼は「IAMユーザーの一覧を取得して」というだけです。

注意事項を教えてくれました。

サンプル:EC2インスタンスの一覧(全リージョン)

Kiroへの依頼は「全リージョンのEC2インスタンスの一覧を取得して」というだけです。
リージョンのアクセス制限まで結果として出力してくれました。
テーブル形式で出力するようsteeringで指定しているのですが上手くいきませんでした。
内容は整理されていますね。

こちらも注意事項を教えてくれました。

サンプル:特定タグが付いたリソースの一覧

Kiroへの依頼は「[key]=[value]タグのリソース一覧を取得して」というだけです。

プロジェクト分析してくれました。

 

嬉しいポイント

ほぼ自然言語で設定できるのでノンエンジニアの人でも安心
本機能を利用するためにAWS上でシステム環境を構築する必要がない
AWSCLIのコマンドリファレンスの内容が変わっても対応できる

やったこと

Kiroで以下を設定しました。

  • Agent Steering
  • Trusted commands
  • MCP Servers

その他、以下も設定しました。

  • listHistoryフォルダの作成
  • AWSCLIのcredentialsファイルを設定

Kiroの各種設定

Agent Steering

ファイル名は任意です。
私は「instructions.md」にしました。
「–profile sts」を付けるように指示している理由は参考記事をご参照ください。

---
inclusion: always
---
# AWS CLI 利用ガイドライン
## 1. 概要
AWS を使用した開発プロジェクト全般に適用するガイドライン。
## 2. 操作規則
### 2.1 基本設定
| 項目         | 設定値                          | 説明                                             |
| ------------ | ------------------------------- | ------------------------------------------------ |
| プロファイル | `--profile sts`                 | MFA 生成用プロファイル(固定)                   |
| リージョン   | `--region <region>`             | 必須パラメータ(グローバルサービスは us-east-1) |
| 出力形式     | `--no-cli-pager --output table` | リストコマンド用                                 |
### 2.2 コマンド履歴管理
**保存場所**: `listHistory/` ディレクトリ
**ファイル名形式**: `YYYYMMDDHHMMSS_service-resource_region.md`(日時は'echo %date% %time%'で取得する)
**構成**: サマリー → 実行コマンド → 出力結果(AWS CLI 出力は必ずテーブル形式のまま保存)
**重要**: AWS CLI の`--output table`で取得した結果は、テーブル形式のまま履歴ファイルに記録すること
**履歴ファイル記録ルール**:
1. 実行したコマンドをそのまま記録
2. AWS CLI のテーブル出力結果を整形せずそのままコピー
3. サマリーは別途作成するが、元の出力も必ず保持
4. 注意すべきことなどのコメントを付ける
### 2.3 実行前検証プロセス
**必須**: AWS CLI コマンド実行前に以下を **必ず順番通りに** 実行する:
#### ステップ 1: コマンド調査(必須)
- **ツール**: `mcp_tavily_remote_mcp_tavily_search`
- **目的**: 最新のコマンド情報、ベストプラクティス、既知の問題を確認
- **実行例**: `"AWS CLI iam list-users command latest syntax examples"`
#### ステップ 2: 構文確認(必須)
- **ツール**: `mcp_awslabs_aws_documentation_mcp_server_search_documentation` → `mcp_awslabs_aws_documentation_mcp_server_read_documentation`
- **目的**: AWS 公式ドキュメントで正確な構文とパラメータを検証
- **確認項目**: 必須パラメータ、オプションパラメータ、出力形式
#### ステップ 3: パラメータ検証(必須)
- **確認項目**:
  - 必須パラメータの有無
  - リージョン要件(IAM はグローバルサービス = us-east-1)
  - プロファイル設定(`--profile sts`)
  - 出力形式(`--output table --no-cli-pager`)
#### ステップ 4: 影響範囲確認(必須)
- **確認項目**:
  - 対象リソースの範囲
  - 実行に必要な権限
#### ステップ 5: 実行許可(必須)
- **条件**: 上記ステップ 1-4 が全て完了した場合のみ実行
- **実行形式**: `aws <service> <operation> --profile sts --region <region> --output table --no-cli-pager`
**重要**: この検証プロセスを省略した場合、コマンド実行は禁止
2.2でテーブル形式で記録するよう依頼しているのですが上手くいかないことがあります。
2.3のステップ5で実行形式を指定していても稀に違う形式でKiroが実行しようとします。その場合はKiroが実行しようとしたコマンドをユーザーが手動でTrustしてあげてください。

Trusted commands

設定>Trusted Commands から登録するよりも、Ctr+Shift+P(Windows)を押して「>基本設定: ユーザー設定を開く (JSON)」と入力して開き、”kiroAgent.trustedCommands”に以下を追加するほうが早いです。
すべてのコマンドを網羅できていない可能性がありますので、必要に応じて追加してご利用ください。

  "kiroAgent.trustedCommands": [
    "cd *",
    "ls",
    "dir",
    "pwd",
    "cat *",
    "type *",
    "echo *",
    "aws ec2 describe-instances *",
    "aws ec2 describe-vpcs *",
    "aws ec2 describe-subnets *",
    "aws ec2 describe-security-groups *",
    "aws ec2 describe-key-pairs *",
    "aws ec2 describe-images *",
    "aws ec2 describe-regions *",
    "aws ec2 describe-snapshots *",
    "aws ec2 describe-volumes *",
    "aws ec2 list-images *",
    "aws ec2 get-console-output *",
    "aws s3 ls *",
    "aws s3 head-object *",
    "aws s3 get-object-attributes *",
    "aws s3api list-buckets *",
    "aws s3api head-bucket *",
    "aws s3api get-bucket-location *",
    "aws s3api get-bucket-region *",
    "aws s3api get-bucket-versioning *",
    "aws s3api get-bucket-encryption *",
    "aws s3api get-bucket-cors *",
    "aws s3api get-bucket-lifecycle-configuration *",
    "aws s3api get-bucket-policy *",
    "aws s3api get-bucket-policy-status *",
    "aws s3api get-bucket-acl *",
    "aws s3api get-bucket-website *",
    "aws s3api get-bucket-logging *",
    "aws s3api get-bucket-notification-configuration *",
    "aws s3api get-bucket-replication *",
    "aws s3api get-bucket-request-payment *",
    "aws s3api get-bucket-tagging *",
    "aws s3api get-bucket-accelerate-configuration *",
    "aws s3api get-bucket-analytics-configuration *",
    "aws s3api get-bucket-inventory-configuration *",
    "aws s3api get-bucket-metrics-configuration *",
    "aws s3api get-bucket-ownership-controls *",
    "aws s3api get-bucket-intelligent-tiering-configuration *",
    "aws s3api get-public-access-block *",
    "aws s3api get-account-public-access-block *",
    "aws s3api list-objects *",
    "aws s3api list-objects-v2 *",
    "aws s3api list-object-versions *",
    "aws s3api list-multipart-uploads *",
    "aws s3api list-parts *",
    "aws s3api head-object *",
    "aws s3api get-object-attributes *",
    "aws s3api get-object-acl *",
    "aws s3api get-object-legal-hold *",
    "aws s3api get-object-lock-configuration *",
    "aws s3api get-object-retention *",
    "aws s3api get-object-tagging *",
    "aws s3api presign *",
    "aws s3api list-bucket-analytics-configurations *",
    "aws s3api list-bucket-inventory-configurations *",
    "aws s3api list-bucket-metrics-configurations *",
    "aws s3api list-bucket-intelligent-tiering-configurations *",
    "aws lambda list-functions *",
    "aws lambda get-function *",
    "aws lambda get-function-configuration *",
    "aws iam list-users *",
    "aws iam list-roles *",
    "aws iam list-policies *",
    "aws iam get-user *",
    "aws iam get-role *",
    "aws iam get-policy *",
    "aws rds describe-db-instances *",
    "aws rds describe-db-clusters *",
    "aws rds describe-db-snapshots *",
    "aws cloudformation list-stacks *",
    "aws cloudformation describe-stacks *",
    "aws cloudformation describe-stack-resources *",
    "aws logs describe-log-groups *",
    "aws logs describe-log-streams *",
    "aws dynamodb list-tables *",
    "aws dynamodb describe-table *",
    "aws apigateway get-rest-apis *",
    "aws apigateway get-resources *",
    "aws sns list-topics *",
    "aws sqs list-queues *",
    "aws route53 list-hosted-zones *",
    "aws cloudwatch list-metrics *",
    "aws cloudwatch describe-alarms *",
    "aws sts get-caller-identity *",
    "aws resourcegroupstaggingapi get-resources *",
    "aws resourcegroupstaggingapi get-tag-keys *",
    "aws resourcegroupstaggingapi get-tag-values *",
    "aws elbv2 describe-load-balancers *",
    "aws elbv2 describe-target-groups *",
    "aws autoscaling describe-auto-scaling-groups *",
    "aws ssm describe-parameters *",
    "aws ssm get-parameter *",
    "aws ssm get-parameters *",
    "aws secretsmanager list-secrets *",
    "aws secretsmanager describe-secret *",
    "aws kms list-keys *",
    "aws kms describe-key *",
    "aws cloudtrail describe-trails *",
    "aws config describe-configuration-recorders *",
    "aws organizations list-accounts *",
    "aws organizations describe-organization *",
    "aws support describe-cases *",
    "aws pricing get-products *",
    "aws ce get-cost-and-usage *",
    "aws budgets describe-budgets *"
  ],

「IAMで参照権限だけにして、Trusted commands は aws * だけ設定すれば良いのでは?」とも考えたのですが、それだとIAMに想定外の権限が付与されてしまっていた場合に、想定外のリソース操作が行われてしまうので採用しませんでした。Trusted commandsで参照系のコマンドだけを設定しておけば、IAMで参照権限以外の権限が付与されていても、Kiroが実行しようとしたコマンドをユーザーが手動でTrustしない限りは、想定外のリソース操作が行われることはないはずです。

MCP Servers

tavily-mcpはAPIキーの取得が必要です。
環境変数で渡すほうが安全です。
{
  "mcpServers": {
    "aws-knowledge-mcp-server": {
      "command": "uvx",
      "args": [
        "mcp-proxy",
        "--transport",
        "streamablehttp",
        "https://knowledge-mcp.global.api.aws"
      ],
      "env": {
        "FASTMCP_LOG_LEVEL": "ERROR",
        "AWS_PROFILE": "default",
        "AWS_REGION": "us-east-1",
      },
      "disabled": false,
      "autoApprove": ["aws___search_documentation", "aws___read_documentation"]
    },
    "tavily-remote-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://mcp.tavily.com/mcp/?tavilyApiKey=[取得したAPIキー]"
      ],
      "disabled": false,
      "autoApprove": ["tavily_search", "tavily_extract"]
    }
  }
}

関連記事

感想

本記事の内容はKiroにプログラミングを組んでもらったというわけではないので、AWSが意図した使い方になっているのか分かりませんが、ソフトウェア開発以外の使い道があるのは良いですね。

いつかKiroがAgent Hooksなどでスケジュール起動できるようになったら、本記事の内容を1時間おきに実行させるようにすることで、ほぼリアルタイムで最新の一覧が取得できるようになりますね。夢が広がります。

タイトルとURLをコピーしました