べこの丸太

赤い牛のログです。

【参加レポ】AWSの基礎を学ぼう 温故知新編 基本サービスをみんなで触ってみる DynamoDB #awsbasics

AWSの基礎を学ぼう 温故知新編 基本サービスをみんなで触ってみる DynamoDB

はじめに

こんにちは、べこです。
本記事は、AWSシニアエバンジェリスト亀田さんが主催されている「AWSの基礎を学ぼう」というハンズオンイベントの参加ログです。
今回は待望の新シリーズ「温故知新編」ということで、Amazon DynamoDBを触ってきました。
awsbasics.connpass.com

温故知新編とは?

あるイベントのアンケートの結果、LambdaやDynamoDBなどの基本的なサービスを勉強したいという方が多かったそうです。
そこで、改めてそういうサービスのハンズオンイベントを開こうということで今回「温故知新編」がスタートしました。
次回の時期は未定(1月ごろ?)ですが、Lambda編だそうです。

3行まとめ

  • DynamoDBは分散型Key Value Store(NoSQL)
  • NoSQLと言いつつ、PartiQLというSQL互換のクエリ言語を使うことで、射影、挿入、更新、及び削除が可能
  • DynamoDBも実はトランザクション管理が可能

まずは座学

DynamoDBとは
  • 分散型Key Value Store
    • 単一障害点(SPOF)が存在しない構成のため、可用性が高い。
    • データは3箇所のAZに保存されるため、信頼性が高い。
    • テーブルのパーティショニングは必要に応じて自動的に行われる。
      • パーティショニングの詳細については後述
    • クロスリージョンレプリケーション可能
結果整合性モデル
  • Write
    • 少なくとも2つのAZで書き込み完了の確認が取れた時点でACK(肯定応答)
  • Read(デフォルト、Consistent Read)
    • デフォルト
      • 結果整合性のある読み込み。
      • 最新の書き込み結果が読み取り処理に即時反映されない可能性がある。
    • Consistant Read(強力な整合性のある読み込み)
      • DynamoDBの読み込みオペレーション(GetItem, Query, Scan)にはConsistent Readというオプションがある。
      • Consistent Readオプションを付けると、強力な整合性のある読み込み(Readリクエストを受ける前までの書き込み処理が全て反映された読み込み)を保証。
      • Capacity Unitを2倍消費する。
スループット
  • プロビジョンドスループット
    • テーブルごとに、ReadとWriteのそれぞれに対して必要なスループットキャパシティを割り当てること(= プロビジョニング)が出来る。
    • スループットキャパシティの値はDB運用中にもオンラインで変更可能
      • ただし、スケールダウンに関しては一日に9回しか出来ない。
  • Read Capacity Unit(RCU)
    • 1秒あたりの読み込み項目数 * 項目のサイズ(4KB ブロック)
      • アイテムサイズが4KBを上回る場合、項目のサイズは繰り上げで算出
    • 結果整合性のある読み込み(デフォルト)の場合、スループットが2倍(RCU消費量は1/2)
  • Write Capacity Unit(WCU)
    • 1秒あたりの書き込み項目数 * 項目のサイズ(1KB ブロック)
      • アイテムサイズが4KBを上回る場合、項目のサイズは繰り上げで算出
ストレージ
  • 容量制限がない
  • 使った分だけの従量課金制
  • データ容量の増加に応じたディスクやノードの増設作業は一切不要
パーティショニング
  • DynamoDBはプロビジョンされたスループットを確保するために、テーブルを複数のパーティションに分散して格納している。
  • Partition Keyをパーティション館でのデータ分散に利用
  • 格納ストレージサイズやプロビジョンされたスループットによって自動的にパーティショニングを実施する。
  • スループットパーティションに均等に付与される。
    • プロビジョンされたスループットは各パーティションに均等に付与され、全体で合計値の性能が出るように設計されている。
    • アクセスされるキーに偏りが発生すると、思った性能が出ないということがあるので、Partition Keyの設計には注意が必要(同じ値が何度も入るような設計は避けよう!)
インデックス
  • インデックスが張られていないものを検索対象に出来ない。
  • インデックスはLSI(Local Secondary Index)とGSI(Global Secondary Index)の2種類
  • LSI
    • Sort Key以外に絞り込み検索を行うkeyを持つことが出来る。
    • Partition Keyが同一で、他のアイテムからの検索のために利用する。
    • テーブル作成時にのみ作成可能
  • GSI
    • Partition Keyの代わりとなる。
    • Partition Keyをまたいで検索を行うためのインデックス
    • テーブル作成後に作成
Attributes(属性)
  • 型はスカラー型、セット型、ドキュメント型の3つ
  • Partition Key, Sort Keyの型は、スカラー型のString, Number, Binaryでなければならない。
