こんにちは。デジタルイノベーション推進室の戦闘員Oです。


前回「Kiroのステアリングファイル入門」では、ブログ執筆を効率化するためのルール作成方法をご紹介しました。

 

ステアリングファイルは強力な機能ですが、「ガイドラインを提示する」ことはできても、「外部ツールを実行する」ことはできませんでした。


今回は、その限界を超える「Kiro Power」という機能を使って、CloudFormationのセキュリティチェックを自動化する方法を解説します。


実際にIaC検証Powerを作成しながら、ステアリングファイルとの違いを実感していただけます。

アジェンダ

1.    今回のゴール:IaC検証Powerの作成
2.    ステアリングファイルとKiro Powerの違い
3.    MCP(Model Context Protocol)とは?
4.    IaC検証Powerの設計
5.    IaC検証Powerの実装
6.    Powerの動作確認
7.    チームメンバーへの配布
8.    まとめ

1. 今回のゴール:IaC検証Powerの作成

今回は、CloudFormationテンプレートのセキュリティチェックを自動化する「IaC検証Power」を作成します。


達成したいこと
•    cfn-lintとcfn-nagを使ったセキュリティチェックの自動化
•    Kiroから外部ツールを直接実行できるようにする
•    チームメンバーに配布できるPowerを作成する
•    ステアリングファイルとの違いを理解する

完成イメージ

ユーザー:「このCloudFormationファイルをチェックして」 Kiro:cfn-lintとcfn-nagを実行 → 結果を解析 → 問題を指摘

図:Power使用イメージ
拡大
図:Power使用イメージ

なぜKiro Powerが必要なのか?
前回のステアリングファイルでは、「セキュリティグループで 0.0.0.0/0 を許可しないこと」というルールを提示できました。


しかし、実際にファイルをチェックして問題を見つけることはできませんでした。


Kiro Powerを使えば
•    実際にcfn-lintやcfn-nagを実行できる
•    チェック結果を自動的に解析できる
•    問題箇所を具体的に指摘できる
•    修正案を提示できる

2. ステアリングファイルとKiro Powerの違い

まず、2つの機能の違いを明確にしましょう。

 

2-1. 比較表で理解する

項目 ステアリングファイル Kiro Power
目的 Kiroの振る舞いを制御 新しい機能を追加
実現できること ルール提示、ガイドライン、文体統一 外部ツール実行、API連携、コード解析
配置場所 `.kiro/steering/*.md` `.kiro/powers/` + MCPサーバー
ファイル形式 Markdown JSON設定 + プログラムコード
共有方法 Gitで管理 Powerパッケージとして配布
難易度 簡単(対話で作成可能) 中級(プログラミング必要)
適用タイミング 常時/条件付き/手動 ユーザーが明示的に呼び出し

 

2-2. 具体例で理解する
ステアリングファイルの例:

[markdown] # CloudFormationのルール - セキュリティグループで 0.0.0.0/0 を許可しないこと - S3バケットは必ず暗号化すること

→ Kiroがこのルールを「覚えている」だけ
→ コード生成時にルールに沿った提案をする

Kiro Powerの例:

ユーザー:「このCloudFormationファイルをチェックして」 Kiro:cfn-lintを実行 → 結果を解析 → 問題を指摘

→ Kiroが実際に「ツールを実行」する
→ 既存のファイルをチェックできる
 

図:ステアリングファイルとPowerの比較
拡大
図:ステアリングファイルとPowerの比較

2-3. どちらを使うべきか?
ステアリングファイルが適している場面
•    コーディング規約の統一
•    文体やスタイルの統一
•    プロジェクト固有の知識共有
•    ガイドラインの提示


Kiro Powerが適している場面
•    外部ツールとの連携
•    既存コードの検証
•    API呼び出し
•    複雑な処理の自動化


ポイント
•    どちらが優れているわけではなく、用途が違います。
•    両方を組み合わせることで、最大の効果が得られます!

3. MCP(Model Context Protocol)とは?

Kiro Powerの基盤となるMCPについて理解しましょう。

 

3-1. MCPの概念
MCP = Model Context Protocol
•    AIと外部ツールをつなぐ標準的な仕組み
•    Kiroが外部の機能を使えるようにするプロトコル
•    オープンスタンダードで、様々なツールと連携可能


