🧙

今日から始める IAM Policy Autopilot

に公開

🌟 はじめに

2025 年 11 月 30 日 に発表されたIAM Policy Autopilotは、ソースコードからIAMポリシーを自動生成するツールです。AWS Labsがオープンソースで公開しており、MCP(Model Context Protocol)サーバーとしてAIアシスタントと連携することも可能です。

重要なのは、これがIAM設計を代替するツールではなく、探索・初期化・デバッグを高速化するツールである点です。AWS公式ブログでも「生成されたポリシーは機能性を優先している」と明記されており、最小権限の原則は手動で実現する必要があります。

本記事では、IAMにある程度慣れたエンジニアが実務でIAM Policy Autopilotをどう活用すべきか、既存のIAMベストプラクティスとどう共存させるかを解説します。

📖 対象読者

本記事の対象読者は以下です。

  • AccessDeniedエラーの原因調査に時間を取られたことがある
  • 最小権限の原則は大事だけど、実装が大変だと感じている
  • Terraformなどで管理しているが、初期ポリシーの作成が面倒
  • 新しいAWSサービスを使う時、必要な権限を調べるのが億劫

✅ この記事で学べること

実際に使ってみて分かった、以下のポイントを詳しく解説します。

  • IAM Policy Autopilotの基礎
  • MCP連携とCLI実行の使い分け方
  • IAM Policy Autopilot の実際の適用方法

🧙 IAM Policy Autopilotってどんなツール?

IAM Policy Autopilotは、ソースコードを解析して必要なIAMポリシーを自動生成するツールです。Python、Go、TypeScriptで書かれたコード内のAWS SDK呼び出しを検出し、そのコードが動作するために必要な最小限の権限を特定して、IAMポリシーのJSONを生成します。

3つの強み:Fast, Reliable, Up-to-date

IAM Policy Autopilotは、以下の3つの軸で開発者のIAMポリシー作成を支援します。

  • Fast(高速): AWS SDK呼び出しを自動解析し、ベースラインとなるIAMポリシーを即座に生成。開発スピードを大幅に向上
  • Reliable(信頼性): 決定論的なコード解析により、有効なIAMポリシーを生成。権限エラーによるデプロイ遅延を削減
  • Up-to-date(最新性): AWSサービスの最新機能に対応し、進化し続けるAWSエコシステムに追従

2つの利用形態:MCPサーバーとCLIツール

IAM Policy Autopilotは、MCPサーバーCLIツールという2つの形態で利用できます。

🤖 MCPサーバーとして利用

AIコーディングアシスタント(Claude Code等)と連携し、バックグラウンドで動作します。アシスタントがIAM Policy Autopilotを呼び出して、以下を実行します。

  • AWS SDK呼び出しの自動検出と解析
  • 必要なIAMポリシーの生成
  • AccessDeniedエラーの原因分析と修正案の提示

⚙️ CLIツールとして利用

コマンドラインツールとして、直接実行できます。

  • ソースコードを指定してIAMポリシーを生成
  • エラーメッセージから不足している権限を特定
  • CI/CDパイプラインへの組み込みが可能

どちらの形態も同じコア機能を提供するため、開発ワークフローに最適な方法を選択できます。

🔄 IAM Policy AutopilotとAIアシスタントの役割分担

MCP連携を使用する場合、IAM Policy AutopilotAIコーディングアシスタントそれぞれが異なる役割を果たすことを理解することが重要です。

IAM Policy Autopilotが行うこと(静的解析)

IAM Policy Autopilotは決定論的な静的コード解析を実行します。
例えば、コード内に s3.get_object(Bucket='my-bucket', Key='data.json') という呼び出しがあれば、s3:GetObject アクションを含むポリシーを生成します。

AIアシスタントが行うこと(コンテキスト解釈と拡張)

MCP経由でポリシーを受け取ったAIアシスタント(Claude等)は、より広いコードコンテキストを解釈して、インフラストラクチャコードテンプレート作成時にポリシーを修正・拡張する場合があります。

注意点するべきポイント

これらの変更はAIアシスタントの解釈によるものであり、IAM Policy Autopilotの静的解析結果ではありません。

そのため、生成されたポリシーは必ずレビューし、セキュリティ要件を満たしていることを確認してください。本番環境へのデプロイ前には、人間による最終確認が不可欠です。

