Amazon DynamoDB
開発者ガイド (API バージョン 2012-08-10)

Amazon DynamoDB でアイデンティティベースのポリシー (IAM ポリシー) を使用する

このトピックでは、アカウント管理者が IAM ID (ユーザー、グループ、ロール) にアクセス権限ポリシーをアタッチし、それによって Amazon DynamoDB リソースでオペレーションを実行するアクセス権限を付与する方法を示すアイデンティティベースのポリシーの例を示します。

重要

初めに、Amazon DynamoDB リソースへのアクセスを管理するための基本概念と、使用可能なオプションについて説明する概要トピックをお読みになることをお勧めします。詳細については、「Amazon DynamoDB リソースへのアクセス許可の管理の概要」を参照してください。

このセクションでは、次のトピックを対象としています。

以下に示しているのは、アクセス権限ポリシーの例です。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DescribeQueryScanBooksTable", "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:account-id:table/Books" } ] }

このポリシーには、us-west-2 リージョンのテーブルで 3 つの DynamoDB アクション (dynamodb:DescribeTabledynamodb:Querydynamodb:Scan) を許可する 1 つのステートメントがあります。これは、account-id で指定される AWS アカウントで所有されています。 値の Amazon リソースネーム (ARN)Resource では、アクセス権限が適用されるテーブルを指定します。

Amazon DynamoDB コンソールを使用するために必要なアクセス権限

DynamoDB コンソールを使用して作業するユーザーに対しては、ユーザーに AWS アカウントの DynamoDB リソースの使用を許可する最小限のアクセス権限のセットが必要です。これらの DynamoDB アクセス許可に加えて、コンソールでは次のサービスからのアクセス許可が必要になります。

  • メトリクスとグラフを表示する Amazon CloudWatch アクセス許可。

  • DynamoDB データをエクスポートおよびインポートする AWS Data Pipeline アクセス許可。

  • エクスポートおよびインポートに必要なロールにアクセスする AWS Identity and Access Management アクセス許可。

  • CloudWatch アラームがトリガーされるたびに通知する Amazon Simple Notification Service アクセス許可。

  • DynamoDB ストリーム レコードを処理する AWS Lambda アクセス許可。

これらの最小限必要なアクセス権限よりも制限された IAM ポリシーを作成している場合、その IAM ポリシーを使用するユーザーに対してコンソールは意図したとおりには機能しません。「Amazon DynamoDB での AWS 管理 (事前定義) ポリシー」で説明されているとおり、ユーザーが DynamoDB コンソールを使用できること、および、AmazonDynamoDBReadOnlyAccess 管理対象ポリシーがユーザーにアタッチされていることを確認してください。

AWS CLI または Amazon DynamoDB API のみを呼び出すユーザーには、最小限のコンソールアクセス権限を付与する必要はありません。

Amazon DynamoDB での AWS 管理 (事前定義) ポリシー

AWS は、AWS によって作成され管理されるスタンドアロンの IAM ポリシーが提供する多くの一般的ユースケースに対応します。これらの AWS 管理ポリシーは、一般的ユースケースに必要なアクセス権限を付与することで、どの権限が必要なのかをユーザーが調査する必要をなくすことができます。詳細については、『IAM ユーザーガイド』の「AWS 管理ポリシー」を参照してください。

アカウントのユーザーにアタッチ可能な以下の AWS 管理ポリシーは、DynamoDB に固有のもので、ユースケースシナリオ別にグループ化されます。

  • AmazonDynamoDBReadOnlyAccess – AWS マネジメントコンソール を使用して DynamoDB リソースへ読み取り専用アクセスを付与します。

  • AmazonDynamoDBFullAccess – AWS マネジメントコンソール を使用して DynamoDB リソースへのフルアクセスを付与します。

  • AmazonDynamoDBFullAccesswithDataPipeline – AWS マネジメントコンソール を使用して、AWS Data Pipeline によるエクスポートおよびインポートを含む、DynamoDB リソースへのフルアクセスを付与します。

注記

IAM コンソールにサインインし、特定のポリシーを検索することで、これらのアクセス権限ポリシーを確認することができます。

独自のカスタム IAM ポリシーを作成して、DynamoDB のアクションとリソースのための権限を許可することもできます。こうしたカスタムポリシーは、該当するアクセス権限が必要な IAM ユーザーまたはグループにアタッチできます。

お客様が管理するポリシーの例

このセクションでは、さまざまな DynamoDB アクションのアクセス権限を付与するユーザーポリシー例を示しています。これらのポリシーは、AWS SDK または AWS CLI を使用しているときに機能します。コンソールを使用している場合は、「Amazon DynamoDB コンソールを使用するために必要なアクセス権限」で説明しているコンソールに固有の追加のアクセス権限を付与する必要があります。

注記

すべての例で、us-west-2 リージョンを使用し、架空のアカウント ID を含めています。

例 1: ユーザーがテーブルで任意の DynamoDB アクションを実行することを許可する