なぜMCPが必要なのか?
Kiro単体では、以下のことができません
•    ファイルシステムへのアクセス
•    外部コマンドの実行
•    APIの呼び出し
•    データベースへのアクセス


MCPを使うことで、これらの機能をKiroに追加できます。


3-2. MCPサーバーとは?
MCPサーバー
•    外部ツールをKiroから使えるようにするプログラム
•    Python、Node.jsなどで実装できる
•    「ツール」という単位で機能を提供

図解:

Kiro IDE ↓ (MCPプロトコル) MCPサーバー ↓ 外部ツール(cfn-lint、cfn-nag等)

図:MCPアーキテクチャ
拡大
図:MCPアーキテクチャ

3-3. Kiro Powerの構成
Kiro Powerは、以下の要素で構成されます

ファイル 役割 形式
POWER.json Power設定ファイル JSON
POWER.md ドキュメント Markdown
mcp-server/ MCPサーバー本体 Python/Node.js
requirements.txt 依存関係(Python) テキスト

フォルダ構造:

.kiro/powers/iac-validator/ ├── POWER.json # Power設定ファイル ├── POWER.md # ドキュメント └── mcp-server/ ├── server.py # MCPサーバー本体 └── requirements.txt # Python依存関係

図:ファイル構造
拡大
図:ファイル構造

ポイント
•    MCPは難しそうに見えるが、基本は「外部ツールを呼び出すだけ」
•    Pythonの基本的な知識があれば作れる
•    既存のMCPサーバーを参考にできる

4. IaC検証Powerの設計

実際に作成するPowerの仕様を決めましょう。

 

4-1. チェックしたいルール
セキュリティルール(AWS基礎セキュリティのベストプラクティス)

チェック項目 内容 重要度 使用ツール
セキュリティグループ 0.0.0.0/0 を許可していないか cfn-nag
S3バケット パブリックアクセスが無効か cfn-nag
S3バケット 暗号化が有効か cfn-nag
RDS 暗号化が有効か cfn-nag
構文チェック CloudFormationの構文が正しいか cfn-nag

 

4-2. 使用するツール
cfn-lint(CloudFormation Linter)
•    CloudFormationテンプレートの構文チェック
•    リソースプロパティの検証
•    ベストプラクティスの確認

インストール:

[bash] pip install cfn-lint

cfn-nag(CloudFormation NAG)
•    セキュリティ脆弱性のスキャン
•    AWS基礎セキュリティのベストプラクティスチェック
•    潜在的なセキュリティリスクの検出

インストール:

[bash] gem install cfn-nag

図:Power設計
拡大
図:Power設計

4-3. Powerが提供する機能(ツール)
今回作成するPowerは、シンプルに2つのツールを提供します

ツール名 機能 入力 出力
check_cloudformation cfn-lintとcfn-nagを実行 ファイルパス ファイルパス
list_resources テンプレート内のリソース一覧 ファイルパス リソースリスト

 

ポイント
•    まずはシンプルな機能から始める
•    後から機能を追加できる
•    エラーハンドリングを忘れずに

5. IaC検証Powerの実装

それでは、実際にPowerを作成していきましょう。

5-1. 環境準備
必要なツールのインストール:

[bash] # Python環境(Python 3.9以上) python --version # FastMCPライブラリとその他の依存関係 pip install fastmcp pyyaml cfn-lint # cfn-nagのインストール(Rubyが必要) gem install cfn-nag

インストール確認:

[bash] # Pythonの確認 python --version # cfn-lintの確認 cfn-lint --version # cfn-nagの確認 cfn_nag --version # FastMCPの確認 python -c ""import mcp.server.fastmcp; print('FastMCP installed')""

表形式で整理

ツール インストールコマンド 確認コマンド 用途
Python 3.9+ (事前インストール) `python --version` MCPサーバーの実装を簡略化
FastMCP `pip install fastmcp` `python -c "import mcp.server.fastmcp"` MCPサーバーの実装を簡略化
PyYAML `pip install pyyaml`  `python -c "import yaml"` YAMLファイルの解析
cfn-lint `pip install cfn-lint`     `cfn-lint --version` CloudFormation構文チェック
cfn-nag `gem install cfn-nag` `cfn_nag --version` セキュリティスキャン
Ruby (cfn-nag用) `ruby --version` cfn-nagの実行環境

 

