AWS Organizations の サービスコントロールポリシー (SCP) を用いて、複数アカウントにリージョン利用制限するパターンをまとめてみた
はじめに
AWS Organizationsのサービスコントロールポリシー (以降、SCP) を設計時、アカウントにリージョン利用制限の設定したいことがあったため、SCPの設定パターンをまとめました。
SCPの概要や設定方法は、以下が参考になります。
下記のOrganizationsとOUを例にして、利用制限するパターンをご説明します。
A~Dアカウントの4つのアカウントが存在しています。
前提条件として、全てのアカウントには、FullAWSAccessがアタッチされています。
全アカウントを東京とバージニアリージョンのみ利用可
- Aアカウント
- 東京リージョン、バージニアリージョン
- Bアカウント
- 東京リージョン、バージニアリージョン
- Cアカウント
- 東京リージョン、バージニアリージョン
- Dアカウント
- 東京リージョン、バージニアリージョン
A~Dアカウント全てに、東京とバージニアリージョンのみ利用できるようにし、他のリージョンでの操作を制限します。
下記の設定で、region-restriction-1
というSCPを作成し、親OUにアタッチすると実現できます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RegionRestriction1", "Effect": "Deny", "Action": [ "*" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:RequestedRegion": [ "ap-northeast-1", "us-east-1" ] } } } ] }
Condition
内でStringNotEquals
をつけているため、東京とバージニアリージョン以外のリージョンは、全てのアクションがDenyされます。
新規アカウント用OU
すべてのアカウントを東京とバージニアリージョンに制限したい要件に加えて、新規アカウントを発行した際、全てのリージョンでデフォルトVPCを削除した後に、東京とバージニアリージョンに制限をしたい要件もあると思います。
その場合は、以下のOU構成のように、親OUにregion-restriction-1
をアタッチするのではなく、1階層下の子OUにアタッチします。
それによって、Setup OU配下は、新規アカウント(今回はAアカウント)は全てのリージョンが利用できますので、全てのリージョンでデフォルトVPCを削除します。
削除後に、新規アカウント(=Aアカウント)をSetup OU配下から子OU配下に移動させることで、リージョン制限することができます。
全てのリージョンでデフォルトVPCを削除後、新規アカウント(=Aアカウント)をSetup OU配下から子OU配下に移動させます。
特定のアカウントを除いて、東京とバージニアリージョンのみ利用可
利用可能リージョン
- Aアカウント
- 全てのリージョン
- Bアカウント
- 東京リージョン、バージニアリージョン
- Cアカウント
- 東京リージョン、バージニアリージョン
- Dアカウント
- 東京リージョン、バージニアリージョン
Aアカウントを除き、全てのアカウントに利用可能リージョンを東京とバージニアリージョンのみに制限します。
Aアカウントは、全てのリージョンを利用できます。
下記の設定で、region-restriction-2
というSCPを作成し、親OUにアタッチすると実現できます。
"aws:PrincipalAccount"
の値には、AアカウントIDを入れます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RegionRestriction2", "Effect": "Deny", "Action": [ "*" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:RequestedRegion": [ "ap-northeast-1", "us-east-1" ], "aws:PrincipalAccount": [ "AアカウントID" ] } } } ] }
Condition
内でStringNotEquals
をつけているため、AアカウントID以外、かつ、東京とバージニアリージョン以外のリージョンは、全てのアクションがDenyされます。
他のアカウントは東京とバージニアリージョンのみ利用、特定のアカウントは別リージョンのみ利用
- Aアカウント
- オハイオリージョン、オレゴンリージョン
- Bアカウント
- 東京リージョン、バージニアリージョン
- Cアカウント
- 東京リージョン、バージニアリージョン
- Dアカウント
- 東京リージョン、バージニアリージョン
Aアカウントを除き、全てのアカウントに利用可能リージョンを東京とバージニアリージョンのみに制限します。
Aアカウントは、オハイオとオレゴンリージョンのみに利用制限します。
下記の設定で、region-restriction-2
とregion-restriction-3
というSCPを作成し、親OUにアタッチすると実現できます。
"aws:PrincipalAccount"
の値には、AアカウントIDを入れます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RegionRestriction2", "Effect": "Deny", "Action": [ "*" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:RequestedRegion": [ "ap-northeast-1", "us-east-1" ], "aws:PrincipalAccount": [ "AアカウントID" ] } } } ] }
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RegionRestriction3", "Effect": "Deny", "Action": [ "*" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:RequestedRegion": [ "us-east-2", "us-west-2" ] }, "StringEquals": { "aws:PrincipalAccount": [ "AアカウントID" ] } } } ] }
Condition
内で、StringNotEquals
ではオハイオとオレゴンリージョン以外のリージョン、かつStringEquals
ではAアカウントIDのみ、全てのアクションがDenyされます。
1つのSCPに上記の2つのSCPをまとめることもできますが、今回は、わかりやすいように分けました。
複数アカウントに特定のリージョンのみ利用する制限を複数設定
- Aアカウント
- オハイオリージョン、オレゴンリージョン
- Bアカウント
- 東京リージョン、大阪リージョン
- Cアカウント
- 東京リージョン、バージニアリージョン
- Dアカウント
- 東京リージョン、バージニアリージョン
Aアカウントを除き、全てのアカウントに利用可能リージョンを東京とバージニアリージョンのみに制限します。
Aアカウントは、オハイオとオレゴンリージョンのみに利用制限します。
下記の設定で、region-restriction-2
とregion-restriction-3
、region-restriction-3
というSCPを作成し、親OUにアタッチすると実現できます。
region-restriction-2
の"aws:PrincipalAccount"
の値には、AアカウントIDとBアカウントIDを入れます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RegionRestriction2", "Effect": "Deny", "Action": [ "*" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:RequestedRegion": [ "ap-northeast-1", "us-east-1" ], "aws:PrincipalAccount": [ "AアカウントID", "BアカウントID" ] } } } ] }
region-restriction-3
の"aws:PrincipalAccount"
の値には、AアカウントIDのみを入れます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RegionRestriction3", "Effect": "Deny", "Action": [ "*" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:RequestedRegion": [ "us-east-2", "us-west-2" ] }, "StringEquals": { "aws:PrincipalAccount": [ "AアカウントID" ] } } } ] }
region-restriction-4
の"aws:PrincipalAccount"
の値には、BアカウントIDのみを入れます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RegionRestriction4", "Effect": "Deny", "Action": [ "*" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:RequestedRegion": [ "ap-northeast-1", "ap-northeast-3" ] }, "StringEquals": { "aws:PrincipalAccount": [ "BアカウントID" ] } } } ] }
注意事項
OUやアカウントにアタッチできるSCP数は、上限5つです。
上限緩和できないため、SCPがアタッチ出来ない場合、region-restriction-3
やregion-restriction-4
は、子OUや直接アカウントにSCPをアタッチするとよいでしょう。
[推奨] OUごとにリージョン制限をする
利用可能リージョン
- Aアカウント
- オハイオリージョン、オレゴンリージョン
- Bアカウント
- 東京リージョン、バージニアリージョン
- Cアカウント
- 東京リージョン、バージニアリージョン
- Dアカウント
- 東京リージョン、バージニアリージョン
OUごとにリージョン制限可能であれば、子OUごとにリージョン制限するSCPをアタッチする方法が運用としては楽です。
Aアカウントは、オハイオとオレゴンリージョンのみに利用を制限します。
B,C,Dアカウントは、東京とバージニアリージョンのみに利用を制限します。
下記の設定で、region-restriction-5
とregion-restriction-6
というSCPを作成し、それぞれ子OUにアタッチすると実現できます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RegionRestriction5", "Effect": "Deny", "Action": [ "*" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:RequestedRegion": [ "us-east-2", "us-west-2" ] } } } ] }
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RegionRestriction6", "Effect": "Deny", "Action": [ "*" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "aws:RequestedRegion": [ "ap-northeast-1", "us-east-1" ] } } } ] }
最後に
今回は、色々なパターンで、特定のリージョンのみ利用する制限をSCPで設定しました。
最後のパターンは、SCPが多すぎると、管理が大変なため、SCPの数や制限はほどほどにしましょう。