Amazon Web Services ブログ

AWS DMS を使用して、リレーショナルデータベースのデータを Amazon Glacier にアーカイブする方法

AWS Database Migration Service (AWS DMS) を使用して、複数のソースから、最も普及している商用およびオープンソースのデータベースにデータを移行できます。AWS DMS はまた、移行用にAmazon S3ソースおよびターゲットとしてサポートしています。ターゲットとして Amazon S3 を使用するときは、AWS DMS でサポートされている任意のデータベースから情報を抽出するために、AWS DMS を使用できます。その後、ほぼすべてのアプリケーションで使用可能な CSV 形式で、Amazon S3 に書き込むことができます。

次の 2 つのシナリオでは、この機能を使用できます。

  1. Oracle などの商用エンジンから Amazon RDS for PostgreSQL への移行の一部として、Amazon S3 または Amazon Glacier などの AWS ストレージサービスに、アクセスが頻繁ではないデータ、または監査の履歴、アーカイブデータなどを保存できます。こうすることで、長期的なデータ保存のガバナンスやコンプライアンスに準拠しやすくなります。
  2. リレーショナルデータベースのデータサイズが増大するにつれて、データベース管理者 (DBA) と開発者が最適なパフォーマンスを維持するためにインデックスとパーティションのモニタリングと再編成に割く時間も長くなっていきます。この付加的なメンテナンスは、冗長性やバックアップが原因で、データの保存にまつわる運用費の増大を引き起こします。そのため、費用の節約や操作性の向上のために、アクセスが頻繁ではないデータは Amazon S3 または Amazon Glacier にアーカイブするのがベストプラクティスと言えます。

このブログ記事では、アクセスが頻繁ではないデータ、たとえば、数か月まはた数年前の販売情報 (コールドデータと呼ばれる) が、長期間セキュアなボールトにアーカイブされる 2 つ目のユースケースについてお話しします。財務部や情報セキュリティ部は必要なときにこのデータにアクセスできる必要があるものの、そうしたリクエストは極めてまれです。

米国東部 1 リージョンで、1 か月の GB あたりのストレージ費用を Amazon RDS PostgreSQL Multi-AZ GP2 と、Amazon Glacier とで比べてみると、Amazon Glacier のストレージ費用の方が、Amazon RDS に比べておよそ 57 倍も安価であることが分かります。たとえば、Amazon Glacier での 1 か月あたりの 100 GB のコストは 1 ドル未満 ($0.40) であるのに対し、Amazon RDS マルチ AZ ストレージでの 1 か月あたりの費用は 23.00 ドルです (本記事の執筆時現在)。

このブログ記事では、Amazon S3 の Amazon RDS PostgreSQL のデータを CSV ファイルとして保存し、その後、その CSV ファイルを Amazon Glacier にアーカイブするための AWS DMS の使用方法をご紹介します。Amazon Glacier は数分から数時間まで、データを取得するための取り出しオプションをいくつか提供しています。その後、Amazon Glacier Select 機能を使用して、アーカイブからデータのサブセットをクエリします。Amazon Glacier Select を使用すると、Amazon S3 のようなより使用頻度の高いストレージティアにデータをステージングすることなく、データに対し分析を実行できます。このおかげで、Amazon Glacier 上のコールドデータから、インサイトを集めることが、より安価、迅速、簡単になります。

高水準のステップ

このブログ記事の全インフラストラクチャを管理しやすくするために、AWS CloudFormation テンプレートを作成しました。これは必要なリソースのすべてと、本記事で使用されている AWS Lambda のコードをプロビジョニングします。コードは、この GitHub リポジトリでご覧になれます。このブログ記事で紹介したソリューションには、次のタスクが含まれます。

  1. 英国の土地登記情報を含むパブリックデータセットを https://data.gov.uk からダウンロードします。
  2. アーカイブを格納するための Amazon Glacier ボールトを作成します。
  3. 必要なリソースを作成する AWS CloudFormation テンプレートを起動します。これらには、Virtual Private Cloud (VPC)、Amazon RDS PostgreSQL インスタンス、AWS DMS レプリケーションインスタンス、S3 バケット、IAM ポリシーのほか、この例に必要な他のリソースが含まれています。
  4. Amazon S3 にフォルダを作成します。
  5. RDS インスタンスに接続し、PostgreSQL クライアントを使用してデータセットをロードします。
  6. AWS Lambda 関数を作成し、その Lambda 関数をトリガする S3 イベント通知 をセットアップします。この関数は S3 からファイルをダウンロードし、AWS DMS によって CSV ファイルが作成されるとすぐに、そのファイルを Amazon Glacier へとアップロードします。
  7. AWS DMS のソースおよびターゲットエンドポイントをそれぞれ構成します。
  8. RDS インスタンスから Amazon S3 へデータを抽出するための AWS DMS タスクをセットアップします。
  9. Amazon Glacier Select を使用して、アーカイブからデータのサブセットを取り出す Lambda 関数を作成します。
  10. S3 バケットでアーカイブの結果を表示します。
  11. AWS リソースをクリーンアップします。

注意: このアーキテクチャを説明するために、この例ではサーバーレスコンピューティングを使用しています。私は AWS DMS によって作成された CSV ファイルをダウンロードし、Amazon Glacier にアップロードするために AWS Lambda 関数を使用します。Lambda にはローカルディスク容量 512 MB という制限があるため、このソリューションではアーカイブがこの制限を越えないという想定で話しを進めます。アーカイブのサイズが 512 MB を越える場合は、同等の機能を実装するために、Lambda の代わりに Amazon EC2 を使用してください。

前提条件および仮定

このソリューションを完成させるためには、以下のものが必要です。

  1. 上記の図に示したサービスへのアクセスを提供する AWS アカウント。このステップは、米国西部 2 (オレゴン) リージョンで実行されています。作業を開始する前に、この投稿記事で使用された各サービスが、皆さんの AWS リージョンで使用可能であるかを確認してください。
  2. psql または pgAdmin などのような、PostgreSQL データベースに接続するためのツール。
  3. Amazon RDS、AWS DMS、Amazon VPC、Amazon S3、および AWS Lambda などの作業関連の知識。

詳しい手順

以下のセクションではこのソリューションを作成し、構成するのに必要なステップについて細かく説明していきます。

1.サンプルデータセットのダウンロード

  1. こちらより、英国土地登記ファイルをダウンロードします。このファイルには、土地の登記情報が 10 年分含まれています。注意: このファイルには、HM Land Registry data © Crown の著作権とデータベースの著作権 2018 が適用されます。このデータは Open Government Licence v3.0 の下で、ライセンス許諾されたものです。この投稿記事にて使用されるデータには、個人および非商用使用など、使用に制限の設けられた住所データが含まれます。このデータセットの許可された使用に関する詳細情報については、Gov.uk サイトのPrice Paid Data を参照してください。
  2. このファイルは任意の Amazon EC2 インスタンス (優先) または PostgreSQL クライアントのインストールされているローカルコンピュータに保存できます。

    本投稿の執筆時点では、このデータセットには 1995 年から 2017 年までの英国の土地登記情報が含まれており、その件数はおよそ 2200 万件です。ここでは、古いデータを年次ベースで抽出し (つまり、年ごとのパーティション)、 Amazon Glacier へアーカイブします。Amazon Glacier にそれを正常に保存できたら、Amazon RDS からこのレコードを削除して構いません。

2.Amazon Glacier ボールトの作成

  1. AWS マネジメントコンソールにログインし、[Amazon Glacier コンソール] を開きます。米国西部 2 リージョンで、rdsarchive という名前のボールトを作成します。[通知を有効にしない] を選択し、[送信] を選択します。
  2. そのボールトの名前と ARN (Amazon リソースネーム) をメモしておきます。