重要な注意事項
•    Python 3.9以上が必要(FastMCPの要件)
•    FastMCPライブラリがMCPプロトコルの実装を担当
•    cfn-nagはRuby gemなので、Rubyのインストールが必要

5-2. POWER.json の作成
ファイル: .kiro/powers/iac-validator/POWER.json

[json] { ""name"": ""iac-validator"", ""displayName"": ""IaC Validator"", ""version"": ""1.0.0"", ""description"": ""CloudFormationテンプレートのセキュリティチェックを自動化"", ""keywords"": [""cloudformation"", ""iac"", ""security"", ""aws"", ""cfn-lint"", ""cfn-nag""], ""mcpServers"": { ""iac-checker"": { ""command"": ""python"", ""args"": [""mcp-server/server.py""], ""env"": {} } } }

各項目の説明

項目 説明
name Power識別子(英数字とハイフン) iac-validator
displayName 表示名(日本語可) IaC Validator
version バージョン番号 1.0.0
description Powerの説明 CloudFormationテンプレートの...
keywords 検索用キーワード ["cloudformation", "iac"...]
mcpServers MCPサーバー定義 サーバー名とコマンド
command 実行コマンド python
args コマンド引数 ["mcp-server/server.py"]

 

5-3. MCPサーバーの実装(server.py)
ファイル: .kiro/powers/iac-validator/mcp-server/server.py
完全な実装:

[python] #!/usr/bin/env python3 """""" IaC Validator MCP Server CloudFormationテンプレートのセキュリティチェックを自動化 """""" import logging import os import subprocess import sys from typing import Dict, Any from mcp.server.fastmcp import FastMCP # ロギング設定 name = ""iac-validator"" logging.basicConfig( level=logging.INFO, format='%(name)s - %(levelname)s - %(message)s', handlers=[logging.StreamHandler()] ) logger = logging.getLogger(name) # MCPサーバーの作成 port = int(os.environ.get('PORT', 8080)) mcp = FastMCP(name, logger=logger, port=port) def run_cfn_lint(file_path: str) -> Dict[str, Any]: """""" cfn-lintを実行してCloudFormationテンプレートをチェック Args: file_path: チェックするファイルのパス Returns: チェック結果の辞書 """""" try: result = subprocess.run( ['cfn-lint', file_path], capture_output=True, text=True, timeout=30 ) return { ""success"": result.returncode == 0, ""output"": result.stdout, ""errors"": result.stderr, ""returncode"": result.returncode } except subprocess.TimeoutExpired: return { ""success"": False, ""error"": ""cfn-lintの実行がタイムアウトしました"" } except FileNotFoundError: return { ""success"": False, ""error"": ""cfn-lintが見つかりません。インストールしてください。"" } except Exception as e: return { ""success"": False, ""error"": f""エラーが発生しました: {str(e)}"" } def run_cfn_nag(file_path: str) -> Dict[str, Any]: """""" cfn-nagを実行してセキュリティチェック Args: file_path: チェックするファイルのパス Returns: チェック結果の辞書 """""" try: result = subprocess.run( ['cfn_nag_scan', '--input-path', file_path], capture_output=True, text=True, timeout=30 ) return { ""success"": result.returncode == 0, ""output"": result.stdout, ""errors"": result.stderr, ""returncode"": result.returncode } except subprocess.TimeoutExpired: return { ""success"": False, ""error"": ""cfn-nagの実行がタイムアウトしました"" } except FileNotFoundError: return { ""success"": False, ""error"": ""cfn-nagが見つかりません。インストールしてください。"" } except Exception as e: return { ""success"": False, ""error"": f""エラーが発生しました: {str(e)}"" } @mcp.tool() def check_cloudformation(file_path: str) -> str: """""" CloudFormationテンプレートの総合チェック cfn-lintとcfn-nagの両方を実行してセキュリティ問題を検出 Args: file_path: チェックするCloudFormationファイルのパス Returns: チェック結果の詳細レポート(文字列) """""" logger.info(f""Tool called: check_cloudformation({file_path})"") # cfn-lintを実行 lint_result = run_cfn_lint(file_path) # cfn-nagを実行 nag_result = run_cfn_nag(file_path) # 結果を整形して返す report = f""【CloudFormationチェック結果】\n\n"" report += f""ファイル: {file_path}\n\n"" # cfn-lintの結果 report += ""=== cfn-lintの結果 ===\n"" if lint_result.get(""success""): report += ""✓ 構文エラーなし\n"" report += "" CloudFormationの構文は正しいです。\n"" else: report += ""✗ 構文エラーが見つかりました\n"" report += f""{lint_result.get('output', '')}\n"" if lint_result.get('error'): report += f""エラー: {lint_result['error']}\n"" report += ""\n"" # cfn-nagの結果 report += ""=== cfn-nagの結果 ===\n"" if nag_result.get(""success""): report += ""✓ セキュリティ問題なし\n"" report += "" AWS基礎セキュリティのベストプラクティスに準拠しています。\n"" else: report += ""⚠ セキュリティ問題が検出されました\n"" report += f""{nag_result.get('output', '')}\n"" if nag_result.get('error'): report += f""エラー: {nag_result['error']}\n"" report += ""\n"" # 総合評価 report += ""【総合評価】\n"" overall_success = lint_result.get(""success"", False) and nag_result.get(""success"", False) if overall_success: report += ""✓ すべてのチェックに合格しました\n"" else: report += ""✗ 修正が必要な項目があります\n"" return report @mcp.tool() def list_resources(file_path: str) -> str: """""" CloudFormationテンプレート内のリソース一覧を取得 Args: file_path: CloudFormationファイルのパス Returns: リソース一覧(文字列) """""" logger.info(f""Tool called: list_resources({file_path})"") try: import yaml with open(file_path, 'r', encoding='utf-8') as f: template = yaml.safe_load(f) resources = template.get('Resources', {}) if not resources: return ""リソースが見つかりませんでした。"" report = f""【リソース一覧】\n\n"" report += f""ファイル: {file_path}\n"" report += f""リソース数: {len(resources)}\n\n"" for resource_name, resource_data in resources.items(): resource_type = resource_data.get('Type', '不明') report += f""- {resource_name} ({resource_type})\n"" return report except FileNotFoundError: return f""エラー: ファイルが見つかりません: {file_path}"" except yaml.YAMLError as e: return f""エラー: YAMLの解析に失敗しました: {str(e)}"" except Exception as e: return f""エラー: {str(e)}"" # サーバーの起動 if __name__ == ""__main__"": logger.info(f""Starting IaC Validator MCP Server on port {port}..."") try: mcp.run(transport=""sse"") except Exception as e: logger.error(f""Server error: {str(e)}"") sys.exit(1) finally: logger.info(""Server terminated"")

