Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2026-10-24 JAWS JAWS-UG 茨城 #18 IAM Policy Autop...

2026-10-24 JAWS JAWS-UG 茨城 #18 IAM Policy Autopilotってなにさ。terraform planからIAM Policyつくれるの? / What's IAM Policy Autopilot

[JAWS-UG 茨城 #18 祝!2周年記念祭 - connpass](https://jawsug-ibaraki.connpass.com/event/407471/)
で話した内容。

IAM Policy Autopilot はなにか。Terraform Planとの連携についてLTしました

Avatar for SUZUKI Masashi

SUZUKI Masashi

October 24, 2026

More Decks by SUZUKI Masashi

Other Decks in Technology

Transcript

  1. おまえだれよ • • • すずきまさし/masasuzu/@masasuz 株式会社スリーシェイクSreake事業部シニアアーキテクト クラウドインフラなんでも屋さんをしてます ◦ お客様の外部から ▪

    設計、運用、構築等の技術支援を行います。 ◦ お客様の内部から ▪ インフラチームの一員として内製化支援も行います。 • 得意領域 ◦ AWS ▪ AWS Community Builder Cloud Operation Since 2024~2026 ▪ 2026 Japan All AWS Certifications Engineers ◦ Google Cloud ▪ Google Cloud Partner Top Engineer 2026 ◦ Terraform Copyright © 3-shake, Inc. All Rights Reserved. 2
  2. 目次 1. 2. 3. 4. IAM Policy Autopilotとは terraform planから

    IAM Policyが作れるとは 何に使えそうか まとめ Copyright © 3-shake, Inc. All Rights Reserved. 8
  3. IAM Policy Autopilot • • • AWS が公開している OSS (awslabs/iam-policy-autopilot)

    ◦ https://github.com/awslabs/iam-policy-autopilot ◦ 2025-11-30 公開。CLI と MCP サーバ ◦ アプリケーションのコードを静的解析してポリシーを作るツール 2026-08-18 の 0.3.0 で Terraform plan に対応 ◦ planのJSONファイルから、 apply用のポリシーを作る ◦ LLMを使わない決定論的な解析。同じ plan からは同じポリシーが作成される 手元のマシンで動く Copyright © 3-shake, Inc. All Rights Reserved. 10
  4. 3 つのサブコマンド • • • generate-policies ◦ コードまたはterraform planからIAM Policyを生成する

    fix-access-denied ◦ AccessDeniedのメッセージから足りない権限を割り出す mcp-server ◦ MCPサーバとして起動する ▪ generate_application_policies ▪ generate_policy_for_access_denied ▪ fix_access_denied Copyright © 3-shake, Inc. All Rights Reserved. 11
  5. generate-policies # app.py s3 = boto3.client("s3") table = boto3.resource("dynamodb").Table("sessions") def

    handler(event, context): obj = s3.get_object(Bucket="my-assets", Key=event["key"]) table.put_item(Item={"id": event["id"], "body": obj["Body"].read().decode()}) iam-policy-autopilot generate-policies app.py --region ap-northeast-1 --account 123456789012 {"Policies":[{"Policy":{"Id":"IamPolicyAutopilot","Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["dynamo db:PutItem","dynamodb:WriteDataForReplication"],"Resource":["arn:aws:dynamodb:ap-northeast-1:123456789012:table/*"]},{"Ef fect":"Allow","Action":["kms:Decrypt"],"Resource":["arn:aws:kms:ap-northeast-1:123456789012:key/*"],"Condition":{"StringE quals":{"kms:ViaService":["s3.ap-northeast-1.amazonaws.com"]}}},{"Effect":"Allow","Action":["kms:Decrypt"],"Resource":["a rn:aws:kms:ap-northeast-1:123456789012:key/*"],"Condition":{"StringEquals":{"kms:ViaService":["dynamodb.ap-northeast-1.am azonaws.com"]}}},{"Effect":"Allow","Action":["s3:GetObject","s3:GetObjectLegalHold","s3:GetObjectRetention","s3:GetObject Tagging","s3:GetObjectVersion"],"Resource":["arn:aws:s3:::*/*","arn:aws:s3:ap-northeast-1:123456789012:accesspoint/*/obje ct/*"]},{"Effect":"Allow","Action":["s3-object-lambda:GetObject"],"Resource":["arn:aws:s3:::*/*","arn:aws:s3:ap-northeast -1:123456789012:accesspoint/*/object/*"]}]},"PolicyType":"Identity"}]} Copyright © 3-shake, Inc. All Rights Reserved. 12
  6. 仕組み: API から IAM アクションへ 1. 2. 入力から「呼ばれる AWS の

    API」を割り出す ◦ SDK の呼び出し(s3.get_object → GetObject) AWS が公開しているサービスリファレンスで、 API を IAM アクションにマッピングする --explain 's3:*' で、どの API からそのアクションが入ったかを確かめられる Copyright © 3-shake, Inc. All Rights Reserved. 13
  7. fix-access-denied % echo 'User: arn:aws:sts::123456789012:assumed-role/ipa-handson-app/session is not authorized to perform:

    dynamodb:GetItem on resource: arn:aws:dynamodb:ap-northeast-1:123456789012:table/ipa-handson-reports because no identity-based policy allows the dynamodb:GetItem action' | iam-policy-autopilot fix-access-denied IAM Policy Autopilot Plan Principal: arn:aws:sts::123456789012:assumed-role/ipa-handson-app/session Action: dynamodb:GetItem Resource: arn:aws:dynamodb:ap-northeast-1:123456789012:table/ipa-handson-reports Denial: ImplicitIdentity Proposed permissions: - dynamodb:GetItem iam-policy-autopilot: apply refused (refused_non_tty) — run interactively in a TTY to apply changes, or use --yes flag • • AccessDeniedメッセージから原因特定して、 --yesフラグで適用もしてくれる IaCから変更したのであまり使わないが、原因特定はしやすいかも Copyright © 3-shake, Inc. All Rights Reserved. 14
  8. 使い方 terraform plan -out=plan.tfplan terraform show -json plan.tfplan > plan.json

    iam-policy-autopilot generate-policies plan.json \ --region ap-northeast-1 --account 123456789012 --pretty • • • • • terraformのplanを読み込んでその planをapplyするのに必要な IAM Policyを生成する plan の JSON を渡す。.tf を直接は読めない AWS の認証情報なしで試せる コードと plan は 1 回の実行に混ぜられない --regionと--accountを渡すことでポリシー内のリージョンとアカウント IDを埋めてくれる Copyright © 3-shake, Inc. All Rights Reserved. 19
  9. planファイルってなんだっけ • • • terraform plan(差分出力をするコマンド ) の出力結果 ◦ どのリソースがどう変わるかを出力

    terraform planでplanファイルを作ることによって、 terraform apply(変更適用)時に想定した変更が入るこ とを保証できる。 ◦ planからapplyの間に関係するリソースが変更されると stale扱いされてapplyが止まる PRのCIでチェックした変更がそのまま入ることを保証できる planファイルをPolicy as Codeツール(OPAなど)に食わせて統制を取る用途にも使われる Copyright © 3-shake, Inc. All Rights Reserved. 20
  10. planファイルの何を読んでいるか resource_changes の各要素のうち、使うのはこれだけ • type ◦ aws_dynamodb_table などのリソースタイプ • mode

    ◦ managed だけ残す。data (data ソース) は捨てる • change.actions ◦ create update delete no-op で、見る処理を変える • change.before / after ◦ 名前などを ARN に当てはめる Copyright © 3-shake, Inc. All Rights Reserved. 21
  11. changes.actionsとproviderの処理 planファイルの changes.actions • • providerの処理 create Create + Read

    update Update + Read delete Delete + Read delete, create(replace) Create + Delete + Read no-op Read Read は必ず入る (apply のたびに provider が状態を読み直すため ) 複数のplanファイルを渡すと和集合を取ります Copyright © 3-shake, Inc. All Rights Reserved. 22
  12. 生成された中身を見ると多い % iam-policy-autopilot generate-policies out/create.plan.json --region ap-northeast-1 --account 123456789012 |

    wc -c 6425 # 長いのでword countだけ、デモで中を見る • テーブルを作るだけなのに、中身を読み書きする GetItem Scan ◦ provider の処理を関数単位で拾い、 API に認可されうるアクションを全部付けるため広めにとるよ う Copyright © 3-shake, Inc. All Rights Reserved. 23
  13. ポリシー多いのは設計上の割り切り Issue #263 でのメンテナの回答 (2026-08-07) > Autopilot is a baseline

    policy generator and is prone to over-provisioning permissions for your applications, this is by design. > Autopilotはベースラインポリシー生成ツールであり、アプリケーションに対して過剰な権限を付与する傾向が ありますが、これは意図的な設計です。 0.3.0 の CHANGELOG > Also removed mentions of "minimal", which was misleading. > また、誤解を招く恐れがあった「最小限」という表現を削除しました。 • 出てくるのは本当に最小権限ではなく、少し広めに出てくる。 ◦ これをベースポリシーとして削ったり、増やしたりして調整するのがよし Copyright © 3-shake, Inc. All Rights Reserved. 24
  14. plan 用と apply 用のポリシーは作れる? CI でよくある構成 • • PR では

    plan 用ロール (読み取り中心 ) で terraform plan マージ後に apply 用ロール (書き込みあり ) で terraform apply • • 少なくともAdministratorAccess権限を与えるのはやめたい planは誰にさせてもいいが、 apply相当のことは特定の人だけ触らせたい それぞれのロールのポリシーを、 Autopilot で作れるか? Copyright © 3-shake, Inc. All Rights Reserved. 26
  15. 作れるけど、うーん • • • • 卵と鶏問題 ◦ terraform planするためにIAM Policyが必要なのにそれが

    planしないとわからない ▪ 最初は強い権限を持つ人が行わないといけない 一番最初にterraform planするとすべて createになる ◦ plan用のポリシーを得るためには applyをした後のplanファイルを食わせる必要がある。 createで作ったポリシーは Createはできても、Deleteができない ◦ deleteするためには deleteが入るplanファイルを食わせる必要がある ◦ Updateも同様 ◦ 変更があるたびに都度都度ポリシー調整が必要 有効活用してもそれほど楽にはなっていない。。。。 ? Copyright © 3-shake, Inc. All Rights Reserved. 27
  16. まとめ • • • IAM Policy Autopilot はコードや plan から

    IAM ポリシーの下書きを作る AWS の OSS。 ◦ 決定論的にポリシーを生成できる planファイルを使用して Terraform用のポリシーが生成できる。 ◦ Terraform自身が触るもの stateやdata は自分で足し、余分は削る必要がある ◦ そのplanファイルをapplyするためのポリシーなので内容が変わったら変更する必要 Coding Agentで非決定論的にポリシーを生成するより、決定論的にベースラインポリシーを生成して、そ れをCoding Agentで調整していくのが効率よいのではないか ? Copyright © 3-shake, Inc. All Rights Reserved. 31