12
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS IAM Policy AutopilotでIAMポリシーの悩みを減らそう! #AWSreInvent

Last updated at Posted at 2025-12-22

朝デジ事業センター開発部の寺岡(@toda_kk)です。

AWS re:Invent 2025が開催され、AWSサービスに関して多くのアップデートが発表されました。今年のre:Inventでは、特にAIに関する発表が目立っていたように感じます。

AWS CEOのMatt GarmanによるKeynoteで発表された"Frontier Agents"という考え方については、朝日新聞でも報じられました。

そんなAI関連サービスのなかでも、本記事では IAM Policy Autopilot についてご紹介します。

IAM Policy Autopilotとは

AWSでは、Identity and Access Management(IAM)を用いてユーザーやAWSリソースが実行できる操作を制御できます。AWSにおいては最小権限がベストプラクティスとされているため、必要なIAMポリシーをあらかじめ定義しておくことが重要となります。

re:Invent 2025で発表されたIAM Policy Autopilotは、アプリケーションのワークロードに必要なIAMポリシーを定義するために役立つAIコーディングアシスタントです。MCPサーバーおよびコマンドラインツールとして提供されており、下記のGitHubリポジトリでオープンソースとして開発されています。

AIエージェントに対してIAM Policy Autopilotを利用してアプリケーションのコードを読み込ませることで、必要となるIAMポリシーを作成できます。また、権限に起因するエラーメッセージなどを与えることで、不足しているIAMポリシーを分析したりすることも可能です。

下記のAWS公式ブログでは、具体的な利用方法などが紹介されています。MCPサーバーが提供されているため、Kiro CLIやClaude Codeなどから利用することができます。

IAM Policy Autopilot利用の際の注意点

2025年12月23日時点では、アプリケーションのコードから利用されているAWS SDKを分析することでIAMポリシーを生成する仕組みのようです。つまり、あくまでもアプリケーションが明示的に利用しているAWSリソースに対する権限が生成・分析のサポート範囲となります。

GitHubリポジトリのREADMEには下記のように記載されています。

IAM Policy Autopilot accelerates development by generating baseline identity-based IAM policies. Your AI coding assistant can call IAM Policy Autopilot to analyze AWS SDK calls within your application. IAM Policy Autopilot then automatically creates the baseline IAM permissions for your application roles.

そのため、例えばLambdaトリガー(SQSやS3イベントなど)のようなランタイムが暗黙的に必要とする権限については、IAM Policy Autopilotでは分析できません。

この点については今後のアップデートに期待したいところではあります。少なくとも現時点では、AWSがマネージドで提供するMCPサーバーを利用して補完すると良いと思います。こちらも、同じくre:Invent2025期間中に発表されました。

Goのコードを分析させてみた

それでは、実際にIAM Policy Autopilotを利用して必要なIAMポリシーを生成してみます。

現時点では、Python / TypeScript / Go がサポートされています。私たちのチームではバックエンドの言語としてGoを採用することが多いため、今回はGoで実装したコードを分析させてみます。

想定するユースケース

下記のようなワークロードを想定して、分析のためのコードを作成しました。

  • GoのアプリケーションコードをLambdaで実行する
  • SQSからイベントを受け取って、特定のAPIにリクエストを送る
  • APIのエンドポイントについては、Systems Manager Parameter Storeから値を取得する

構成図としては下記のような形になります。

構成図.png

本来であればメインのキューとは別にデッドレターキューと連携したいところですが、今回は割愛します。

分析させるサンプルコード

上記の想定のもと、アプリケーションのサンプルコードを作成しました。

main.go
package main

import (
	"bytes"
	"context"
	"fmt"
	"net/http"
	"os"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/ssm"
)

var endpointURL string

func init() {
	cfg, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
		panic(fmt.Sprintf("failed to load AWS config: %v", err))
	}

	ssmClient := ssm.NewFromConfig(cfg)
	param, err := ssmClient.GetParameter(context.TODO(), &ssm.GetParameterInput{
		Name:           aws.String(os.Getenv("EXTERNAL_API_ENDPOINT")),
		WithDecryption: aws.Bool(true),
	})
	if err != nil {
		panic(fmt.Sprintf("failed to get parameter: %v", err))
	}
	endpointURL = *param.Parameter.Value
}

func handler(ctx context.Context, event events.SQSEvent) (events.SQSEventResponse, error) {
	var failures []events.SQSBatchItemFailure

	for _, record := range event.Records {
		if err := postMessage(record.Body); err != nil {
			fmt.Printf("Error [%s]: %v\n", record.MessageId, err)
			failures = append(failures, events.SQSBatchItemFailure{ItemIdentifier: record.MessageId})
		}
	}

	return events.SQSEventResponse{BatchItemFailures: failures}, nil
}