コードの説明
1. FastMCPライブラリの使用
•    MCPプロトコルの実装を簡略化するライブラリ
•    `@mcp.tool()`デコレータで関数をツールとして公開
•    Server-Sent Events(SSE)による通信をサポート

 

2. run_cfn_lint関数
•    cfn-lintを実行して構文チェック
•    subprocess.runで外部コマンドを実行
•    タイムアウト処理とエラーハンドリング

 

3. run_cfn_nag関数
•    cfn-nagを実行してセキュリティチェック
•    同様にsubprocess.runを使用
•    エラーハンドリングを実装

 

4. check_cloudformation関数(MCPツール)
•    `@mcp.tool()`デコレータでMCPツールとして公開
•    2つのツールを順番に実行
•    結果を整形して読みやすいレポートを返す
•    Kiroから直接呼び出し可能

 

5. list_resources関数(MCPツール)
•    CloudFormationテンプレート内のリソース一覧を取得
•    YAMLファイルを解析してリソース情報を抽出
•    補助的なツールとして提供

 

6. サーバー起動処理
•    Server-Sent Events(SSE)トランスポートで起動
•    ポート番号は環境変数で設定可能(デフォルト8080)
•    エラー時は適切にログを出力して終了

 

ポイント
•    FastMCPライブラリを使うことで、MCPプロトコルの詳細を意識せずに実装可能
•    エラーハンドリングを丁寧に実装
•    タイムアウト処理を忘れずに
•    ツールが見つからない場合の対処
•    ログ出力で動作を追跡可能
 

5-4. requirements.txt の作成
ファイル: .kiro/powers/iac-validator/mcp-server/requirements.txt

# MCPサーバーの依存関係 fastmcp>=0.1.0 pyyaml>=6.0 cfn-lint>=0.80.0

各パッケージの説明

