[アップデート] RCP が DynamoDB をサポートするようになりました
いわさです。
AWS Organizations の RCP(リソースコントロールポリシー)を使うと、リソースベースポリシーなどを使った組織外へのアクセス許可の境界を Organizations で管理することができます。
この RCP 非常に便利ですがサポートされているサービスがまだ限定的です。
先月のアップデート Cognito と CloudWatch Logs がサポートされましたが[1]、先日のアップデートで DynamoDB もサポートされるようになりました。
DynamoDB はリソースベースポリシーをサポートしており組織外からのクロスアカウントアクセスをメンバーアカウントの裁量で許可させることができます。
このあたりを組織管理者がコントロールできるようになります。
リソースベースポリシーでクロスアカウントさせてみる
まずは検証環境を用意します。
次のようにある Organizations 内の AWS アカウントに対して次のようなリソースベースポリシーを設定します。
テーブルを所有するアカウント外からのアクセスも許可しています。許可している AWS アカウントは組織内の他のメンバーアカウントと、組織外の AWS アカウントをどちらも指定しています。

まず、RCP がまだアタッチされていない状態で確認してみましょう。
組織外の AWS アカウントから上記テーブルにアイテムを追加してみます。
% aws dynamodb put-item --table-name arn:aws:dynamodb:ap-northeast-1:123456789012:table/hoge0215dynamodb --item '{"hoge": {"S": "hoge1"}, "name": {"S": "test-name"}}' --profile hoge
コマンドは成功し、次のようにアイテムが作成できましたね。

リソースコントロールポリシーで組織外からのアクセスを制御してみる
続いて、RCP を使って組織外からのクロスアカウントアクセスを制限してみましょう。
組織内は許可します。
RCP を作成しようとすると、次のように DynamoDB が選択できることが確認できますね。

次のようなポリシーを作ってみました。対象 Organizations 以外からのクロスアカウントアクセスを拒否します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Deny",
"Principal": "*",
"Action": "dynamodb:*",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:PrincipalOrgID": "o-8j81brsjuj"
}
}
}
]
}
上記ポリシーを、DynamoDB リソースを持っている AWS アカウントが所属する OU にアタッチしました。

先程と同じように組織外のアカウントからアクセスしてみましょう。
% aws dynamodb put-item --table-name arn:aws:dynamodb:ap-northeast-1:123456789012:table/hoge0215dynamodb --item '{"hoge": {"S": "hoge1"}, "name": {"S": "test-name"}}' --profile hoge
An error occurred (AccessDeniedException) when calling the PutItem operation: User: arn:aws:iam::1111222233334444:user/hoge is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:ap-northeast-1:123456789012:table/hoge0215dynamodb with an explicit deny in a resource control policy
リソースベースポリシーにて組織外からのクロスアカウントアクセスを許可しているのも関わらず、期待どおりリソースコントロールポリシーで制限されていることが確認出来ました。良いですね。
続いて組織内のアカウントからクロスアカウントアクセスしてみましょう。
% aws dynamodb put-item --table-name arn:aws:dynamodb:ap-northeast-1:123456789012:table/hoge0215dynamodb --item '{"hoge": {"S": "hoge2"}, "name": {"S": "test-name"}}' --profile hogeadmin
こちらは問題なくクロスアカウントアクセスに成功しました。次のように新しいアイテムが作成できています。

さいごに
本日は RCP が DynamoDB をサポートするようになったので使ってみました。
Cognito がサポートされて DynamoDB がサポートされていなかったのが意外ですね。
DynamoDB のリソースベースポリシー周りを RCP でアクセス許可境界を設定したい時などは需要ありそうです。