3.AWS CloudFormation テンプレートの起動

  1. この GitHub リポジトリから AWS CloudFormation JSON ファイルをコピーするか、ダウンロードします。
  2. AWS CloudFormation コンソールに移動し、[スタックの作成] を選択します。
  3. ステップ 1 の JSON ファイルをアップロードして、テンプレートを起動します。
  4. 次に示すように必須のパラメータ値を指定します。
    1. たとえば、dms_archive のようにスタック名を入力します。ユニークな S3 バケット名と Amazon Glacier ボールト名を指定します (ステップ 2 のものと同一名にする)。
    2. ExistsDMSRole では dms-vpc-role が既に AWS アカウントで作成されている場合には、Y を指定します。そうでない場合は N を指定して、この CloudFormation スタックから作成されるようにします。このロールのセットアップについて詳しくは、AWS CLI と AWS DMS API で使用する IAM ロールの作成を参照してください。
  5. パラメータ値の残りはオプションでデフォルト設定のままにしておいて構いません。
  6. [Next] (次へ)、[Create] (作成) の順に選択します。

AWS CloudFormation スタックの作成には約 10 ~ 15 分かかり、以下のリソースも作成されます。S3 バケット名などの一部のリソースは Amazon S3 に既存の全バケット名内で固有である必要があります。(このブログ記事では、バケット名として rdstoglacier を使用しています。) RDS インスタンスへのアクセスを固有の IP 範囲に制限するようお勧めします (デフォルトでは 0.0.0.0/0 へのアクセスが許可されています)。

  1. 指定された名前の Amazon S3 バケット。
  2. rds-to-s3 という名前の AWS DMS レプリケーションインスタンス。
  3. rdsarchive-lambda-execution という名前の Lambda 実行名の付いた IAM ロール。マネージドポリシー AWSLambdaBasicExecutionRole をロールに追加し、Lambda 関数が、Amazon CloudWatch Logs を作成およびアクセスできるようにします。
  4. lambda-to-archive-policy という名前の (IAM) ポリシー。これはステップ 2 で作成した S3 バケットと Amazon Glacier ボールトへのアクセスを提供し、rdsarchive-lambda-execution に追加します。
  5. AWS マネージドカスタマー構成の VPC 設定を管理する dms-vpc-role と名付けた IAM ロール。既に作成されていない場合は、ロールにマネージドポリシー AmazonDMSVPCManagementRole を追加します。
  6. IAM ポリシー dmsvpcs3policy (ステップ 1 で作成したバケットにオブジェクトを PUT およびバケットから DELETE する)。それを dms-vpc-role に追加します。
  7. 識別子 archivedb の付いた RDS インスタンス、データベース名 ukdb、ユーザー名 dbadmin、およびデフォルトパスワード postgres123
  8. Amazon RDS PostgreSQL と AWS DMS インスタンスの VPC、また、ご使用の IP 範囲から RDS PostgreSQL インスタンスへのアクセスを許可するセキュリティグループ。

取得された AWS リソースは、テンプレート上デフォルト名で割り当てられます。スタックの作成中に別の名前を付けた場合は、残りのステップでは自分で指定した名前を指定してください。リソース名、RDS エンドポイント名、S3 バケット名などは、スタック実行の [出力] セクションで確認できます。

4.Amazon S3 フォルダの作成

スタックの作成後、[Amazon S3 コンソール] へ移動し、rdstoglacier というバケットを見つけます。バケットの下に次の 2 つのフォルダを作成します。

  1. ukregistry フォルダ、AWS DMS のターゲットとして機能します。
  2. output フォルダ、アーカイブからのデータを取り出す際に、Amazon Glacier Select のターゲットとして機能します。