パッケージ 用途 バージョン
fastmcp MCPサーバーの実装を簡略化 0.1.0以上
pyyaml CloudFormationファイル(YAML)の解析 6.0以上
cfn-lint CloudFormation構文チェック 0.80.0以上

インストール方法:

[bash] pip install -r requirements.txt

注意
•    cfn-nagはRuby gemなので、別途`gem install cfn-nag`でインストール
•    fastmcpライブラリがMCPプロトコルの実装を担当
•    pyyamlはlist_resourcesツールで使用

5-5. POWER.md の作成
ファイル: .kiro/powers/iac-validator/POWER.md

[markdown] # IaC Validator Power CloudFormationテンプレートのセキュリティチェックを自動化するKiro Powerです。 ## 機能 - cfn-lintによる構文チェック - cfn-nagによるセキュリティスキャン - AWS基礎セキュリティのベストプラクティスチェック - CloudFormationリソース一覧の表示 ## 提供するツール ### check_cloudformation CloudFormationテンプレートの総合チェックを実行します。 **引数:** - file_path (string): チェックするCloudFormationファイルのパス **戻り値:** - チェック結果の詳細レポート(文字列) ### list_resources CloudFormationテンプレート内のリソース一覧を取得します。 **引数:** - file_path (string): CloudFormationファイルのパス **戻り値:** - リソース一覧(文字列) ## インストール方法 ### 前提条件 以下のツールがインストールされている必要があります: - Python 3.9以上 - Ruby(cfn-nag用) ### ツールのインストール Python依存関係のインストール pip install fastmcp pyyaml cfn-lint cfn-nagのインストール gem install cfn-nag ### Powerのインストール 1. このフォルダを `.kiro/powers/iac-validator/` にコピー 2. Kiroを再起動 3. コマンドパレットから「MCP Server」を確認し、`iac-checker`が表示されることを確認 ## 使い方 Kiroに以下のように依頼してください: 「sample.yamlをIaC Validatorでチェックして」 または、具体的にツール名を指定: 「check_cloudformationツールを使って、sample.yamlをチェックして」 リソース一覧を確認する場合: 「sample.yamlのリソース一覧を表示して」 ## チェック項目 ### セキュリティチェック(cfn-nag) - セキュリティグループで 0.0.0.0/0 を許可していないか - S3バケットのパブリックアクセスが無効か - S3バケットの暗号化が有効か - RDSの暗号化が有効か - パスワードがハードコードされていないか ### 構文チェック(cfn-lint) - CloudFormationの構文が正しいか - リソースプロパティが正しいか - ベストプラクティスに準拠しているか ## トラブルシューティング ### cfn-lintが見つからない pip install cfn-lint cfn-lint --version ### cfn-nagが見つかりません gem install cfn-nag cfn_nag --version ### FastMCPが見つからない pip install fastmcp python -c ""import mcp.server.fastmcp; print('OK')"" ### Powerが認識されない 1. Kiroを完全に終了 2. `.kiro/powers/iac-validator/` にファイルがあることを確認 3. `mcp-server/server.py` が実行可能であることを確認 4. Kiroを再起動 5. コマンドパレットから「MCP Server」を確認 ### MCPサーバーのログを確認 サーバーの動作ログは標準出力に表示されます。 問題が発生した場合は、以下のコマンドで直接サーバーを起動してログを確認できます: cd .kiro/powers/iac-validator/mcp-server python server.py ## 技術詳細 ### 使用ライブラリ - **FastMCP**: MCPプロトコルの実装を簡略化 - **PyYAML**: CloudFormationファイル(YAML)の解析 - **cfn-lint**: CloudFormation構文チェック - **cfn-nag**: セキュリティスキャン(Ruby gem) ### 通信方式 - Server-Sent Events(SSE)による双方向通信 - デフォルトポート: 8080(環境変数PORTで変更可能)

6. Powerの動作確認

実際にPowerを使ってCloudFormationファイルをチェックしてみましょう。

(3.MCP(Model Context Protocol)とは?の続き)

 

6-1. Powerのインストール
手順:
1.フォルダ構造を確認

.kiro/powers/iac-validator/ ├── POWER.json ├── POWER.md └── mcp-server/ ├── server.py └── requirements.txt

2.Kiroを再起動
•    Kiroを終了
•    再度起動してPowerを読み込み

 

3.Powerの確認
•    Kiroのコマンドパレットから「MCP Server」を確認
•    `iac-checker`が表示されていればOK
 

