AWS
DynamoDB
ozvisionDay 18

特定のDynamoDBテーブルにのみCRUD権限を付け...たかった夢の跡

株式会社オズビジョン@terra_yuccoです。
現在オズビジョンのサービス運営は社員だけではなく、派遣社員、アルバイト、外部コラボレータ、その他様々な方々に支えられて成り立っています。
今回はその中で、開発の中で特定のDynamoDBのテーブルだけCRUDが必要になるケースがあり、その際にいろいろ調査をしたので、その結果をまとめました。

実際にやったこと

まずIAMポリシーを作る

やりたい操作

  • SQLで言うDDLレベルの操作は不要。DMLがあればいい
    • いわゆるCRUD - Create / Read / Update / Delete
  • 対象テーブルは開発環境のテーブル
    • 複数環境のテーブルが同じAWSアカウントにあり、環境区別はテーブル名で行っている (サンプルではわかりやすいようにプレフィクスtest_)

該当する設定項目

  • DynamoDBのポリシーで該当しそうなものを探す
    • 厳密にはもっと適切なページがあると思うのですが、API Referenceを参照しました。
      • dynamodb:PutItem
      • dynamodb:GetItem
      • dynamodb:Query
      • dynamodb:Scan
      • dynamodb:UpdateItem
      • dynamodb:DeleteItem
  • この辺いろいろ探したのですが、今回コンソールからの利用を想定していたため、ListTablesとか他もいろいろ必要になり、最終的には"dynamodb:*"で開けました。

対象テーブルのarn

以下の場所からコピペします。
DynamoDB > Tables > 該当テーブル選択して右ペイン
image.png

…なのですが今回結局、テーブルを1つずつ指定はしなかったため、このままは使いませんでした。\(^o^)/

jsonにしてみた

全部を一度Allowし、必要ないところをDeny

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "dynamodb:*"
            ],
            "Resource": [
                "arn:aws:dynamodb:ap-northeast-1:xxxxxxxxxxxx:table/production*",
                "arn:aws:dynamodb:ap-northeast-1:xxxxxxxxxxxx:table/stage*"
            ]
        }
    ]
}

結局使わなかったやつ (validateは通る)

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "dynamodb:DescribeTable",
            "dynamodb:PutItem",
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem"
        ],
        "Resource": [
            "arn:aws:dynamodb:ap-northeast-1:xxxxxxxxxxxx:table/test_table",
            "arn:aws:dynamodb:ap-northeast-1:xxxxxxxxxxxx:table/test_table2"
        ]
    }
}

実際にポリシーを作る

(中の人都合でこちらは12/29以降に追記します...)

お願い

現状、この設定で特に問題は発生していないのですが
この設定だとテーブルにインデックスが作れてしまう?かもしれないという点をパートナーさんに聞かれ即答できずにいます。
AWS CLI DYNAMODB のページを見ると、インデックス作成に該当するアクションはなさそうなのですが、ここを制限するにはどうしたらいいのか…
もしご存知の方がいらっしゃいましたら、コメントいただけると幸いです!
(コンソールから該当テーブルに遷移することはでき、CRUDだけが可能!となるのが理想です)

おわりに

ぶっちゃけ開発と本番でアカウントを分けていればこのような問題は起こらないのですが、一度同じアカウントに作ってしまうとなかなか切り分けられないので、こういう風に対処していますという共有でした。

オズビジョンのアドベントカレンダーは本日でひとめぐりしていますが(この記事は12/18分ですが、書いたのは12/25ですorz)、また機会があれば、エンジニア一同、このようなチャレンジをしていきたいと思っています。ぜひ、私たちの次のチャレンジを楽しみにしていただければと思います。
それでは皆様良いお年を。
【おしまい。】