AWSのIAM Userが操作できるリージョンを縛るためのPolicyです。
以下は例となります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenySpecificRegionsAccess",
"Effect": "Deny",
"Action": [
"ec2:*",
"rds:*",
"redshift:*",
"ecs:*",
"lambda:*",
"dynamodb:*",
"apigateway:*",
"batch:*",
"workspaces:*",
"glue:*"
],
"Resource": [
"*"
],
"Condition": {
"StringNotEquals": {
"aws:RequestedRegion": [
"ap-northeast-1",
"us-east-1",
"ap-northeast-3"
]
}
}
}
]
}
#ポイント
上記ポリシーを翻訳すると、
「リージョンがap-northeast-1/us-east-1/ap-northeast-3ではない場合、指定されたActionをDenyする」
となります。
別途、フルアクセスを当てておきつつ、追加でこのように書くと、リージョンがap-northeast-1/us-east-1/ap-northeast-3ならば全部利用できるがその他では操作できない、といったことを実現できます。(AllowよりもDenyが優先です)
これにより、無秩序にリソースが乱立することを防ぎ、ガバナンスが効いた使い方ができるようになります。
#注意点
ならばActionに*って書けばいいんじゃないの?と考えるところですが、AWSにはリージョンの範囲がない「グローバル」のサービス(例:IAM など)があり、*と書くとこれらのサービスが使えなくなるという欠点があります。リージョンを縛るConditionは、最終的に操作するIAM Policyで指定されていなければならず、スイッチロールでは回避できないようです。上記のPolicy例では、全サービスを縛るために、Actionにサービス名をひたすら書き続ける必要があります。
現実解は、上記のポリシーのように書きつつ、Actionで乱用されるとまずいものだけを縛り、課金状況やCloudTrailで監視しながら、Actionに追加していくといった流れになるかと思います。
(誠に恐縮ですが、より良いやり方がありましたら、ご教示いただけると幸いです)