本記事では、AWS IAM ポリシーを Terraform(HCL)で管理する実践的な方法について解説します。
手動設定(AWS コンソール)から IaC(Infrastructure as Code)へ移行したい方を対象に、
設計方針・サンプルコード・運用時の注意点までをまとめています。
🎯 対象読者
- AWS を使い始めたが、IAM 管理が煩雑になってきた方
- Terraform を実務で使い始めたいエンジニア
- IAM ロール・ポリシーをコードで安全に管理したい方
🧩 なぜ Terraform で IAM を管理するのか
IAM をコンソールで管理すると、以下の課題が発生しがちです。
- 誰が・いつ・何を変更したか分からない
- 環境(dev / stg / prod)ごとの差分管理が困難
- 再現性が低く、属人化しやすい
Terraform を使うことで、
- ✅ 変更履歴を Git で管理
- ✅ 同一構成を複数環境へ安全に展開
- ✅ レビュー可能な IAM 設計
が可能になります。
🛠 Terraform による IAM 管理の基本構成
管理対象
- IAM Policy
- IAM Role
- Policy Attachment
ディレクトリ例
iam/
├─ main.tf
├─ variables.tf
├─ outputs.tf
✍️ IAM ポリシーを HCL で定義する
例:S3 読み取り専用ポリシー
resource "aws_iam_policy" "s3_read_only" {
name = "s3-read-only-policy"
description = "Allow read-only access to S3"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"s3:GetObject",
"s3:ListBucket"
]
Resource = "*"
}
]
})
}
📌 ポイント
-
jsonencodeを使うことで、JSON を HCL 内で安全に記述可能 - 可読性・レビュー性が向上
👤 IAM ロールとポリシーの関連付け
resource "aws_iam_role" "example_role" {
name = "example-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = {
Service = "ec2.amazonaws.com"
}
Action = "sts:AssumeRole"
}
]
})
}
resource "aws_iam_role_policy_attachment" "attach" {
role = aws_iam_role.example_role.name
policy_arn = aws_iam_policy.s3_read_only.arn
}
🚨 実務での注意点
1️⃣ Managed Policy と Inline Policy の使い分け
- 共通利用 → Managed Policy
- 個別用途 → Inline Policy
2️⃣ ポリシー肥大化を防ぐ
- 1 Policy = 1 責務を意識
- 不要な
*を避ける
3️⃣ terraform plan を必ずレビュー
IAM は セキュリティ直結のため、
plan の差分確認は必須です。
📦 運用を楽にするコツ
- 環境別に Workspace / module 分離
- IAM 用 module を作成して再利用
- CI で
terraform planを自動実行
✅ まとめ
Terraform を使った IAM 管理は、
- 🔒 セキュリティ向上
- 📄 構成の可視化
- 🔁 再現性の高い運用
を実現します。
まずは 小さな IAM ポリシーから Terraform 管理を始めてみてください。
🔗 参考リンク
- Terraform AWS Provider IAM Docs
- AWS IAM ベストプラクティス