💡 知っておくべき制限事項

IAM Policy Autopilotには以下のような制限があります。

✅ できること

  • Python、Go、TypeScriptのコード解析
  • アイデンティティベースポリシー(IAMロールやユーザーのポリシー)の生成
  • 静的に定義されたリソース名の検出

❌ できないこと

  • リソースベースポリシー(S3バケットポリシーなど)の生成
  • Permission BoundaryやSCPの考慮
  • 変数で動的に指定されるリソース名の正確な検出
  • Condition要素(IP制限、MFA必須など)の生成

IAM Policy Autopilotは「完全自動化」ツールではなく、「初期ポリシーのたたき台を作成する」ツールとして活用するのが適切です。

セットアップ

IAM Policy Autopilotは、CLIツールとして直接使用することも、Claude CodeなどのAIアシスタントとMCP連携して使用することもできます。ここでは、それぞれの利用形態に応じたセットアップ方法を説明します。

インストール方法

実務での利用形態に応じて、CLI利用とMCPサーバー利用の2つから選択します。

CLI利用の場合

# 推奨:uvxを使った実行(インストール不要)
$ pip install uv
$ uvx iam-policy-autopilot generate-policies ./src/app.py

# または pip でインストール
$ pip install iam-policy-autopilot

MCP サーバーとして利用の場合

Claude Code での設定

プロジェクトルートに .mcp.json を作成。

{
  "mcpServers": {
    "iam-policy-autopilot": {
      "command": "iam-policy-autopilot",
      "args": ["mcp-server"],
      "env": {
        "AWS_PROFILE": "your-profile-name", // 開発用プロファイルを指定
        "AWS_REGION": "us-east-1"
      }
    }
  }
}

重要: MCP サーバーとして使う場合は、必ず開発用のAWSプロファイルを指定してください。本番環境のクレデンシャルを設定することは避けてください。

実践例

ここからは、実際にIAM Policy Autopilotを使ってIAMポリシーを生成する具体例を紹介します。複数のAWSサービス(S3、DynamoDB、SNS、SQS、CloudWatch)を利用する本格的なLambda関数のコードを用意し、Claude CodeのMCP連携とCLI実行の両方でポリシーを生成する様子をお見せします。

Claude Codeを使った実践例:複雑なLambda関数のポリシー生成

実際にClaude Code(MCP連携)を使用して、複数のAWSサービスを利用する本格的なLambda関数のポリシーを生成した例を紹介します。

作成したインフラ構成

Terraformで以下のAWSリソースを定義しました。

  • S3バケット: アプリケーションデータの保存とバージョニング
  • DynamoDB: ユーザーデータの管理(GSI付き)
  • SNS Topic: 通知送信用
  • SQS Queue: メッセージ処理用
  • Lambda関数: データ処理エンジン
  • CloudWatch Logs: ロギング

Lambda関数のPythonコード例

実際に作成したLambda関数(lambda_processor.py)の主要部分。

import json
import os
import boto3
from datetime import datetime
from botocore.exceptions import ClientError

# 複数のAWSクライアントを初期化
s3_client = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')
sns_client = boto3.client('sns')
sqs_client = boto3.client('sqs')
cloudwatch = boto3.client('cloudwatch')

def handler(event, context):
    """
    複数のAWSサービスを連携させるLambda関数
    """
    try:
        # 1. S3から設定ファイルを読み取り
        response = s3_client.get_object(
            Bucket=S3_BUCKET,
            Key='config/settings.json'
        )

        # 2. DynamoDBへのデータ保存(Put、Update、Scan、BatchWrite)
        table = dynamodb.Table(DYNAMODB_TABLE_NAME)
        table.put_item(Item={...})
        table.update_item(Key={...})
        table.scan(FilterExpression=...)

        # 3. S3への結果アップロード
        s3_client.put_object(
            Bucket=S3_BUCKET,
            Key=f'results/{user_id}/{timestamp}.json',
            Body=json.dumps(result_data)
        )

        # 4. SNSによる通知送信
        sns_client.publish(
            TopicArn=SNS_TOPIC_ARN,
            Message=json.dumps(message),
            MessageStructure='json'
        )

        # 5. SQSメッセージの送受信と削除
        sqs_client.send_message(QueueUrl=SQS_QUEUE_URL, MessageBody=...)
        sqs_client.receive_message(QueueUrl=SQS_QUEUE_URL)
        sqs_client.delete_message(QueueUrl=SQS_QUEUE_URL, ReceiptHandle=...)

        # 6. CloudWatchメトリクスの送信
        cloudwatch.put_metric_data(
            Namespace='DataProcessor',
            MetricData=[...]
        )

    except Exception as e:
        # エラー時もSNSで通知
        sns_client.publish(TopicArn=SNS_TOPIC_ARN, Message=str(e))