以下のアクセス権限のポリシーでは、テーブルでのすべての DynamoDB アクションのアクセス権限を付与します。Resource で指定された ARN 値は、特定のリージョンのテーブルを識別します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllAPIActionsOnBooks", "Effect": "Allow", "Action": "dynamodb:*", "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

注記

リソース ARN のテーブル名 (Books) をワイルドカード文字 (*) に置き換える場合、アカウントのすべてのテーブルで、任意の DynamoDB アクションが許可されます。これを行う場合は、セキュリティへの影響について慎重に考慮してください。

例 2: テーブル内の項目の読み取り専用アクセスを許可する

以下のアクセス権限のポリシーでは、GetItem および BatchGetItem DynamoDB アクションのみのアクセス権限を付与し、それによってテーブルへの読み取り専用アクセスを設定します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadOnlyAPIActionsOnBooks", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

例 3: 特定のテーブルでの入力、更新、および削除オペレーションを許可する

次のアクセス権限ポリシーでは、特定の DynamoDB テーブルで、PutItemUpdateItem、および DeleteItem アクションのアクセス権限を付与します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "PutUpdateDeleteOnBooks", "Effect": "Allow", "Action": [ "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

例 4: 特定のテーブルおよびそのテーブルのすべてのインデックスにアクセスを許可する

以下のアクセス権限ポリシーでは、テーブル (Book) のすべての DynamoDB アクションと、そのテーブルのすべてのインデックスにアクセス権限を付与します。インデックスの動作の詳細については、「セカンダリインデックスを使用したデータアクセス性の向上」を参照してください。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessAllIndexesOnBooks", "Effect": "Allow", "Action": [ "dynamodb:*" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/Books", "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*" ] } ] }

例 5: 別のテスト環境および運用環境のアクセス権限ポリシーの設定

たとえば、テスト環境と本番環境が別々にあり、各環境で、ProductCatalog という名前のテーブルを独自のバージョンで維持するとします。これらの ProductCatalog テーブルを同じ AWS アカウントから作成する場合、アクセス権限の設定方法により、本番環境に対してテスト作業の影響が発生する可能性があります。この理由として、同時発生の作成アクションと削除アクションに対する制限が AWS アカウントレベルで設定されていることなどが挙げられます。この結果、テスト環境内の各アクションによって、本番環境で利用可能なアクションの数が減少します。また、テスト環境内のコードが本番環境内のテーブルに偶然にアクセスしてしまう危険性もあります。このような問題を防ぐには、本番環境とテスト環境に別々の AWS アカウントを作成することを検討します。

さらに、Bob と Alice という 2 人の開発者が ProductCatalog テーブルをテストしているとします。開発者ごとに別々の AWS アカウントを作成する代わりに、開発者間で同じテストアカウントを共有することができます。このテスト用アカウントでは、Alice_ProductCatalogBob_ProductCatalog など、対象の開発者ごとに、同じテーブルのコピーを作成できます。この場合、テスト環境用に作成した AWS アカウント内で、IAM ユーザーの Alice と Bob を作成できます。このとき、所有するテーブルに対して DynamoDB アクションを実行できるように、この 2 人のユーザーにアクセス権限を付与することができます。

これらのユーザーアクセス権限を付与するには、次のいずれかを実行します。

  • 各ユーザーに別々のポリシーを作成し、各ユーザーに個別に割り当てます。たとえば、以下のポリシーをユーザーである Alice にアタッチすることで、Alice_ProductCatalog テーブルに対する DynamoDB アクションをすべて許可することができます。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllAPIActionsOnAliceTable", "Effect": "Allow", "Action": [ "dynamodb:*" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Alice_ProductCatalog" } ] }

    次に、ユーザー Bob に対して、同様のポリシーを異なるリソース (Bob_ProductCatalog テーブル) で作成できます。

  • 個々のユーザーにポリシーを付与する代わりに、IAM ポリシー変数を使用して単一のポリシーを記述し、グループに付与することができます。この例では、グループを作成し、そのグループにユーザー Alice とユーザー Bob の両者を追加する必要があります。次の例では、${aws:username}_ProductCatalog テーブルのすべての DynamoDB アクションを実行できる権限を付与します。ポリシーが評価されると、ポリシー変数 ${aws:username} はリクエスターのユーザー名に置き換えられます。たとえば、Alice が項目の追加要求を送信する場合、Alice が Alice_ProductCatalog テーブルにアイテムを追加する場合にのみ、そのアクションが許可されます。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllAPIActionsOnUserSpecificTable", "Effect": "Allow", "Action": [ "dynamodb:*" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_ProductCatalog" }, { "Sid": "AdditionalPrivileges", "Effect": "Allow", "Action": [ "dynamodb:ListTables", "dynamodb:DescribeTable", "cloudwatch:*", "sns:*" ], "Resource": "*" } ] }

注記

IAM ポリシー変数を使用する場合、ポリシーで明示的にアクセスポリシー言語の 2012-10-17 バージョンを指定する必要があります。アクセスポリシー言語のデフォルトバージョン (2008-10-17) では、ポリシー変数をサポートしていません。

