✅️2025/6/17 IAMチュートリアルをTerraform&LocalStackでやる
/mrsekut-book-B085PZCMG2/028 (第3章 IAMチュートリアル)を読むついでに、
Terraform
LocalStack
でやる
1. IP アドレス制限をするカスタマー管理ポリシーを作成する
2. グループを作成する
3. 作成したグループに、 全サービスの参照権限とIPアドレス制限をしたカスタマー管理ポリシーを紐付ける
4. IAM ユーザーを作成し、 作成したグループをアタッチする
5. クロスアカウントロール (IAMロール) を作成し、 作成した IAMユーザーからのみスイッチできるようにする
/mrsekut-book-B085PZCMG2/029: 3.1 IAMポリシーの作成
Customer Managed Policy (IAM Policy)を作成
resource "aws_iam_policy"を使う
code:tf (rb)
# 1. IPアドレス制限をするカスタマー管理ポリシーを作成
resource "aws_iam_policy" "ip_restriction_policy" {
name = "IPRestrictionPolicy"
path = "/"
description = "IP address restriction policy"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = "*"
Resource = "*"
Condition = {
IpAddress = {
"aws:SourceIp" = [
"127.0.0.1/32", # localhost
"172.17.0.0/16", # Docker default bridge network
"10.0.0.0/8" # プライベートネットワーク範囲
]
}
}
}
]
})
}
/mrsekut-book-B085PZCMG2/035: 3.2 IAMグループの作成
IAMグループの作成
resource "aws_iam_group"を使う
code:tf(rb)
# 2. グループを作成
resource "aws_iam_group" "view_only_users" {
name = "view_only_users"
path = "/"
}
3. 作成したグループに、 全サービスの参照権限とIPアドレス制限をしたカスタマー管理ポリシーを紐付ける
resource "aws_iam_group_policy_attachment"を使う
code:tf(rb)
# 3. グループに2つのポリシーをアタッチ
# - 上で作成したIPアドレス制限ポリシー
# - AWS管理ポリシー「ReadOnlyAccess」
resource "aws_iam_group_policy_attachment" "view_only_users_ip_restriction" {
group = aws_iam_group.view_only_users.name
policy_arn = aws_iam_policy.ip_restriction_policy.arn
}
resource "aws_iam_group_policy_attachment" "view_only_users_read_only" {
group = aws_iam_group.view_only_users.name
policy_arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
}
上が、1で自作したCustomer Managed Policy (IAM Policy)で、
下が、AWS Managed Policy (IAM Policy)の1つ
/mrsekut-book-B085PZCMG2/038: 3.3 IAMユーザの作成
resource "aws_iam_user"でIAMユーザを作成
resource "aws_iam_user_group_membership"でgroupに属させる
code:tf(rb)
# 4. IAMユーザーを作成
# - IAMユーザを作成し、上で作成したグループに追加する
resource "aws_iam_user" "test_user01" {
name = "test-user01"
path = "/"
}
resource "aws_iam_user_group_membership" "test_user01_groups" {
user = aws_iam_user.test_user01.name
groups = [
aws_iam_group.view_only_users.name
]
}
/mrsekut-book-B085PZCMG2/040: 3.4 クロスアカウントロールの作成
Cross-Account Roleを作る
あー、「ロール」自体が権限というわけではなく
ロールを作って、そこに権限を付与するのか
code:tf(rb)
# 5. 現在のAWSアカウントIDを取得
data "aws_caller_identity" "current" {}
# 5. クロスアカウントロール(IAMロール)を作成
resource "aws_iam_role" "cross_account_role" {
name = "SwitchRoleForTestUser01"
path = "/"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = {
AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:user/${aws_iam_user.test_user01.name}"
}
Action = "sts:AssumeRole"
}
]
})
}
# 5. ロールにポリシーをアタッチ(例:管理者権限)
resource "aws_iam_role_policy_attachment" "cross_account_admin" {
role = aws_iam_role.cross_account_role.name
policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"
}
data "aws_caller_identity"
resource "aws_iam_role"
resource "aws_iam_role_policy_attachment"