DynamoDBは便利です。
テーブル作成は、AWSのManagementConsoleウィザードで簡単にできます。
その為、簡単に作成し、すぐに検証することが可能です。
また、テーブル削除も同様に簡単に行う事が可能です。
テーブルはあるだけでお金が掛かる為、不要となったものの削除作業が楽なのは助かります。
しかし、肝心の本番用テーブルを消してしまわない様に注意が必要です。

そこで今回は、IAMアカウントで本番用と開発用と分けてアクセス制限してみたいと思います。

○制御内容

ネーミングルール(少なくとも本番用)が必要となる為、今回は下記のようにします。

  • 本番用はテーブル名の頭にprd_を付ける
  • 開発用はそれ以外

○アカウント

アカウントは二つ作成します。

  • 本番用アカウント prd_dynamo
  • 開発用アカウント dev_dynamo

○グループ

DynamoDBではアラート設定ができるため、cloudwatchの権限を付与します。
テーブル自体は個々のアカウントでアクセス制御しますので、cloudwatchの権限はgroupで管理します。
Policy Generatorで簡単に作れますが、一応JSONを記載しておきます。

{
"Statement": [
{
"Sid": "Stmt1354899265648",
"Action": [
"cloudwatch:*"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
]
}

では、実際にアカウントへのpolicy設定をしていきます。
まずはprd_dynamoです。

{
"Statement": [
{
"Sid": "Stmt1330073911360",
"Action": [
"dynamodb:DescribeTable",
"dynamodb:ListTables"
],
"Effect": "Allow",
"Resource": [
"*"
]
},
{
"Sid": "Stmt1330073911361",
"Action": [
"dynamodb:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:dynamodb:ap-northeast-1::table/prd_*"
]
}
]
}

キーとなるのは、次の二点です。

  • 最初のAllowでDescribeTableとListTablesを入れる事
    →これで全体のテーブルリストを表示する事ができます。全体を表示できるように設定しておかないと、
    自身のテーブルも表示出来ません。
    この設定でテーブルリストの表示のみできるようになります。
  • 次のAllowのリソースでtable/prd_*と記載する事
    →これでprd_*で始まるテーブルを全て制御できるようになります。

次にdev_dynamoです。

{
"Statement": [
{
"Sid": "Stmt1330073911370",
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:CreateTable",
"dynamodb:DeleteItem",
"dynamodb:DeleteTable",
"dynamodb:DescribeTable",
"dynamodb:GetItem",
"dynamodb:ListTables",
"dynamodb:PutItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:UpdateItem",
"dynamodb:UpdateTable"
],
"Effect": "Allow",
"Resource": [
"*"
]
},
{
"Sid": "Stmt1330073911371",
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:CreateTable",
"dynamodb:DeleteItem",
"dynamodb:DeleteTable",
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:UpdateItem",
"dynamodb:UpdateTable" ],
"Effect": "Deny",
"Resource": [
"arn:aws:dynamodb:ap-northeast-1::table/prd_*"
]
}
]
}

キーとなるのは、次の二点です。

  • 最初のAllowでDynamoDBの全ての権限を記載する事
    →これで全てのテーブルの制御ができるようになります。ほんとは*でも良いかと思うのですが、上手く動かなかったため個別に記載しています。
  • 次のDneyでtable/prd_*を記載する事
    →これでprd_*で始まるテーブルを全て制御出来なくなります。但し、ここの記載にListTablesとDescribeTableは記載してはいけません。テーブルリスト表示が出来なくなるため、全体のテーブルリストも表示できなくなります。

アクセス制御できていることを確認してみます。
まずはprd_dynamoです。

①テーブルリストが確認できます

②prd_testにアクセスできます

③testにアクセスできません

次にdev_dynamoです。

①テーブルリストが確認できます

②prd_testにアクセスできません

③testにアクセスできます

ActionはでResourceをprd_のAllowとDenyで逆にすれば簡単に制御できるかと思いましたが、
テーブルリスト表示などの細かい部分で*で制御できませんでした。

こちらの記事はなかの人(Macedonia Shooter)監修のもと掲載しています。
元記事は、こちら