刀科の技術学習ブログ

アプリサイドから、web系フロント・バックとAWSによるインフラ領域へ学習を進めていきます。

【AWS】DynamoDBへのIAM設定

以前のエントリー『【AWS】DynamoDB Localにnode.jsでアクセスする』にて、DynamoDB Localを使って作業をしていましたが、
いよいよ本物のDynamoDBにアクセスしたくなった。

サーバーに適用する予定だった作成済みの、IAMユーザー情報に新たにDynamoDB用の設定を付け足します。
下記のような内容です。

{
    "Version": "YYYY-MM-DD",    //自動で発版される
    "Statement": [
        {
            "Sid": "Stmt1234567890123",    //自動で発版される
            "Effect": "Allow",
            "Action": [
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:GetRecords",
                "dynamodb:ListTables",
                "dynamodb:PutItem",
                "dynamodb:Scan",
                "dynamodb:UpdateItem"
            ],
            "Resource": [
                "*",
                "arn:aws:dynamodb:ap-northeast-1:[使用するAWSアカウントID]:user/${aws:username}"
            ]
        }
    ]
}

実は記事に書くまでに、かなりハマッてました。GWの一日を使ったという、とても大きな勉強代でした。

何にハマッたかというと、”Resource”の設定内容です。
並行して作業してるAndroidアプリがあるのですが、そっちでもアプリ用のIAMを作成していて、”Resource”のARNを

arn:aws:s3:::バケット名/パス/*

と書いて、意図通りに動いていたので同じように書いたわけです。
ところが、これでは『「arn:aws:iam::AWSアカウントid:user/IAMユーザー名」に、DynamoDB APIを実行する権限はないぞ』と怒られてしまい、何が悪いのか分からなかった。

色々と記事を探していて、こちらのcloudpackさんのブログからヒントを見つけました。

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

記事の中盤あたりにこのように書いてあり、レスポンスのエラーメッセージにもDynamoDBのARNではなく、IAMのARNに対して権限が無いと言われていたので、冒頭の記載内容のように書いてシミュレートしたところ、意図通りの結果が得られました。

意図通りの結果が得られたからといって、”*”がセキュリティ的によろしくない気がします。
アドバイスやご指摘よろしくお願いします。