func postMessage(body string) error {
	resp, err := http.Post(endpointURL, "application/json", bytes.NewBufferString(body))
	if err != nil {
		return err
	}
	defer resp.Body.Close()

	if resp.StatusCode >= 400 {
		return fmt.Errorf("HTTP %d", resp.StatusCode)
	}
	return nil
}

func main() {
	lambda.Start(handler)
}

なお、あくまでも今回の分析を試すために作成したサンプルコードであり、実際の動作を保証するものではありません。

IAM Policy Autopilotを利用してみる

IAM Policy Autopilotは、MCPサーバーとして利用することができます。

私は普段からClaude Codeを利用することが多いため、READMEに記載されている手順に従って、設定ファイルに下記の内容を追加しておきます。

{
  "mcpServers": {
    "iam-policy-autopilot": {
      "command": "uvx",
      "args": ["iam-policy-autopilot", "mcp-server"],
      "env": {
        "AWS_PROFILE": "your-profile-name",
        "AWS_REGION": "us-east-1"
      }
    }
  }
}

その上で、Claude Codeに下記の指示を与えてIAMポリシーを生成させてみました。

iam-policy-autopilotを利用して main.go をLambda関数として動かすためのIAMポリシーを最小権限になるように生成してください。 

結果が下記となります。

⏺ IAM Policy Autopilot がポリシーを生成しました。以下が main.go の分析結果に基づく IAM ポリシーです:

  生成された IAM ポリシー

  {
    "Id": "IamPolicyAutopilot",
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": ["kms:Decrypt"],
        "Resource": ["arn:aws:kms:*:*:key/*"],
        "Condition": {
          "StringLike": {
            "kms:ViaService": ["ssm.*.amazonaws.com"]
          }
        }
      },
      {
        "Effect": "Allow",
        "Action": ["ssm:GetParameter"],
        "Resource": ["arn:aws:ssm:*:*:parameter/*"]
      }
    ]
  }

  検出された AWS SDK 呼び出し

  | サービス | アクション   | コード箇所                                               |
  |----------|--------------|----------------------------------------------------------|
  | SSM      | GetParameter | main.go:26 - WithDecryption: true で SecureString を取得 |
  | KMS      | Decrypt      | SecureString パラメータの復号化に必要                    |

  より最小権限にするための推奨事項

  現在のポリシーはワイルドカード(*)を使用しています。本番環境では以下のように具体的なリソースを指定することを推奨します:

  {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": ["kms:Decrypt"],
        "Resource": ["arn:aws:kms:<REGION>:<ACCOUNT_ID>:key/<KMS_KEY_ID>"],
        "Condition": {
          "StringLike": {
            "kms:ViaService": ["ssm.<REGION>.amazonaws.com"]
          }
        }
      },
      {
        "Effect": "Allow",
        "Action": ["ssm:GetParameter"],
        "Resource": ["arn:aws:ssm:<REGION>:<ACCOUNT_ID>:parameter/<PARAMETER_NAME>"]
      }
    ]
  }

  置き換えが必要な値:
  - <REGION>: Lambda のデプロイリージョン(例: ap-northeast-1)
  - <ACCOUNT_ID>: AWS アカウント ID
  - <KMS_KEY_ID>: SecureString の暗号化に使用している KMS キー ID
  - <PARAMETER_NAME>: 環境変数 EXTERNAL_API_ENDPOINT で指定するパラメータ名

  このポリシーを使用する前に、ご確認をお願いします。

アプリケーションのコードで利用されているAWS SDKを元にして、必要になるIAMポリシーが分析されているのがわかります。

Systems Manager Parameter Storeからパラメーターを取得する ssm:GetParameter だけでなく、パラメーターが SecureString として暗号化されていることから kms:Decrypt も必要なポリシーとして出力されており、コードの内容を分析した上でIAMポリシーが生成されています。

ただ、上述の通り、Lambdaランタイムで暗黙的に必要となるSQS(トリガー)やCloudWatch Logs(ログ出力)などの権限については、コードの内容に含まれていないため、必要なIAMポリシーとして出力されていません。しかし、この点は「Lambdaで動かすコードです」といった内容を指示に含めることで、補完的に生成してくれそうです。

IAMポリシー定義の悩みを減らしてくれそう

以上、簡単ではありますが、実際にIAM Policy Autopilotを利用して必要なIAMポリシーを生成してみました。

アプリケーションの開発プロセスにおいて、AWS上で必要になる権限について、つい細かい権限を忘れてしまったり、とりあえず強めの権限を与えてしまったりしてしまいがちだと思います。

IAM Policy Autopilotを利用することで、適切な権限を素早く定義するのに役立てることができるため、こういった悩みを減らすことができそうと思いました。

MCPサーバー以外でも、コマンドラインツールとして利用することもできるので、手軽に試すことができます。特に追加料金がかかるわけでもないので、ぜひ積極的に利用してみてください。

参考資料

12
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?