5.Amazon RDS DB インスタンスへのデータのロード

  1. psql または pgAdmin を使用することで、次に示すようにRDS DB インスタンスに接続します (デフォルトデータベース名 ukdb とユーザー名 dbadmin を使用するものと想定します):
    psql -h <RDS DNS Endpoint>  -d ukdb -U dbadmin  -p 5432
  2. 以下に示すように、データベーステーブルを作成し、英国のデータセットをロードします。
    注意: もう 1 つのオプションとして、データセットを EC2 インスタンスにダウンロードし、その EC2 にインストールされた psql を使用してロードするという方法もあります。

      CREATE TABLE uk_property_registry(
      transaction uuid,
      price numeric,
      transfer_date date,
      postcode text,
      property_type char(1),
      newly_built boolean,
      duration char(1),
      paon text,
      saon text,
      street text,
      locality text,
      city text,
      district text,
      county text,
      ppd_category_type char(1),
      record_status char(1));
      
    # ダウンロードした CSV ファイルからテーブルにデータをロードする。CSV ファイルの完全なパスを指定する。
    
    \copy uk_property_registry FROM '<dataset_file_complete_path>' with (format csv, header false, null '', quote '"', force_null (postcode, saon, paon, street, locality, city, district));

ロードが正常終了すると、COPY 22898552 のような出力が表示されます。また、クエリ select count(*) from uk_property_registry; を実行して、ロードが正常終了したか、確認することもできます。

6.S3 からファイルをダウンロードし、Amazon Glacier ボールトへアップロードする Lambda 関数を作成する

  1. AWS Lambda コンソール上で、以下に示すように archivetoglacier Lambda 関数を作成します。
    1. Python 2.7 ランタイムを使った s3-get-object-python のベースを使用します。
    2. 関数名には archivetoglacier を入力します。
    3. この関数には既存の rdsarchive-lambda-execution ロールを選択します。
    4. バケット名を入力します。
    5. イベントタイプには [Object Created (All)] (作成されたオブジェクト (すべて)) を選択します。
    6. プレフィックスとして ukregistry を指定します。
    7. [トリガーの有効化] チェックボックスをオンにします。
    8. 関数を作成します。
    9. 作成が完了したら関数を編集します。
    10. ウィンドウ内の全コードを GitHub リポジトリの Python のコードで置き換えます。
  2. [環境変数] セクションでは vaultname として rdsarchive を指定します。
  3. Lambda のタイムアウト時間を 5 分に増やします。これはアーカイブのアップロードがデフォルト設定のタイムアウト時間内に完了しない可能性があるためです。

変更内容を保存します。

前述のコードが S3 オブジェクトを取得し、それを Lambda インスタンス上にダウンロードして、Amazon Glacier ボールトへアップロードします。この関数は環境変数を介して、Amazon Glacier ボールト名を取得します。

7.AWS DMS のソースおよびターゲットエンドポイントのセットアップ

  1. AWS DMS コンソールを開いて、ナビゲーションペインの [エンドポイント] をクリックします。ステップ 3 で作成した RDS インスタンスを使用して、PostgreSQL データベースのソースエンドポイントを作成します。以下をご覧ください。データベース名、ポート、ユーザー情報が正しいことを確認してください。
  2. [テストの実行] を選択して、エンドポイントをテストします。テストが成功したら、エンドポイントを保存しましょう。テストが失敗したら、エンドポイントとセキュリティグループの構成を確認します。
  3. テストが完了したら [Refresh schemas] (スキーマの最新表示) を選択します。
  4. 以下に示すように、S3 接続のターゲットエンドポイントを作成します。
    1. dms-vpc-role のロール ARN を arn:aws:iam::<AWS Account>:role/dms-vpc-role と指定します。
    2. ステップ 4 で指定した [バケット名] と [バケットフォルダ] を指定します。
    3. [テストの実行] を選択して、エンドポイントをテストします。テストが成功したら、エンドポイントを保存しましょう。テストが失敗したら、ロール構成と S3 バケット名を確認します。