プライマリーキー
  • 持ち方は2種類
    • Partition Key
    • Partition Key & Sort Key
Auto Scaling
  • 無料で利用可能
  • フルマネージドで、WCU, RCU, GSI(Global Secondary Index)に対する設定を管理
  • 設定は、目標使用率、上限、下限のみ
  • マネコン、CLISDKでの操作が可能
DynamoDB on-demand
  • おすすめの料金オプション
  • 事前のキャパシティプランニングが不要
  • シンプルなAPI操作で設定変更が可能
  • AWSブログはこちら
DynamoDB Streams
  • AWS Lambdaと連携することで、DynamoDBへの書き込みに応じて値チェックをしつつ、別テーブルの更新やプッシュ通知を実行可能
    • テーブルの更新状況の監査ログをS3に保存も可能
  • DynamoDB + AWS Lambda = DynamoDB Triggers
TTL(Time To Live)
  • 無料で利用可能
  • Itemに対し、データベースから自動削除されるタイミングを定義可能
  • プロビジョニングスループットを使用することなく、関連性のないデータのストレージ使用量と保守コストを削減可能
  • 既存・新規のテーブルに設定可能
  • DynamoDB Streamsと併用可能
  • ※注意点あり※
    • 期限切れ後、即削除されるわけではない。
      • 48時間以内に削除
      • 読み取り時に期限切れのものを取得しないようにQueryもしくはアプリ側でのフィルタが必要
DAX(DynamoDB Accelerator)
  • ざっくり言うとキャッシュのようなもの
  • フルマネージドかつ高可用性
  • DynamoDB APISDK)と互換性あり
  • FlexibleでScalable
  • Amazon CloudWatch, Tagging for DynamoDB, AWS Consoleなどとの連携も完備
  • VPC, AWS IAM, AWS CloudTrail, AWS Organizarionなどのセキュリティサービスにも対応
Global Tables
  • マルチリージョン、マルチマスタ
    • 基本的には後勝ちなので、アプリでなんとかする必要あり
バックアップ
  • On-Demand Backup
    • 長期間のアーカイブ及びデータ保持のための規制要件を遵守可能
  • Point-In-Time-Recovery
    • 継続的バックアップ
    • パフォーマンスに影響なし
  • DynamoDBのバックアップは、最近S3にエクスポートできるようになった。
DynamoDB Transactions
  • DynamoDBで複数Item, 複数Tableに対する書き込み操作や読み込み操作でACIDトランザクションが可能
  • トランザクション分離レベルはserializableでロックは取らない。
    • RDSのトランザクションの考え方が少し異なり、ロック中のものに処理をしようとすると例外が発生し、例外を発生させたItem又はTableに関する詳細がThrowされる。

参考:DynamoDBのBlack Belt. https://www.slideshare.net/AmazonWebServicesJapan/20170809-black-belt-dynamodb

次はハンズオン

このAWS公式ハンズオン をやりました。

また、このハンズオンにはいくつか不備があります。
下記はそれら不備への対応まとめです。

①アプリケーションバックグラウンド.
「ステップ3. サポートコードをダウンロードする。」.
にて、sudo pip install boto3sudo pip3 install boto3 にする.

④項目の更新.
update_item.pyの冒頭に下記3行を追記する。

import boto3
dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
table = dynamodb.Table('Books')
上記ハンズオンでデータ更新までやった後、マネコン上から以下の手順もついでに実施
  • PartiQLエディタを使ってのクエリ実行
    • 本当にSQLライクなクエリ(今回はSelect文)が実行出来た。。。
    • ただWhere句でLIKEを使うと構文エラーが出たため、あくまでも簡易的なクエリっぽい
  • S3へのエクスポート
    • マネコン上から簡単に出来る!
    • 出力形式はjson
インデックスについてのお話
  • インデックスにはインデックスのCapacity Unitを使う。なのでインデックスを増やせば増やすほど料金が上がる。
  • ローカルインデックスはテーブルと一緒に(中に)、グローバルインデックスはテーブルとは別に作られてるイメージ
  • PertiQLでインデックスが張られていない項目に対してwhere抽出すると、実は全件検索してから整形してるので、料金がとんでもないことに。。。検索条件にする項目にはインデックスを張ろう!

次回

次回はこちら.

Lake Formation編も是非!!!

LT感想

Speaker: アイレット株式会社 本間さん

BatchWriteItemを使って26件以上のデータを一気に入れようとすると、エラーが発生。。うおおおおお。。。
それを解決するために、DynamoDB操作アプリを作成!
データ登録〜削除まで、アプリ上の各ボタンで操作出来てました。
イベント当日に作成されたそうww.

おわりに

最新サービスを触るのもいいですが、昔からあるサービスを触るのもいいですね。
今回は座学の時間もあり、SAAやDVAなどの良い復習になりました。
次回の温故知新編も参加します。