Claude CodeでのMCP連携によるポリシー生成

「Python codeに対応するpolicyを生成してください。」というプロンプトを入力すると、下記のようにMCPを使うことが分かります。

Claude CodeでMCPツールを実行する様子

その後、下記のようにPolicyが生成されました。

生成されたIAMポリシー

{
  "Id": "IamPolicyAutopilot",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "KMSForS3",
      "Effect": "Allow",
      "Action": ["kms:Decrypt", "kms:GenerateDataKey"],
      "Resource": ["arn:aws:kms:REGION:ACCOUNT:key/*"],
      "Condition": {
        "StringEquals": {
          "kms:ViaService": ["s3.REGION.amazonaws.com"]
        }
      }
    },
    {
      "Sid": "S3ObjectOperations",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:GetObjectAcl",
        "s3:PutObjectAcl",
        "s3:GetObjectTagging",
        "s3:PutObjectTagging"
      ],
      "Resource": ["arn:aws:s3:::*/*"]
    },
    {
      "Sid": "S3BucketOperations",
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::*"]
    },
    {
      "Sid": "DynamoDBOperations",
      "Effect": "Allow",
      "Action": [
        "dynamodb:PutItem",
        "dynamodb:UpdateItem",
        "dynamodb:Scan",
        "dynamodb:BatchWriteItem"
      ],
      "Resource": ["arn:aws:dynamodb:REGION:ACCOUNT:table/*"]
    },
    {
      "Sid": "SNSPublish",
      "Effect": "Allow",
      "Action": ["sns:Publish"],
      "Resource": ["arn:aws:sns:REGION:ACCOUNT:*"]
    },
    {
      "Sid": "SQSOperations",
      "Effect": "Allow",
      "Action": [
        "sqs:SendMessage",
        "sqs:ReceiveMessage",
        "sqs:DeleteMessage"
      ],
      "Resource": ["arn:aws:sqs:REGION:ACCOUNT:*"]
    },
    {
      "Sid": "CloudWatchMetrics",
      "Effect": "Allow",
      "Action": ["cloudwatch:PutMetricData"],
      "Resource": ["*"]
    }
  ]
}

※ 実際の出力ではREGIONACCOUNTには具体的な値が入ります

生成されたポリシーの特徴

IAM Policy Autopilotが自動的に検出・生成した内容を確認してみましょう。

まずS3関連の権限を見てみると、s3_client.get_object() の呼び出しから s3:GetObject 権限が生成されています。これは設定ファイルの読み取りに必要な権限なので、正しく検出されていそうです。また、s3_client.put_object() から s3:PutObject も生成されており、処理結果をS3にアップロードするために必要な権限も漏れなく含まれています。さらに s3_client.list_objects_v2() の呼び出しも検出され、s3:ListBucket 権限が適切に付与されています。

DynamoDBの操作権限も網羅的に生成されています。table.put_item() から dynamodb:PutItem が正しく生成されており、これは新規データの挿入に必要な権限です。table.update_item() の呼び出しも検出され、dynamodb:UpdateItem 権限が含まれています。既存データの更新処理に必要なので、これも正しそうです。また、table.scan() から dynamodb:Scan 権限、バッチ書き込み用の dynamodb:BatchWriteItem も検出されており、コード内のすべてのDynamoDB操作がカバーされています。

CLIでの生成も可能

同じPythonコードに対して、CLIでも同様のポリシー生成が可能です。

# uvxを使った実行(インストール不要)
$ uvx iam-policy-autopilot generate-policies \
  terraform-demo/lambda_processor.py \
  --region ap-northeast-1 \
  --account YOUR_ACCOUNT_ID \
  --service-hints s3 dynamodb sns sqs cloudwatch \
  --pretty > generated-policy.json