8.RDS インスタンスから Amazon S3 へデータを抽出するための DMS タスクのセットアップ

  1. [AWS DMS コンソール] を開きます。ナビゲーションペインで [Tasks ] (タスク)、その後、[Create task] (タスクの作成) の順に選択します。
  2. タスク名には archivetos3 を使用します。AWS CloudFormation で作成されたレプリケーションインスタンスと、ステップ 7 で作成したエンドポイントを使用します。
  3. [Migration type] (移行タイプ) には [Migrate existing data] (既存データの移行) を選択します。
  4. [Task Settings] (タスク設定) ではデフォルト値のままにしておきます。
  5. [Table mappings] (テーブルマッピング) セクションでは、スキーマフィールドで [public] (パブリック) を選択します。[Table name] (テーブル名) には [uk_property_registry] を選択します。
  6. AWS DMS は列フィルタを追加するオプションを提供します。この機能により、皆さんのアーカイブ基準に見合ったデータを抽出できるようになります。この例では、特定の年のデータを抽出するために、transfer_date 列を指定します。たとえば、以下に示すように、transfer_date1995-01-01 から 1996-01-01 の間で指定します。[Add selection rule] (選択ルールの追加) を選択します。
  7. [Create task] (タスクの作成) を選択します。その後、移行タスクが実行されます。これは、[Start task on create] (作成後タスクを開始) ボックスが選択されているからです。タスクのステータスが Creating (作成中) から Starting (開始中)、その後、Running (実行中) へと変化し、最終的に Load Complete (ロード完了) になります。
  8. AWS DMS がテーブルから情報のサブセットを CSV 形式で抽出し、指定した S3 パスに保存していることを確認してください。
  9. S3 バケットの内容を確認します。
    1. Amazon S3 コンソールに移動し、rdstoglacier を選択します。ukregistry という名前のキー (フォルダ) を選択します。スキーマ名のキー public を選択します。テーブル名の uk_property_registry を選択する。
    2. オブジェクトの LOAD00000001.csv ファイルが表示されます。このファイルには、1996-01-01 以降のデータが含まれます。 このファイルをダウンロードし、テキストエディタで確認することもできます。
  10. アップロードプロセスで Lambda 関数が呼び出されていることを確認します。
    1. AWS Lambda コンソールに移動し、archivetoglacier を選択します。[Monitoring] (モニタリング) タブを選択し、S3 トリガがバケット上で構成されているように関数が呼び出されたかを確認します。
    2. [Jump to Logs] (ログにジャンプする) を選択し、Lambda 関数の CloudWatch Logs へ移動します。ログから Amazon Glacier アップロード操作の archiveid (u'archiveId' の値) があることが分かります。次のステップでこの値が必要になります。

9.データのサブセットを取得する Lambda 関数の作成

次に、アーカイブから 1995 年に行われた 50 万ドル以上の土地登録を特定する必要があるとします。Amazon Glacier Select では SQL クエリを使用して、アーカイブデータのサブセットを抽出できます。これを実行すると、クエリにかかる全体的な時間を短縮できるだけでなく、アーカイブデータへアクセスする方法を簡略化できます。アーカイブされた CSV ファイルの構造、Amazon Glacier Select の機能でサポートされている SQL 操作、データタイプを理解しておく必要があります。

この例では、データの取り出しに次の SQL 式を使用します。2 列目 (s._2) はテーブルの price 属性で、CSV ファイルはアーカイブとしてアップロードされています。Amazon Glacier ではデフォルトで属性を文字列と想定するので、CAST 関数を使用して、この値を 10 進数値に変換します。Amazon Glacier は複数の取り出しオプションをサポートしますが、ここでは Standard オプションを使用することにします。Amazon Glacier Select は取り出しジョブで指定された S3 バケットに出力を格納します。

select s._1,s._2,s._3,s._4,s._5,s._12,s._13 from archive s  where CAST(s._2 AS DECIMAL) >= 500000

