問題タブ [dynamodb-queries]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
amazon-dynamodb - サーバーレスの DynamoDB、Fn::GetRef を使用してグローバル セカンダリ インデックスを参照
DynamoDB テーブルで定義している API/サービスがあります。いくつかのクエリをサポートするために、いくつかのインデックス (グローバル セカンダリ インデックスとして定義) があります。GSI 定義を使用してテーブルを設計し、正しいクエリのように見えます。ただし、クエリを作成すると、次の例外が発生します。
例外の上部には、getRoomMessages メソッドis not authorized to perform: dynamodb:Query on resource:
の ARN が表示され、グローバル セカンダリ インデックスの ARN が表示されます。
グローバル セカンダリ インデックスへのアクセス権を付与するポリシーを定義する必要があることは明らかです。しかし、その方法はまったく明らかではありません。DynamoDB に関する他の StackOverflow の質問で、ドキュメントが断片化されていて、何かを見つけるのがいかに難しいかについて不平を言っているのを見てきました。私は同意しなければなりません。「断片化」という言葉は控えめすぎる。
サーバーレス フレームワークを使用しています。このprovider
セクションは、このポリシー/ロールの定義を示しています。
このResource
セクションでは、許可が宣言されているリソースをリストすることになっていると思います。1 つ目は、テーブル全体を参照します。追加した最後の 2 つは、インデックスを参照します。
編集:実行するとserverless deploy
、次のメッセージが出力されます。
これについていくつかのバリエーションを試しましたが、同じエラーが発生しました。要するに、Cloudfront 構文を使用して、インデックスの ARN を取得するにはどうすればよいかということですserverless.yml
。例外に示されているため、ARN は存在します。
DynamoDB テーブル定義:
上記の例外に対応して使用されているクエリ:
そして、クエリを生成する Lambda 関数のコード スニペット:
amazon-dynamodb - DynamoDB クエリのセカンダリ インデックス ValidationException: 条件パラメーターの型がスキーマの型と一致しません
Serverless Framework を使用して AWS サービスを開発しています。これまでのところ、1 つのテーブルと 2 つのグローバル セカンダリ インデックスがあります。グローバル セカンダリ インデックスに対してクエリを実行しようとしています。
クエリ:
Node.js DocumentClient ではなく、Node.js DynamoDB クライアントを使用すると、例外が発生します。
ドキュメントから、KeyConditionExpression はパーティション インデックスに対して等価一致を行う必要があることを理解しています。この場合、room
フィールドはroomIndex
グローバル セカンダリ インデックスのパーティション インデックスです。ドキュメントによると、ExpressionAttributeValues 配列を使用して値を式に代入します。私が判断できる限り、これは正しく構築されています。
例外メッセージは、クエリで指定された値とクエリ対象の列の型の間の型の不一致を考えさせます。それは正しい解釈ですか?しかし、そうではありません。以下に示すように、room
列は文字列として定義されS
ています。したがって、これは文字列比較であり、問題ないはずです。
繰り返しますが、DocumentClient は使用していません。そのクライアントを使用してクエリを簡素化することを提案する多くの回答を見てきました。私はそれを使用していません。
テーブルはサーバーレスで次のserverless.yml
ように定義されます。
テーブルには単純な主キーがあり、それぞれが単純な主キーを持つ 2 つのグローバル インデックスがあります。
クエリ コード: