Amazon Web Services ブログ

AWS DMS を利用した Amazon Timestream for LiveAnalytics への時系列データの移行

Amazon Timestream for LiveAnalytics が AWS Database Migration Service (AWS DMS) のターゲットエンドポイントとして新たにサポートされました。この機能追加により、時系列データを AWS DMS でサポートされているソースデータベースから Timestream に移行できるようになります。

多くの業界のお客様が Timestream を採用して、リアルタイムの洞察を導き出し、重要なビジネスアプリケーションを監視し、Web サイトやアプリケーション全体にわたる何百万ものリアルタイムイベントを分析しています。AWS DMS の移行機能を使用する事で、ダウンタイムを削減しながら、既存の時系列データを移行し、進行中の時系列データを Timestream にレプリケートできるようになりました。尚、Timestream は AWS DMS Parallel Load および Parallel Apply 機能もサポートしているため、大量のデータを並行して処理可能であり、大幅に高速なデータ移行が可能になります。

本投稿では、AWS DMS でサンプル PostgreSQL ソースエンドポイントのターゲットとして Timestream を使用する方法を説明します。

ソリューションの概要

DMS で移行を設定するとき、ソースデータベースはデータが現在存在する場所であり、ターゲットデータベースはデータの転送先です。本投稿では、PostgreSQL ソースデータベースから Timestream ターゲットデータベースにデータを移行します。レプリケーションインスタンスは移行タスクを実行するコンポーネントであり、VPC 内のソースとターゲットの両方にアクセスする必要があります。本投稿では、まず Timestream データベースを設定し、データを移行するために AWS DMS に必要な AWS Identity and Access Management (IAM) アクセス許可を割り当てる方法を説明します。セットアップが完了したら、タスクを実行して、データが Timestream データベースに移行されたことを確認できます。

尚、AWS DMS Timestream エンドポイントは RDBMS ソースのみをサポートすることに注意してください。

前提条件

AWS DMS がどのように機能するかについて基本を理解している必要があります。AWS DMS を使い始めたばかりの場合は、AWS DMS のドキュメントを確認してください。移行を実行するには、サポートされている AWS DMS ソースエンドポイントと Timestream ターゲットも必要です。

Timestream の IAM リソースの設定

Timestream データベースを AWS DMS ターゲットとして設定し、データ移行を開始するのは簡単です。まず、必要な権限を持つ IAM ロールを作成します。

  1. IAM コンソールのナビゲーションペインで ポリシーを選択します。
  2. ポリシーの作成を選択します。
  3. 次のコードを使用して IAM ポリシーを作成します。 AWS リージョン、アカウント ID、データベース名を適宜更新します。本投稿では、ポリシーに dms-timestream-access という名前を付けます。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowDescribeEndpoints",
            "Effect": "Allow",
            "Action": [
                "timestream:DescribeEndpoints"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "timestream:ListTables",
                "timestream:DescribeDatabase"
            ],
            "Resource": "arn:aws:timestream:{region}:{account_id}:database/{database_name}"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "timestream:WriteRecords",
                "timestream:UpdateTable",
                "timestream:CreateTable"
            ],
            "Resource": "arn:aws:timestream:{region}:{account_id}:database/{database_name}/*"
        }
    ]
}
JSON

このポリシーには、Timestream に対する 3 つの主要な権限が含まれています。

  • エンドポイントの参照権限 – Timestream エンドポイントを参照する機能を付与します。これは、他の Timestream アクセス許可と組み合わせて使用される DescribeDatabase 関数を使用する場合に重要です。
  • データベースの説明とテーブルリストへのアクセス – 特定のデータベースの説明を使用して、その存在と AWS DMS へアクセス可能かを確認できます。また、そのデータベース内のテーブルをリストすることもできます。これは、既存のテーブルを識別し、必要に応じて新しいテーブルを作成するために重要です。
  • データ挿入およびテーブル管理機能 – AWS DMS が Timestream にデータ挿入、テーブルの更新、またメモリまたはマグネティックストアの期間に変更が必要な場合に不可欠です。

