もくじ
DynamoDBを使うにあたって、知っておくべきことを連ねる。
リージョンとアベイラビリティーゾーン(AZ)
AWSにはリージョンが複数あり、そのリージョンの中に複数のアベイラビリティーゾーン(AZ)を持ちます。
(イメージ)
リージョンは東京や香港、米国など世界中に存在します。ちなみに東京リージョンのコードは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