【AWS/DynamoDB】知っておきたい知識 - putItem(作成)編

もくじ

DynamoDBを使うにあたって、知っておくべきことを連ねる。

リージョンとアベイラビリティーゾーン(AZ)

AWSにはリージョンが複数あり、そのリージョンの中に複数のアベイラビリティーゾーン(AZ)を持ちます。

(イメージ) f:id:bonoponz:20200911195158p:plain

リージョンは東京や香港、米国など世界中に存在します。ちなみに東京リージョンのコードはap-northeast-1です。

東京リージョンの中にアベイラビリティーゾーン(AZ)は3つあります。アクセスするとき、どのアベイラビリティーゾーン(AZ)にアクセスしているのかは知る必要がないので「ふーんそうなんだー」くらいの認識で普段は問題ありません。(調べればわかるらしい)

DynamoDB

データベースにデータが保存されるとき、ほぼ同時に3つのアベイラビリティーゾーン(AZ)に保存されます。これはデータを分散して保持するためです。

書き込み(作成、更新など)するとき、各アベイラビリティーゾーン(AZ)にはすべて同じ内容が書き込みされます。

ScanIndexForward

SortKeyがあれば、SortKeyのソート順の指定ができます。

・true

SortKeyのascending(昇順)になります。

・false

SortKeyのdescending(降順)になります。

ConsistentRead(結果整合性)

更新前のデータから古いデータが読み取れてしまわないようにする仕組みです。

書き込みするとき、複数あるアベイラビリティーゾーン(AZ)すべてに対して同じ書き込みをします。その際、書き込みのタイミングはほぼ同時だがタイムラグがないわけではありません。(1秒以内レベル)

ConsistentRead = true

強い整合性を採用すると、アベイラビリティーゾーン(AZ)すべてに整合性がとれたときに読み取りを行います。ゆえにコストが高くなります。

ConsistentRead = false

一方で(”強い”よりも)弱い整合性を採用すると、アベイラビリティーゾーン(AZ)が2つで整合性がとれたときに読み取りを行います。2つの整合性がとれている間に3つ目も書き込みが終了するからあまり問題視する必要がないという見込みです。

KeyConditionExpression

パーティションキーだけか、ソートキーも含めるかの2つの選択肢を指定できます。

全件検索するとき、ソートキーは不要で、パーティションキーだけでOKです。1件だけ抽出したいときは一意なものを検索するためにソートキーも含めます。

ExpressionAttributeNames

FilterExpression('#exp = :exp and #status = :status') この#〜〜がデータベースのどのカラムに相当するかを指定します。

ExpressionAttributeValues

FilterExpression('#exp = :exp and #status = :status')で指定した条件の値を指定する際に用います。

FilterExpression

パーティションキーとソートキー以外の検索条件を付加したいときに使います。

FilterExpression('#exp = :exp and #status = :status')のように条件だけを指定しておきます。

ExclusiveStartKey

DynamoDBでは1度に取得できるデータは最大容量が1MBまでという上限があります。

これを超える場合1度にデータを全部取ってくることができないので複数回に分けてクエリを投げないといけません。

そのため、取得してきたタイミングでもまだ全件のうち残りがある場合が想定されますよね。その残りがあるかどうかをExclusiveStartKeyで判断します。

LastEvaluatedKey

全件取得できていない(残りがある)ことを示してくれるキーです。

レスポンスの中にLastEvaluatedKeyが含まれていると、まだデータが残っているとDynamoDBがフラグをたててくれるので、フラグが立っている間はクエリを投げ続けてくれます。

ExclusiveStartKey($LastEvaluatedKey)とすると、残りのうちの1件目から検索してくれて、1回目で2000件取得したとすると2回目は2001件目から取得してくれます。

unmarshal

DynamoDBのキーには['S']や['N']や['BOOL']という型がもとから入っています。

key type
S string 文字列型
N number 数値型
BOOL Boolean 論理型

jsonなどにしたとき、必ずこの型がキーとして入っているので、処理を書く時に正直邪魔になります。このキーを持たない形に変えてくれるのがunmarshalです。

これは1行ごとに変換するので、複数件データがあればforでまわす必要があります。

CRUD

scan

全件検索。

基本的に使わないほうがいい。コストがかかる。

queryItem

複数件検索。

getItem

一件検索。

参考URL

【新機能】Amazon DynamoDBのスキャンに「読み取り一貫性(Consistent Read)」サポートのパラメータが増えました | Developers.IO

AWSのAZ(アベイラビリティーゾーン)とは?AZ障害が起きたときどうすればよいのか | CyberAgent Developers Blog

大きいデータに対するクエリを複数回に分ける方法 - Qiita