GET APIメソッド、POST httpメソッド、スキャンアクション設定でaws-lambda(ラムダではなく統合リクエストと統合レスポンスの両方のマッピングテンプレートを作成)を使用せずに、awsapi-gatewayとdynamodbを使用してRESTAPIを作成しました。スキャンを元のテーブルよりも小さくするために、dynamodbのグローバルセカンダリインデックスからフェッチしています。
スキャンする必要のある7,500個のアイテムのうち約1,000個しかスキャンできないことを除けば、うまく機能しています。s3バケットでjsonのページ付けを確認しましたが、可能であれば、awsapi-gatewayとdynamodbだけでシンプルに保ちたいと思っています。
統合リクエストやレスポンスのマッピングを変更して、ペイロード内の7,500個のアイテムすべてを取得する方法はありますか?そうでない場合、あなたは何を提案しますか?
以下は、私が使用しているマッピングコードで、必要な7,500ではなく1000アイテムのjsonペイロードで機能します。
統合リクエスト:
{
"TableName": "TrailData",
"IndexName": "trail-index"
}
統合応答:
#set($inputRoot = $input.path('$'))
[
#foreach($elem in $inputRoot.Items)
{
"id":$elem.id.N,
"trail_name":"$elem.trail_name.S",
"challenge_rank":$elem.challenge_rank.N,
"challenge_description":"$elem.challenge_description.S",
"reliability_description":"$elem.reliability_description.S"
}
#if($foreach.hasNext),#end
#end
]
これが私のAPIのGETメソッド設定のスクリーンショットです:APIスクリーンショット
私はすでにこれをチェックしました:stackoverflowの質問に関連するトピックですが、それを自分の状況に適用する方法がわかりません。私はこれに多くの時間を費やしました。
dynamodbの1MBのクエリ制限を認識していますが、返される制限されたデータはわずか142KBです。
私はどんな助けや提案にも感謝します。私はこれに不慣れです。ありがとうございました!
この制限はダイナモスキャンに関連していないが、内VTL Response Template
#foreach 1000回の反復に制限されているここで問題です。
これを確認するには、#foreach
(または応答テンプレート全体を)削除するだけで、すべて(1MB)のレコードが表示されます(ただし、適切にフォーマットされていません)。
最も簡単な解決策は、リクエストパラメータを渡して、Dynamoテーブルから必要な属性のみを制限することです。
{
"TableName":"ana-qa-linkshare",
"Limit":2000,
"ProjectionExpression":"challenge_rank,reliability_description,trail_name"
}
ただし、複数のforeachループで1000を超える単一のループを実行することは避けられますが、テンプレートでは少し複雑になり、代わりにラムダを使用できます。しかし、これがどのように見えるかです。
#set($inputRoot = $input.path('$'))
#set($maxRec = 500)
#set($totalLoops = $inputRoot.Count / $maxRec )
#set($outerArray = [0..$totalLoops])
#set($innerArray = [0..$maxRec])
{
[
#foreach($outer in $outerArray)
#foreach($inner in $innerArray)
{
grab the element with $inputRoot.Items.get(..index)
and Build JSON here.
}
#end
#end
]
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加