これで、使用するロールに IAM ポリシーをアタッチできるようになりました。

  1. IAM コンソールのナビゲーションペインでロールを選択します。
  2. ロールの作成を選択します。
  3. 信頼されたエンティティタイプで、AWS サービスを選択します。
  4. サービスまたはユースケースで、DMS を選択します。
  5. 次へを選択します。

  1. ロールに名前を付けます (本投稿では、dms-timestream-role という名前を付けます)。
  2. 作成したポリシーをアタッチします。
  3. ロールを作成します。

Timestream データベースを作成する

Timestream データベースを作成するには、次の手順を実行します。

  1. Timestream コンソールのナビゲーションペインでデータベースを選択します。
  2. データベースを作成を選択します。
  3. 設定を選択で、標準データベースを選択します。
  4. 名前にデータベースの名前を入力します。
  5. KMS キーは、キー ID を選択します。
  6. データベースを作成を選択します。

ターゲットの Timestream エンドポイントを作成する

AWS DMS を使用して Timestream エンドポイントを設定するには、次の手順を実行します。

  1. AWS DMS コンソールのナビゲーションペインでエンドポイントを選択します。
  2. エンドポイントの作成を選択します。
  3. エンドポイントタイプで、ターゲットエンドポイントを選択します。
  4. エンドポイント識別子に、エンドポイントの名前を入力します (本投稿では、timestream-target を使用します)。
  5. ターゲットエンジンに、Amazon Timestream を選択します。

  1. サービスアクセスロールの Amazon リソースネーム (ARN) に、前に作成したロール (dms-timestream-role) のロール ARN を入力します。
  2. メモリストアの保持については、ユースケースに応じて設定します。メモリストアの保持は時間単位で計算され、サポートされる範囲は 1 ~ 8,736 時間です。メモリストアは高速取り込み用に最適化されています。ベストプラクティスとして、移行するデータの大部分に対応できるようにメモリストアの保存期間を設定します。
  3. マグネティックストアの保持についても、ユースケースに応じて期間を設定します。 マグネティックストアの保持は日単位で測定され、サポートされる範囲は 1 ~ 73,000 日です。マグネティックストアはデフォルトでは読み取り専用ですが、エンドポイント設定を調整し、EnableMagneticStoreWrites を true に設定することで書き込み機能を有効にできます。この変更を行うと、メモリストアの保存期間外のデータは、長期間保存するためにマグネティックストアに自動的に転送されます。マグネティックストアは履歴データを更新するように設計されており、大量の取り込みはサポートしていません。履歴データをマグネティックストアにロードすることが目的の場合は、AWS DMS を使用して CSV 形式で Amazon Simple Storage Service (Amazon S3) に移行してから、Timestream でバッチロードを使用することをお勧めします。マグネティックストアの保存期間より古い記録は自動的に削除されるため、保存期間の設定を慎重に検討する必要があります。

  1. オプションとして、エンドポイントに CdcInsertsAndUpdatesEnableMagneticStoreWrites を設定できます。 CdcInsertsAndUpdates はブール型フィールドで、デフォルトでは false です。 true の場合、変更データキャプチャ (CDC) 中にソースデータベースへの削除操作の場合、Timestream への反映が行われません。 false の場合、ソースデータベースからデータ削除が行われるタイミングで Timestream へのデータ更新が行われます。これが望ましい動作である可能性がある理由は、本 Blog 執筆時点では、Timestream がレコード削除をサポートしていないためです。代わりに、AWS DMS は、数値タイプの場合は 0 の値、VARCHAR の場合は NULL 文字列、ブール値の場合は False を追加してレコードを null にします。これは、レコードにデータが含まれていないことを示すためです。削除する前の元のレコードを残しておきたい場合は、CdcInsertsAndUpdates を true に設定します。EnableMagneticStoreWrites もブール型フィールドです。デフォルトでは false です。 true の場合、メモリストアの保持期間外ではあるが、マグネティックストアの保持期間内であれば、レコードをマグネティックストアに直接書き込むことができます。但し、入力が大きいとスロットリングが発生するため、ほとんどのユースケースでは推奨されません。EnableMagneticStoreWritestrue とするのは、一部のレコードがメモリストアの保存期間外にあり、それらのレコードをスキップしたくない場合を対象としています。

  1. エンドポイントの作成を選択して、ターゲットエンドポイントを作成します。