図:Powerインストール
拡大
図:Powerインストール

6-2. サンプルCloudFormationファイルの準備
テスト用ファイル(sample-bad.yaml):

 

セキュリティ問題を含むサンプルファイルを作成します。

 

[yaml] AWSTemplateFormatVersion: '2010-09-09' Description: セキュリティ問題を含むサンプル Resources: # 問題1: 0.0.0.0/0 を許可 BadSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Bad example SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0 # 危険!全世界からSSH接続可能 # 問題2: 暗号化なし BadS3Bucket: Type: AWS::S3::Bucket Properties: BucketName: my-bad-bucket # BucketEncryption が設定されていない # PublicAccessBlockConfiguration も設定されていない # 問題3: パブリックアクセス可能なRDS BadRDSInstance: Type: AWS::RDS::DBInstance Properties: DBInstanceIdentifier: my-bad-db Engine: postgres MasterUsername: admin MasterUserPassword: password123 # 危険!パスワードがハードコード PubliclyAccessible: true # 危険!パブリックアクセス可能 StorageEncrypted: false # 危険!暗号化なし

このファイルの問題点

問題 リソース 内容 重大度
1 BadSecurityGroup 0.0.0.0/0 からSSH接続可能
2 BadS3Bucket 暗号化が設定されていない
3 BadS3Bucket パブリックアクセスブロックなし
4 BadRDSInstance パブリックアクセス可能
5 BadRDSInstance 暗号化が無効
6 BadRDSInstance パスワードがハードコード

 

6-3. Powerを使ってチェック
Kiroへのプロンプト:

「sample-bad.yamlをIaC Validatorでチェックしてください」

期待される結果:

【CloudFormationチェック結果】 === cfn-lintの結果 === ✓ 構文エラーなし CloudFormationの構文は正しいです。 === cfn-nagの結果 === ⚠ 警告が6件見つかりました: 1. BadSecurityGroup (AWS::EC2::SecurityGroup) 問題: セキュリティグループで 0.0.0.0/0 を許可 詳細: SSH(ポート22)が全世界に公開されています 重大度: 高 推奨: 特定のIPアドレス範囲に制限してください 2. BadS3Bucket (AWS::S3::Bucket) 問題: S3バケットの暗号化が設定されていない 詳細: BucketEncryptionプロパティが未設定 重大度: 高 推奨: AES256またはKMSで暗号化を有効にしてください 3. BadS3Bucket (AWS::S3::Bucket) 問題: パブリックアクセスブロックが設定されていない 詳細: PublicAccessBlockConfigurationが未設定 重大度: 高 推奨: すべてのパブリックアクセスをブロックしてください 4. BadRDSInstance (AWS::RDS::DBInstance) 問題: RDSインスタンスがパブリックアクセス可能 詳細: PubliclyAccessible: true 重大度: 高 推奨: PubliclyAccessible: false に設定してください 5. BadRDSInstance (AWS::RDS::DBInstance) 問題: RDSの暗号化が無効 詳細: StorageEncrypted: false 重大度: 高 推奨: StorageEncrypted: true に設定してください 6. BadRDSInstance (AWS::RDS::DBInstance) 問題: パスワードがハードコードされている 詳細: MasterUserPasswordにプレーンテキストで記載 重大度: 高 推奨: Secrets Managerを使用してください 【総合評価】 ✗ セキュリティ問題が検出されました 修正が必要な項目: 6件

図:チェック結果
拡大
図:チェック結果

ポイント
•    Powerを使えば、簡単にセキュリティチェックができる
•    問題箇所が明確に指摘される
•    修正方法も提示される

6-4. 修正版で再チェック
問題を修正したファイルを作成します。


修正後のファイル(sample-good.yaml):

