ダメ元エンジニアのお勉強おメモ

ほとんど自分用のメモです。AWS をよく触ります。Web アプリとか作ります。Raspberry Pi も好きです。

グローバルテーブルを設定した DynamoDB テーブルに対して、強い整合性のある読み込みをしても失敗する場合に確認すること

原因

例えば、東京/シンガポールリージョンでグローバルテーブルの設定をした DynamoDB のテーブルが存在するとして、 両リージョンで用意している同じコードの Lambda が、下記のように実装されている場合。

import * as DynamoDB from 'aws-sdk/clients/dynamodb';

const DYNAMODB_API_VERSION = '2012-10-08';
const REGION = 'ap-northeast-1' // ★ 東京リージョン固定

export const dynamodbDocumentClient = new DynamoDB.DocumentClient({
  apiVersion: DYNAMODB_API_VERSION,
  region: REGION,
});

シンガポールリージョンにある Lambda から何かしらのデータを PUT した後、 シンガポールリージョンにある DynamoDB テーブルに対して GET しようとした場合、 PUT したデータがシンガポールリージョンにコピーされる前に読み込みが走る場合があり、 強い整合性であろうと関係なく、データが取得できない現象が発生する。

対処法

const REGION = process.env.AWS_REGION!;

特別事情がない限り、同リージョンの Lambda から同リージョンの DynamoDB にアクセスした方が良い。 そもそも、マルチリージョンに対応する場合、片方のリージョンが障害を起こしても問題なく動かす必要性があるため、 意味なくリージョンを跨いだ実装はしない方が良いと思う。