移行タスクを作成する

Timestream ターゲットエンドポイントを使用して移行タスクを作成するには、次の手順を実行します。

  1. AWS DMS コンソールのナビゲーションペインでデータベース移行タスクを選択します。[
  2. データベース移行タスクの作成を選択します。
  3. Timestream ターゲットで使用するレプリケーションインスタンスとソースデータベースエンドポイントを指定します。
  4. ターゲットとして作成した Timestream エンドポイントを選択します。
  5. 完了したい移行のタイプに応じて、移行タスクを選択します。
  6. タスク設定セクションで、JSON エディタを選択し、それに応じて設定を調整します。

コードには次の主要なパラメータが含まれています。

  • ParallelLoadThreads – AWS DMS が各テーブルを Timestream ターゲットに最初にロードするために使用するスレッドの数を決定します。最大は 32 スレッドです。
  • ParallelLoadBufferSize – Timestream ターゲットの並列ロードスレッドによって使用されるバッファの最大レコード数を、デフォルトの 50 から最大 1,000 までの範囲で設定します。
  • ParallelLoadQueuesPerThread – ターゲットへのバッチロードのデータレコードを処理するために各スレッドがアクセスするキューの数を定義します。Timestream ターゲットのデフォルト設定は 1 で、範囲は 5 ~ 512 です。
  • ParallelApplyThreads – CDC ロード中に AWS DMS がデータを Timestream ターゲットにプッシュするために使用する同時スレッドの数を 0 ~ 32 の範囲の値で指定します。
  • ParallelApplyBufferSize – 各バッファーキューが保持できるレコードの最大数を示します。CDC ロード中に同時スレッドによってデータをタイムストリームターゲットにプッシュするために使用されます。デフォルトは 100、最大値は 1,000 です。
  • ParallelApplyQueuesPerThread – CDC 中に Timestream エンドポイントにバッチロードするデータレコードを抽出するためのスレッドあたりのキューの数を 1 ~ 512 の範囲で指定します。

これらのパラメータを設定する事で、レコード書き込みをバッチ処理で実施し、より高速な移行を有効にすることができます。

  • ParallelLoadQueuesPerThread および ParallelApplyQueuesPerThread のサイズは 100 に設定することをお勧めします。これは、Timestream への 1 回の書き込みあたりの最大レコード数であり、この方法で最高のスループットが得られるためです。
  • スループットに応じてスレッド数を調整する必要があります。
  • 負荷に応じてスレッド毎のキューの数を調整する必要がありますが、インスタンスメモリをあまり消費しないように、50 程度の比較的低い値に設定すべきです。

Timestream ターゲットを使用して AWS DMS 移行タスクを設定する場合の最も重要な部分は、ソーステーブルが Timestream テーブルにどのようにマップされるかです。Timestream をターゲットとして使用する場合、Timestream には独自のマッピングルールがあります。いくつかのサンプルデータを使用して、これがどのように機能するかを見てみましょう。

テーブルが 2 つあるとして、1 つのテーブルは sensor_data、もう 1 つのテーブルは sensors とします。次のスクリーンショットは、sensor_data のデータの例を示しています。

このテーブルの作成に使用される SQL コマンドは次のとおりです。

CREATE TABLE sensor_data (
    serial SERIAL PRIMARY KEY,
    sensor_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    temperature NUMERIC,
    humidity NUMERIC,
    light NUMERIC,
    co2 NUMERIC,
    humidityratio BOOLEAN
);
SQL

次のコマンドを使用して、テーブルにサンプルデータを入力します。

INSERT INTO sensor_data (sensor_time, temperature, humidity, light, co2, humidityratio)
SELECT
  NOW() - (random() * (20 * INTERVAL '1 day')),
  (random() * (30 - 15) + 15)::NUMERIC(5,2),
  (random() * (90 - 10) + 10)::NUMERIC(5,2),
  (random() * (1000 - 10) + 10)::NUMERIC,
  (random() * (2000 - 300) + 300)::NUMERIC,
  (random() < 0.5)::BOOLEAN
FROM generate_series(1, 10000);
SQL

sensors テーブルの場合、データは重要ではありません。重要なのは、テーブルマッピングが Timestream の移行にどのような影響を与えるかを示すことです。

  1. この例では、以下のようにテーブルマッピングを構成します。
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "{your_schema}",
                "table-name": "sensor_data"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "object-mapping",
            "rule-id": "2",
            "rule-name": "timestream-map",
            "rule-action": "map-record-to-record",
            "object-locator": {
                "schema-name": "{your_schema}",
                "table-name": "sensor_data"
            },
            "target-table-name": "sensor_data_timestream",
            "mapping-parameters": {
                "timestream-dimensions": [
                    "serial"
                ],
                "timestream-timestamp-name":"sensor_time"
            }
        }
    ]
}
JSON