[yaml] AWSTemplateFormatVersion: '2010-09-09' Description: セキュリティ対策済みサンプル Parameters: AllowedCidr: Type: String Default: 10.0.0.0/16 Description: 許可するIPアドレス範囲 Resources: # 修正1: 特定のIPアドレス範囲のみ許可 GoodSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Good example SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref AllowedCidr # 社内ネットワークのみ Description: ""Allow SSH from internal network"" # 修正2: 暗号化とパブリックアクセスブロックを設定 GoodS3Bucket: Type: AWS::S3::Bucket Properties: BucketName: my-good-bucket PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 VersioningConfiguration: Status: Enabled # 修正3: プライベートアクセス、暗号化有効、Secrets Manager使用 GoodRDSInstance: Type: AWS::RDS::DBInstance Properties: DBInstanceIdentifier: my-good-db Engine: postgres MasterUsername: admin MasterUserPassword: !Sub '{{resolve:secretsmanager:${DBSecret}:SecretString:password}}' PubliclyAccessible: false # プライベートアクセスのみ StorageEncrypted: true # 暗号化有効 BackupRetentionPeriod: 7 MultiAZ: true # Secrets Managerでパスワード管理 DBSecret: Type: AWS::SecretsManager::Secret Properties: Description: RDS database password GenerateSecretString: SecretStringTemplate: '{""username"": ""admin""}' GenerateStringKey: ""password"" PasswordLength: 32 ExcludeCharacters: '""@/\'

修正内容

項目 修正前 修正後
セキュリティグループ 0.0.0.0/0 10.0.0.0/16(パラメータ化)
S3暗号化 なし AES256
S3パブリックアクセス 未設定 すべてブロック
RDSパブリックアクセス true false
RDS暗号化 false true
RDSパスワード ハードコード Secrets Manager

 

再チェック結果:

【CloudFormationチェック結果】 === cfn-lintの結果 === ✓ 構文エラーなし === cfn-nagの結果 === ✓ セキュリティ問題なし 【総合評価】 ✓ すべてのチェックに合格しました AWS基礎セキュリティのベストプラクティスに準拠しています

図:修正前後の比較
拡大
図:修正前後の比較

ポイント
•    問題が解決されたことが確認できる
•    セキュリティベストプラクティスに準拠
•    チーム全体で同じ基準でチェックできる

7. チームメンバーへの配布

作成したPowerをチームメンバーに配布する方法を説明します。

 

7-1. Powerのパッケージング
配布用のフォルダ構成:

iac-validator-power/ ├── README.md # インストール手順 ├── POWER.json ├── POWER.md └── mcp-server/ ├── server.py └── requirements.txt

README.mdの内容例:

[markdown] # IaC Validator Power CloudFormationテンプレートのセキュリティチェックを自動化するKiro Powerです。 ## インストール方法 ### 1. 前提条件 以下のツールがインストールされている必要があります: - Python 3.9以上 - Ruby(cfn-nag用) ### 2. 必要なツールのインストール Python依存関係のインストール pip install fastmcp pyyaml cfn-lint cfn-nagのインストール gem install cfn-nag ### 3. Powerのインストール 1. このフォルダを `.kiro/powers/iac-validator/` にコピー 2. Kiroを再起動 3. コマンドパレットから「MCP Server」を確認し、`iac-checker`が表示されることを確認 ### 4. 動作確認 Kiroに以下のように依頼してください: 「sample.yamlをIaC Validatorでチェックして」 ## 提供するツール - **check_cloudformation**: CloudFormationテンプレートの総合チェック - **list_resources**: テンプレート内のリソース一覧表示 ## トラブルシューティング ### cfn-lintが見つからない pip install cfn-lint cfn-lint --version ### cfn-nagが見つかりません gem install cfn-nag cfn_nag --version ### FastMCPが見つからない pip install fastmcp python -c ""import mcp.server.fastmcp; print('OK')"" ### Powerが認識されない 1. Kiroを完全に終了 2. `.kiro/powers/iac-validator/` にファイルがあることを確認 3. `mcp-server/server.py` が実行可能であることを確認 4. Kiroを再起動 5. コマンドパレットから「MCP Server」を確認 ### MCPサーバーのログを確認 cd .kiro/powers/iac-validator/mcp-server python server.py ## サポート 問題が発生した場合は、チーム内のSlackチャンネル #kiro-support までご連絡ください。

図:配布用フォルダ
拡大
図:配布用フォルダ

7-2. Gitでの共有
手順:

[bash] # Powerをリポジトリに追加 git add .kiro/powers/iac-validator/ git commit -m ""Add IaC Validator Power for CloudFormation security checks"" git push # チームメンバーは git pull # Kiroを再起動

注意事項
•    `.kiro/powers/`フォルダをGitで管理
•    バージョン管理を適切に行う
•    更新時はチームに通知

 

7-3. 配布方法の比較

