こしあん
2025-02-08

AWS OrganizationにSCPを適用してみる


33{icon} {views}

AWS Organizationでのマルチアカウント環境にTerraformを組み合わせて、dev環境に対しRDSの操作をブロックするSCPを簡単に設定できる例を紹介。管理アカウントからの一元管理が可能で、Terraform destroyでいつでも制限を解除できる。

はじめに

  • よく問題に出てくるAWS Organization、個人でも無料で手軽にできることがわかったので試してみた
  • Organizationの設定はいろいろ詳しい記事があるので、この記事ではOrganization設定後にTerraformでSCPを設定することを行う

前提

以下の記事を参考に、AWS Organizationを作っておく。最低2アカウント必要。

【AWS Organizations】意外と簡単!個人で始めるAWSマルチアカウント入門

AWS Identity Centerも無料なので、ついでにSSO化しておくと良い。これも無料

以下のようなOrganizationを作っておく。

AWS Organization (ルート)
├── management アカウント
└── OU: dev
    └── develop アカウント

Terraform

SCPのアタッチなので、management側で操作するためのコード。例としてRDSを全ブロックしてみる。

# 現在のOrganizationの情報を取得
data "aws_organizations_organization" "org" {}

# 親OU(通常はOrganizationのルート)のIDを使って、名前が "dev" のOUを取得
data "aws_organizations_organizational_unit" "dev" {
  name      = "dev"
  parent_id = data.aws_organizations_organization.org.roots[0].id
}

# SCP (Service Control Policy) を作成
resource "aws_organizations_policy" "deny_rds" {
  name        = "DenyRDS"
  description = "dev OU に対して RDS の全アクションを禁止する SCP"
  type        = "SERVICE_CONTROL_POLICY"

  content = jsonencode({
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Deny",
        "Action": "rds:*",
        "Resource": "*"
      }
    ]
  })
}

# 作成した SCP を dev OU にアタッチ
resource "aws_organizations_policy_attachment" "attach_deny_rds" {
  policy_id = aws_organizations_policy.deny_rds.id
  target_id = data.aws_organizations_organizational_unit.dev.id
}

結果

管理アカウント側(management)

devのOUに対して「DenyRDS」のSCPがアタッチされている

子アカウント側(develop)

RDSの画面を見ると「Service Control Policyでブロックされているよ」と表示される

terraform destroyしてしまえばこの制約は解除される。

所感

  • Organizationさえ作っちゃえば割と簡単


Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

北海道の駅巡りコーナー


2 Comments

Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です