上のコードでは、sensor_data テーブルのみをマッピングしています。サンプルデータではディメンジョン (timestream-dimension)として serial を指定し、タイムスタンプ名 (timestream-timestamp-name) として sensor_time を設定します。 ディメンジョンとタイムスタンプ名は、Timestream のマッピングルールに必須です。

また、Timestream のマッピングルールを持つテーブルのみが移行されます。

使用可能なマッピングには次の 2 種類があります。

  • シングルメジャーマッピング – この場合、タイムスタンプまたはディメンション (sensor_time および serial ) ではないすべての列が独自のレコードにマッピングされます。たとえば、sensor_data テーブルについて考えてみましょう。ソースデータベース内の 1 レコード毎に、Timestream には 5 つのレコードが存在します。それぞれは同じ sensor_timeserial を持ちますが、温度のレコードが 1 つ、湿度のレコードが 1 つ、光のレコードが 1 つというような形で設定されます。
  • マルチメジャーマッピング – マルチメジャーマッピングを使用するには、"timestream-timestamp-name":"sensor_time" と同じセクションに設定を追加します。ここで、マルチメジャーレコードのメジャー名として使用するソースの列を指定します。一例として、serial: "timestream-multi-measure-name": "serial" のように記述して再利用してみましょう。これは、serial の値が Timestream のディメンションだけでなくメジャー名としても使用されることを意味します。Timestream の結果は次のようになります。ソースデータベース内のレコード毎に、ディメンション: serial、タイムスタンプ: sensor_time、および serial の値のメジャー名を持つ 1 つのレコードが Timestream に存在します (最初の行の例では、このレコードは 1 になります)。このレコードには、ソースデータベースの各列のメジャー値が含まれます。マルチメジャーマッピングを使用する場合は、Timestream の 8,192 個の一意のメジャー名の制限に抵触しないように、通常は "timestream-hash-measure-name": True を使用する必要があります。詳細については、「マルチメジャーレコードのパーティション化に関する推奨事項」を参照してください。

本投稿では、単一メジャーマッピングを使用します。したがって、sensor_data をマッピングするように設定すると、最初の選択ルールに sensors を追加した場合でも、sensors は無視されます。

  1. タスクの作成を選択して、Timestream ターゲットエンドポイントを使用して移行タスクを作成します。

移行タスクの実行

