🍣

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

2021/10/30に公開

AWSの基礎を学ぼう 温故知新編 基本サービスをみんなで触ってみる DynamoDB
2021-10-30(土) 13:15-15:00 に オンライン(zoom)で開催されました。

個人で作ってみようかなと思ったサービスで、DynamoDBを使ってみようかと思っていたこともあり、
参加してみました。
そのときの記録です。

ちなみに勉強会のtwitterハッシュタグは #awsbasicsです。
雰囲気がなんとなくわかるかも。

勉強会の概要説明

冒頭5分か10分ほど概要説明がありました

  • 勉強会の趣旨説明
    • 温故知新シリーズは参加者50%超えていたら続くそうです
    • 今回はギリギリ50%超えていたので次回lambdaで開催予定だそう
  • DynamoDBは2012年からあるサービスだが、最近も機能が追加されている
    • SQLが使えるようになった
    • Transaction機能が追加された
  • 今回の参加者について(冒頭にgoogle formでかんたんなアンケートがあってその結果)
    • AWSを普段使っている人が5割ほど
    • DynamoDB普段使っている人は2割ほど
    • サーバレスとの連携をしたくてこの勉強会に参加したという人が多かった
      • ワイもこれ

座学

  • DynamoDB
    • Key Value Store(広い意味ではAmazon S3もKey Value Store)
    • 分散型なのでSPOF(単一障害点)の存在しない構成
    • データはパーティションに割り当てられる。(パーティショニング)
    • パーティショニングは自動で行われる
    • 読み書きが反映されるタイミング
      • Write
        • 少なくとも2つのAZでの書き込み完了の確認がとれた時点でAck
      • Read
        • デフォルト
          • 結果整合性のある読み込み
          • 最新の書き込み結果が即時読み取り処理に反映されないことがある
        • コストはかかるが、書き込みが反映された状態で読み込むこともできる
    • プロビジョニングモード
      • 想定されるリクエストに対して読み込み、書き込みの制限を設定する
        • WCU(Write Capacity Unit), RCU(Read Capacity Unit)
      • 今はプロビジョニングをあえてやる機会は少ないかも
      • Auto Scaling
        • プロビジョニングモードで使える
        • フルマネージドでWCU, RCU, GSI(グローバルセカンダリインデックス)を設定
    • DynamoDB on-demand
      • 事前のキャパシティプランニングは不要になる機能
      • 今はこれを使ったほうが安いので、これがオススメ
  • テーブル設計
    • tableの行がitems
    • itemの各要素がattributes
    • Keyが2つ
      • Partation Key
        • ユニークなattribute
        • 年月日のように値が偏ると、パティショニングも偏ってパフォーマンスがでにくい(お金がかかる)
        • 値はハッシュ値にして分散されるようにする
      • Sort Key
    • プライマリーキーの持ち方は2種類
      • Partition Key
      • Partition Key & Sort Key
  • Triger: DynamoDBに書き込みがあったらlambdaを起動
  • ユースケース
    • セッション情報やRDSでは残したくない・残さなくて良い情報を扱う場合にDynamoDB
  • DynamoDB DAX
    • DynamoDBの前におくキャッシュ
  • Cross-region Replicationもサポートするようになった
  • Multi Master,Multi region構成にできる
    • 重複したオペレーションは後勝ちになってしまうため、アプリケーションで制御が必要
      • DynamoDBにかぎらずAuroraも 重複したオペレーションは後勝ち
  • S3へのエクスポートができるようになった
  • DynamoDB Transaction
    • ACIDトランザクション可能に
    • トランザクションは癖があるので注意(説明されたが理解は追いつかなかった・・)
  • 内部で使っているAmazon ion
    • JSONを独自拡張したもの
  • テーブル作成時にLSI、テーブル作成後にGSIを作れる
    • Partition Key , Sort Key以外はこれらのインデックスがついていなければ検索できない

ハンズオン

https://aws.amazon.com/jp/getting-started/hands-on/create-manage-nonrelational-database-dynamodb/2/ にそって実施した。
そのあと、SQL実行を亀田さんの進行に沿って実施。

https://aws.amazon.com/jp/getting-started/hands-on/create-manage-nonrelational-database-dynamodb/2/やったときの注意点

boto3インストールするとき

ドキュメントには

sudo pip install boto3

pip とあるが、python2でインストールされてしまうのでpip3で実行する

DynamoDBがNoSQLであるということがわかりやすい箇所

