AWS OrganizationにSCPを適用してみる
Posted On 2025-02-08
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