配布方法 メリット デメリット 適用場面
Git バージョン管理、自動更新 Git環境が必要 開発チーム
ZIP配布 環境不要、簡単 バージョン管理困難 一時的な共有
社内パッケージリポジトリ 自動更新、バージョン管理 構築が必要 大規模組織
ドキュメント共有 手順が明確 手動インストール 小規模チーム

 

推奨
•    小〜中規模チーム:Gitでの共有
•    大規模組織:社内パッケージリポジトリ
•    一時的な共有:ZIP配布
 

図:Gitワークフロー
拡大
図:Gitワークフロー

7-4. 運用ルールの策定
チーム内で決めておくべきこと

1.Powerの更新ルール
•  誰が更新を担当するか
•  更新頻度(月次、四半期など)
•  更新時の通知方法

 

 2.サポート体制
•  問い合わせ先(Slackチャンネル、メールなど)
•  トラブルシューティングドキュメント
•  FAQ の整備


 3.使用ルール
•  どのタイミングでチェックするか(コミット前、プルリク前など)
•  チェック結果の扱い方
•  例外の承認プロセス

運用ドキュメント例:

[markdown] # IaC Validator Power 運用ルール ## 使用タイミング - CloudFormationファイルを作成・修正したとき - プルリクエストを作成する前 - デプロイ前の最終確認 ## チェック結果の扱い - 高重大度の問題:必ず修正 - 中重大度の問題:原則修正(例外は要承認) - 低重大度の問題:推奨修正 ## 例外承認プロセス 1. チェック結果をプルリクエストに添付 2. 理由を明記 3. チームリーダーの承認を得る ## サポート - Slackチャンネル:#kiro-support - 担当者:@tech-lead

図:運用ルール
拡大
図:運用ルール

8. まとめ

今回は、Kiro Powerを使ってCloudFormationのセキュリティチェックを自動化する方法を解説しました。


8-1. 実現できたこと
Kiro Powerで実現できたこと
•    cfn-lintとcfn-nagを使った自動チェック
•    セキュリティ問題の自動検出
•    修正案の提示
•    チームメンバーへの機能共有

 

ステアリングファイルとの違い
•    ステアリングファイル:「こう書いてね」というガイドライン
•    Kiro Power:「実際にチェックする」自動化ツール
•    両方を組み合わせることで最大の効果

 

8-2. Kiro Powerの特徴
メリット
•    ✓ 外部ツールとの連携が可能
•    ✓ 既存コードの検証ができる
•    ✓ チーム全体で同じ基準でチェック
•    ✓ 人的ミスを削減

 

注意点
•    プログラミング知識が必要
•    ツールのインストールが必要
•    メンテナンスが必要

 

8-3. 次のステップ
今後の展開
•    他の外部ツールとの連携(Terraform、Ansible等)
•    カスタムルールの追加
•    自動修正機能の実装
•    CI/CDパイプラインへの組み込み

 

第4回予告
次回の記事では、ステアリングファイルとKiro Powerを組み合わせた実践的な運用方法をご紹介します。
IaCコーディング規約をチーム全体で管理し、品質を向上させる具体的な方法を解説します。


8-4. 読者の皆さんへ
まずは試してみよう
•    シンプルなPowerから始める
•    既存のツールを活用する
•    チームで共有して、開発効率を上げる

 

Kiroの可能性
Kiro Powerを使えば、様々な外部ツールと連携できます。
•    コード品質チェック(ESLint、Pylint等)
•    セキュリティスキャン(Trivy、Snyk等)
•    ドキュメント生成(Swagger、Sphinx等)
•    テスト自動化(Jest、pytest等)

 

あなたのチームに合ったPowerを作成して、開発体験を向上させましょう!
次回もお楽しみに!
 

この記事で作成したファイル

.kiro/powers/iac-validator/ ├── POWER.json # Power設定ファイル ├── POWER.md # ドキュメント └── mcp-server/ ├── server.py # MCPサーバー本体 └── requirements.txt # Python依存関係

実際のファイルは、記事内に全文を掲載しています。
皆さんも同じように、チームに合わせたPowerを作成してみてください。

参考リンク
•    AWS KiroでJavaアプリを作ってみた | Tech Blog | CRESCO Tech Blog 
•    Kiroのステアリングファイル入門:ブログ執筆を効率化する対話型ルール作成