これを実行するには Lambda 関数を使用します。

  1. 次のように Lambda 関数を作成します。
    1. AWS Lambda コンソールで、[Create function] (関数の作成) を選択します。[Author from Scratch] (一から作成) を選択します。
    2. 関数名として glacierselect を入力します。
    3. Python 2.7 ランタイムを選択します。
    4. この関数には既存のロール rdsarchive-lambda-execution を選択します。
    5. 関数を作成します。
    6. 作成が完了したら関数を編集します。
    7. ウィンドウ内の全コードを GitHub リポジトリの Python のコードで置き換えます。[Environment variables] (環境変数) セクションで、次の変数を追加します。ここで重要なのは、正しい値を入力することです。ステップ 4 のプレフィックスである bucketnameステップ 8archiveid などです。
    8. Lambda の Timeout 値を 5 分に設定します。
    9. 関数を保存します。
  2. コマンドラインを使用して Lambda 関数 glacierselect を手動で呼び出すか、下記に示すようにダミーの「Hello World」テストイベントを使用してテストします。
  3. ステップ 2 で作成したテストイベントを使用して、Lambda 関数 glacierselect をテストします。以下に示すように、Lambda コンソールの出力が表示されます。代わりに、Lambda のログで情報を確認することもできます。

10.S3 バケットでのアーカイブ結果の表示

呼び出しが成功したあと、S3 フォルダ (output/UcPixxxx/results) に出力が現れるまで数時間を要する可能性があります。これは Amazon Glacier のStandard 取り出しオプションを使用したためです。早いタイミングで結果を見る必要がある場合は、Expedited オプションを使用することもできます。 また、コスト効率良く、大量のデータをダウンロードする場合には、Bulk 取り出しオプションの使用を考慮しても良いでしょう。結果ファイルをダウンロードし、テキストエディタを使用して分析できます。あるいは、AWS DMS with S3 をソースとして使用し、データを Amazon RDS テーブルへ再アップロードすることもできます。以下は、Amazon Glacier Select を使用して、Amazon Glacier から登録価格が 500000 万ドルより高額の不動産のサンプルデータです。

11.全リソースのクリーンアップ

  1. 英国のパブリックデータセットには使用制限のあるデータが含まれるので、EC2/ のローカルデスクトップから削除してください。
  2. S3 バケットで作成されたフォルダを削除します。
  3. 作成された AWS Lambda 関数を削除します。
  4. ステップ 3 で作成された AWS CloudFormation スタックを削除します。このステップを実行するとこの投稿記事で使用したリソースはすべて削除されます。
  5. Amazon Glacier ボールトを削除します。

他の提案:

  1. このアーキテクチャを拡張して Amazon DynamoDB を含め、完全なアーカイブソリューションを構築できます。インデックス用に分かりやすい説明とともに、Amazon Glacier archiveid を DynamoDB に保存できます (たとえば、 Table: rdsarchivepartition_key= archive_criteria_id(uk_registry_1996), Attribute1 (archiveid=xxxx), Attribute2 (date_created=xxxx) など)。その後、必要に応じて体系的に取り出すことができます。
  2. アーカイブデータをより頻繁にクエリする必要があるときは、AWS DMS を使用して S3 にアーカイブし、Amazon S3 Select または Amazon Athena を介してクエリします。
  3. 定期的に実行するには、AWS DMS タスクをスケジュールすることで、アーカイブプロセスを自動化できます。

結論

多くの企業にとって、ますます増大するデータを管理することは主要な課題となっています。この記事では、AWS DMS、Amazon Glacier、AWS Lambda、Amazon S3 を使用して、リレーショナルデータベースに格納されたアクセスが頻繁ではないデータの処理方法について解説しました。Amazon Glacier Select の機能はデータアーカイブをクエリする一方で、使用するターゲットデータベースを減らすことにより、コストを節約し、パフォーマンスを向上するのに役立ちます。こうしたサービスの組み合わせは、コストとパフォーマンスのバランスを取りながら、増大するデータの管理を支援します。


著者について

Gowri Balasubramanian 氏は、アマゾン ウェブ サービスのシニアソリューションアーキテクトです。 彼は、AWS を使用している場合にソリューションの価値を向上させる手助けとなるために、AWS の顧客と協力してリレーショナルデータベースと NoSQL データベースサービスの両方の指導や技術支援を行っています。

 

 

 

 

Ganesh Shankaran 氏は、アマゾン ウェブ サービスのシニアソリューションアーキテクトです。 彼は、AWS の使用時にソリューションの価値を向上させるため、AWS の顧客と協力して指導や技術支援を行っています。