# または通常のCLI実行
$ iam-policy-autopilot generate-policies \
  terraform-demo/lambda_processor.py \
  --output generated-policy.json

実際にCLIで実行すると、以下のようなポリシーがgenerated-policy.jsonとして出力されます。

{"Policies":[{"Policy":{"Id":"IamPolicyAutopilot","Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["kms:Decrypt","kms:GenerateDataKey"],"Resource":["arn:aws:kms:REGION:ACCOUNT:key/*"],"Condition":{"StringEquals":{"kms:ViaService":["s3.REGION.amazonaws.com"]}}},{"Effect":"Allow","Action":["s3:GetObject","s3:GetObjectAcl","s3:GetObjectLegalHold","s3:GetObjectRetention","s3:GetObjectTagging","s3:GetObjectVersion","s3:PutObject","s3:PutObjectAcl","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging"],"Resource":["arn:aws:s3:::*/*","arn:aws:s3:REGION:ACCOUNT:accesspoint/*/object/*"]},{"Effect":"Allow","Action":["s3-object-lambda:GetObject","s3-object-lambda:PutObject"],"Resource":["arn:aws:s3:::*/*","arn:aws:s3:REGION:ACCOUNT:accesspoint/*/object/*"]},{"Effect":"Allow","Action":["s3:ListBucket"],"Resource":["arn:aws:s3:::*","arn:aws:s3:REGION:ACCOUNT:accesspoint/*"]},{"Effect":"Allow","Action":["s3-object-lambda:ListBucket"],"Resource":["arn:aws:s3:::*","arn:aws:s3:REGION:ACCOUNT:accesspoint/*"]},{"Effect":"Allow","Action":["kms:Decrypt","kms:GenerateDataKey"],"Resource":["arn:aws:kms:REGION:ACCOUNT:key/*"],"Condition":{"StringEquals":{"kms:ViaService":["sns.REGION.amazonaws.com"]}}},{"Effect":"Allow","Action":["sns:Publish"],"Resource":["arn:aws:sns:REGION:ACCOUNT:*"]},{"Effect":"Allow","Action":["kms:Decrypt","kms:GenerateDataKey"],"Resource":["arn:aws:kms:REGION:ACCOUNT:key/*"],"Condition":{"StringEquals":{"kms:ViaService":["sqs.REGION.amazonaws.com"]}}},{"Effect":"Allow","Action":["sqs:DeleteMessage","sqs:ReceiveMessage","sqs:SendMessage"],"Resource":["arn:aws:sqs:REGION:ACCOUNT:*"]},{"Effect":"Allow","Action":["cloudwatch:PutMetricData"],"Resource":["*"]},{"Effect":"Allow","Action":["dynamodb:BatchWriteItem","dynamodb:PutItem","dynamodb:Scan","dynamodb:UpdateItem"],"Resource":["arn:aws:dynamodb:REGION:ACCOUNT:table/*"]},{"Effect":"Allow","Action":["kms:Decrypt"],"Resource":["arn:aws:kms:REGION:ACCOUNT:key/*"],"Condition":{"StringEquals":{"kms:ViaService":["dynamodb.REGION.amazonaws.com"]}}}]},"PolicyType":"Identity"}]}

🎄 まとめ

本記事で紹介したように、IAM Policy AutopilotはClaude CodeなどのAIアシスタントとMCP連携することで、複雑なLambda関数でも瞬時に必要な権限を洗い出せます。また、CLIツールとしても利用可能なため、CI/CDパイプラインへの組み込みも容易です。しかし、あくまで「開発を加速するツール」であり、生成されたポリシーは必ず人間がレビューし、本番環境のセキュリティ要件に合わせて調整する必要があります。

IAM Policy Autopilotは現在も活発に開発が続いているプロジェクトです。将来的には以下の改善が期待されます。

  • より多くのプログラミング言語への対応
  • Condition要素の自動生成
  • リソースベースポリシーへの対応
  • SCP/Permission Boundaryの考慮

しかし、現時点でも開発効率を大幅に改善できる有用なツールです。適切な理解と運用ルールの下で活用することで、セキュアかつ効率的なIAM管理を実現できます。
それでは良い IAM Life を!

参考リンク

Discussion