具体的なテーブルをリソースとして特定する代わりに、ワイルドカード文字 (*) を使用して、すべてのテーブルに権限を付与することができます。次に示すように、各テーブル名の先頭には、リクエストを行っている IAM ユーザーの名前が付きます。

"Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_*"

例 6: リザーブドキャパシティーのサービス購入をユーザーに禁止する

DynamoDB のお客様は、「Amazon DynamoDB 料金表」に説明されているように、リザーブドキャパシティーを購入することができます。リザーブドキャパシティーでは、1 回限りの前払い料金を支払い、期間中、大幅な節約ができる最小使用レベルを支払う契約を結びます。AWS マネジメントコンソール を使用して、リザーブドキャパシティーを表示し、購入できます。ただし、組織のすべてのユーザーに、同じレベルのアクセスを付与しないことをお勧めします。

DynamoDB は、リザーブドキャパシティー管理へのアクセスの制御のために、次の API オペレーションを提供します。

  • dynamodb:DescribeReservedCapacity – 現在有効なリザーブドキャパシティーの購入を返します。

  • dynamodb:DescribeReservedCapacityOfferings – AWS で現在提供されているリザーブドキャパシティープランについての詳細を返します。

  • dynamodb:PurchaseReservedCapacityOfferings – リザーブドキャパシティーの実際の注文を実行します。

AWS マネジメントコンソール はこれらの API オペレーションを使用してリザーブドキャパシティーの情報を表示し、購入を行います。アプリケーションプログラムからこれらのオペレーションを呼び出すことはできません。オペレーションはコンソールからのみアクセス可能であるためです。ただし、IAM アクセス権限ポリシーでこれらのオペレーションへのアクセスを許可または拒否することができます。

次のポリシーでは、ユーザーは AWS マネジメントコンソール を使用してリザーブドキャパシティーのサービスと現在の購入を確認できます。ただし、新しい購入は拒否されます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowReservedCapacityDescriptions", "Effect": "Allow", "Action": [ "dynamodb:DescribeReservedCapacity", "dynamodb:DescribeReservedCapacityOfferings" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*" }, { "Sid": "DenyReservedCapacityPurchases", "Effect": "Deny", "Action": "dynamodb:PurchaseReservedCapacityOfferings", "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*" } ] }

例 7: DynamoDB ストリームのみの読み取りアクセスを許可する (テーブルを除く)

テーブルで DynamoDB ストリーム を有効にすると、テーブル内のデータ項目に加えられた各変更に関する情報がキャプチャされます。詳細については、「DynamoDB ストリーム を使用したテーブルアクティビティのキャプチャ」を参照してください。

場合によっては、アプリケーションが DynamoDB テーブルからデータを読み取らないようにする一方で、そのテーブルのストリームへのアクセスは許可したいことがあります。たとえば、項目の更新が検出されたときにストリームをポーリングし、Lambda 関数を呼び出して、追加の処理を実行するよう AWS Lambda を設定できます。

DynamoDB ストリーム へのアクセスを制御するために、以下のアクションを使用できます。

  • dynamodb:DescribeStream

  • dynamodb:GetRecords

  • dynamodb:GetShardIterator

  • dynamodb:ListStreams

次の例では、GameScores という名前のテーブルでストリームにアクセスするアクセス権限をユーザーに付与するポリシーを作成します。ARN の最後のワイルドカード (*) は、そのテーブルに関連付けられた任意のストリーム ID に一致します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessGameScoresStreamOnly", "Effect": "Allow", "Action": [ "dynamodb:DescribeStream", "dynamodb:GetRecords", "dynamodb:GetShardIterator", "dynamodb:ListStreams" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*" } ] }

このポリシーは GameScores テーブルのストリームへのアクセスを許可しますが、テーブル自体へのアクセスは許可しないことに注意してください。

例 8: AWS Lambda 関数が DynamoDB ストリームレコードを処理できるようにする

DynamoDB ストリームの新しいイベントに基づいて特定のアクションを実行する場合、それらの新しいイベントによってトリガーされる AWS Lambda 関数を記述できます。ストリームイベントでの Lambda の使用の詳細については、「DynamoDB ストリーム と AWS Lambda のトリガー」を参照してください。このような Lambda 関数には、DynamoDB ストリームからデータを読み取るアクセス権限が必要です。

Lambda にアクセス権限を付与するには、Lambda 関数の IAM ロール (実行ロール) に関連付けられたアクセス権限ポリシーを使用します。これは、Lambda 関数を作成するときに指定します。

たとえば、次のアクセス権限ポリシーを実行ロールに関連付けて、リストされた DynamoDB ストリーム アクションを実行するアクセス権限を Lambda に付与できます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowLambdaFunctionInvocation", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "*" ] }, { "Sid": "AllAPIAccessForDynamoDBStreams", "Effect": "Allow", "Action": [ "dynamodb:GetRecords", "dynamodb:GetShardIterator", "dynamodb:DescribeStream", "dynamodb:ListStreams" ], "Resource": "*" } ] }

詳細については、AWS Lambda Developer Guide の「AWS Lambda のアクセス権限モデル」を参照してください。