用意されたサンプルコードを使って、テーブルの作成やデータの追加・更新をしていった。
このときtable作成時にattributeは2つしか定義していないのに、insertするときは、定義していた項目よりも多くの項目が入っていることに注目すると、NoSQLだということが実感しやすい。

テーブル定義(create_item.pyより)

        AttributeDefinitions=[
            {
                "AttributeName": "Author",
                "AttributeType": "S"
            },
            {
                "AttributeName": "Title",
                "AttributeType": "S"
            }
        ],

item追加(insert_items.pyより)

    batch.put_item(Item={"Author": "John Grisham", "Title": "The Rainmaker",
        "Category": "Suspense", "Formats": { "Hardcover": "J4SUKVGU", "Paperback": "D7YF4FCX" } })

AuthorとTitleしか定義していないのに追加するときはそれら以外のattributeもある。
(もちろんエラーにならず、ちゃんとテーブルに追加される)

indexについて

indexを設定すると、indexに対してプロビジョンドスループットの設定がいる。つまりその分お金がかかる。

indexをはりまくると、無駄にお金がかかるのでやめましょう。

indexがはれるまえの挙動

indexを指定して検索するときは、インデックス名を指定する

query_with_index.pyより

resp = table.query(
    # Add the name of the index you want to use in your query.
    IndexName="CategoryIndex",
    KeyConditionExpression=Key('Category').eq('Suspense'),
)

indexがはれているかどうかは、レスポンスではんていできるよう。

おなじくquery_with_index.pyより

# When adding a global secondary index to an existing table, you cannot query the index until it has been backfilled.
# This portion of the script waits until the index is in the “ACTIVE” status, indicating it is ready to be queried.
while True:
    if not table.global_secondary_indexes or table.global_secondary_indexes[0]['IndexStatus'] != 'ACTIVE':
        print('Waiting for index to backfill...')
        time.sleep(5)
        table.reload()
    else:
        break

itemの更新

なぜかサンプルコードをのupdate_item.pyに以下の文が冒頭にない。追記して実行した。
そのままだと実行できないので注意。

import boto3

dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
table = dynamodb.Table('Books')

SQLでDynamoDBからデータを取得する

  • AWS コンソール -> DynamoDB -> PartiQL エディタから SQLを実行できる
  • SQLでは、indexがない項目に対しても、検索条件にできる。
    • ただし、実行するたびにフルスキャンが実行される。
      • 逆に言うと、フルスキャンするからindexがなくても検索条件にできるということですね。
    • indexをはっていないattributeをキーに検索するのはパフォーマンス悪いし、お金もかかる。
    • 検索キーにしたいattributeには、indexをはること!!

SQLの注意点

個人的に以下の点がややこしかった。

  • 検索条件の値は、ダブルクォーテーションだとエラーにはならないが、該当するデータが0件だった。
  • テーブル名と、attribute名はダブルクォーテーションで囲っていても、エラーにはならず、実行できた。

該当あり

SELECT * FROM Books WHERE Author = 'William Shakespeare';

該当なし

SELECT * FROM Books WHERE Author = "William Shakespeare";

LT

余談とかメモ

  • default vpcは使うことあるので消さないほうがいいかも
  • dynamodbに対する操作は、CLI, SDKだけ?dynamodb native
  • インデックスの反映は数分以上かかる
  • cloud 9を使ってすすめるが、cloud 9を立てたリージョンがus-east-1ではないとスクリプト内で指定するリージョンとcloud 9が違うためにエラーになるので注意
  • dynamodbのコンソールが最近新しくなったらしいです
  • boto3 ぶーとぅーすりー と読む人もいる。ぼとすりーがマジョリティっぽいが。
  • DynamoDBのAuto Scalingはどんなときに使うのか疑問に思ったが、[この記事](https://aws.amazon.com/jp/blogs/news/running-spiky-workloads-and-optimizing-costs-by-more-than-90-using-amazon-dynamodb-on-demand-capacity-mode/)に書いてあった
    • 安定してトラフィックがくるならばプロビジョンモードでAuto Scaling
    • 急激なアクセス増減があるならオンデマンドモード
      • 今日学んだこととまとめると、通常はオンデマンドモードで、一定のリクエストがあるならばプロビジョンモード AutoScalingで、

所感

  • 今回のハンズオンでやったget startedは、たまたま先日やったばかりだったのですが、実施内容は同じでも吸収できる量が違いました。参加してよかったです。
  • 今回でDynamoDBについて少しわかったつもりですが、また機能追加されると思うので、利用検討時はあらためてアップデート内容を確認しておこうと思いました。

Discussion