タスクを開始するには、次の手順を完了してください。

  1. AWS DMS コンソールのナビゲーションペインでデータベース移行タスクを選択します。
  2. 作成したタスクを選択します。
  3. アクションメニューで、開始を選択します。

Timestream データベースを監視して、移行アクティビティを表示できます。

移行の検証

データが Timestream にあることを確認するには、次の手順を実行します。

  1. Timestream コンソールのナビゲーション ペインの管理ツールで、クエリエディターを選択します。
  2. choose a database to query で、移行先のデータベースを選択します。

  1. 移行されたレコードの数を確認するには、次のクエリを入力します。
select count(*) from {your_db_name}."{your_table_name}"
SQL
  1. サンプルデータを表示するには、次のクエリを入力します。
select * from {your_db_name}."{your_table_name}” 
SQL

少なくとも 10 行が移行されていると仮定すると、次のスクリーンショットに示すように、結果には選択したテーブル内の 10 行のレコードが表示されるはずです。

エラーハンドリング

Timestream への移行時に直面する可能性のある一般的な問題を次に示します。

  • テーブルマッピングを作成するときは、timestream-dimensiontimestream-timestamp-name を必ず含めてください。また、timestream-timestamp-name がソースデータベーステーブル内の実際の列であり、タイプが timestamp であり、大文字と小文字が正しいことを確認してください。次のコードを参照してください。
"mapping-parameters": {
    		"timestream-dimensions": [
        			"serial"
    		],
    		"timestream-timestamp-name":"sensor_time"
 }
JSON
  • アクセスポリシーの IAM ロールに信頼関係として AWS DMS があることを確認します。これを確認するには、IAM コンソールで自分のロールに移動し、信頼関係を確認します。
  • ParallelLoad またはParallelApply を使用すると、インスタンスはより多くのメモリを使用します。メモリ不足が原因でタスクが失敗した場合は、インスタンスをスケーリングする必要があります。インスタンスのサイジングに関する推奨事項については、「移行に適した AWS DMS レプリケーションインスタンスの選択」を参照してください。

クリーンアップ

移行が完了したので、AWS DMS、Timestream、および IAM リソースをクリーンアップします。

  1. AWS DMS コンソールのナビゲーションペインでデータベース移行タスクを選択します。
  2. 作成したレプリケーションタスクを選択し、アクションメニューで削除を選択します。
  3. AWS DMS コンソールのナビゲーションペインでエンドポイントを選択します。
  4. 作成したエンドポイントを選択し、アクションメニューで削除を選択します。
  5. AWS DMS コンソールのナビゲーションペインでレプリケーションインスタンスを選択します。
  6. 作成したレプリケーションインスタンスを選択し、アクションメニューで削除を選択します。
  7. Timestream コンソールのナビゲーションペインで データベースを選択します。
  8. 削除するデータベースを選択し、削除を選択します。
  9. IAM コンソールのナビゲーションペインでロールを選択します。
  10. 作成したロールを選択し、削除を選択します。
  11. IAM コンソールのナビゲーションペインでポリシーを選択します。
  12. 作成したポリシーを選択し、削除を選択します。

これらの手順を完了したら、この投稿用に作成したすべてのリソースがクリーンアップされるでしょう。

結論

本投稿では、Timestream データベースを作成し、移行に必要なアクセス許可を AWS DMS に付与し、AWS DMS レプリケーションインスタンス、エンドポイント、タスクを作成することで、AWS DMS 移行をセットアップする方法を説明しました。次に、そのタスクを実行し、データが Timestream データベースに正常に移行されることを確認しました。これで、このタスクを独自のワークロードで実行できるようになりました。最後のステップ (移行タスクの作成と実行) は、AWS DMS タスク間で共通になりました。これにより、希望するリレーショナルデータベースから完全なエンドツーエンドの移行を実行し、データを Timestream データベースに表示できるようになります。

翻訳はテクニカルアカウントマネージャーの西原が担当しました。原文はこちらをご覧下さい。