AWS DMS のソースとしての Amazon S3 の使用 - AWS Database Migration Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS DMS のソースとしての Amazon S3 の使用

AWS DMS を使用して、Amazon S3 バケットからデータを移行できます。このためには、単一または複数のデータファイルを含む Amazon S3 バケットへのアクセスを付与します。この S3 バケットには、データとこのようなファイル内のデータのデータベーステーブルの間のマッピングを説明する JSON ファイルを含めます。

フルロードを開始する前に、ソースデータファイルが Amazon S3 バケットに配置されている必要があります。バケット名は、bucketName パラメータを使用して指定します。

ソースデータファイルはカンマ区切り値 (.csv) 形式とする必要があります。次の命名規則を使用して名前を付けます。この規則では、schemaName がソーススキーマ、tableName がそのスキーマ内のテーブル名です。

/schemaName/tableName/LOAD001.csv /schemaName/tableName/LOAD002.csv /schemaName/tableName/LOAD003.csv ...

例えば、データファイルが次の Amazon S3 パスの mybucket にあるとします。

s3://mybucket/hr/employee

ロード時に、AWS DMS はソーススキーマ名が hr、ソーステーブル名が employee であると想定します。

bucketName (必須) に加え、必要に応じて bucketFolder パラメータを設定し、AWS DMS が Amazon S3 バケットでデータファイルを検索する場所を指定します。引き続き前の例で説明すると、bucketFoldersourcedata に設定した場合、AWS DMS は次のパスでデータファイルを読み取ります。

s3://mybucket/sourcedata/hr/employee

追加の接続属性を使用して、列の区切り記号、行の区切り記号、null 値の識別子、その他のパラメータを指定できます。詳細については、「AWS DMS のソースとしての Amazon S3 のエンドポイントの設定」を参照してください。

次のとおり、ExpectedBucketOwner Amazon S3 エンドポイント設定を使用してバケット所有者を指定して、スナイプ攻撃を防ぐことができます。その後、接続をテストしたり移行の実行をリクエストしたりすると、S3 は指定されたパラメータに対してバケット所有者のアカウント ID をチェックします。

--s3-settings='{"ExpectedBucketOwner": "AWS_Account_ID"}'

AWS DMS のソースとしての Amazon S3 の外部テーブルの定義

データファイルに加えて、外部テーブル定義も指定する必要があります。外部テーブル定義は、AWS DMS が Amazon S3 からのデータを解釈する方法について説明する JSON ドキュメントです。このドキュメントの最大サイズは 2 MB です。AWS DMS マネジメントコンソールを使用してソースエンドポイントを作成する場合、JSON を直接テーブルマッピングボックスに入力できます。AWS Command Line Interface (AWS CLI) または AWS DMS API を使用して移行を実行する場合は、JSON ファイルを作成して外部テーブル定義を指定することができます。

次のコンテンツを含むデータファイルがあるとします。

101,Smith,Bob,2014-06-04,New York 102,Smith,Bob,2015-10-08,Los Angeles 103,Smith,Bob,2017-03-13,Dallas 104,Smith,Bob,2017-03-13,Dallas

このデータの外部テーブル定義の例は次のとおりです。

{ "TableCount": "1", "Tables": [ { "TableName": "employee", "TablePath": "hr/employee/", "TableOwner": "hr", "TableColumns": [ { "ColumnName": "Id", "ColumnType": "INT8", "ColumnNullable": "false", "ColumnIsPk": "true" }, { "ColumnName": "LastName", "ColumnType": "STRING", "ColumnLength": "20" }, { "ColumnName": "FirstName", "ColumnType": "STRING", "ColumnLength": "30" }, { "ColumnName": "HireDate", "ColumnType": "DATETIME" }, { "ColumnName": "OfficeLocation", "ColumnType": "STRING", "ColumnLength": "20" } ], "TableColumnsTotal": "5" } ] }

この JSON ドキュメントの要素は次のとおりです。

TableCount – ソーステーブルの数。この例の場合、テーブル数は 1 つのみ。

Tables – ソーステーブルごとに単一の JSON マップで構成される配列。この例の場合、マップは 1 つのみ。各マップは次の要請で構成される。

  • TableName – ソーステーブル名

  • TablePath – AWS DMS が完全なデータロードファイルを検索できる Amazon S3 バケットのパス。bucketFolder 値が指定されていれば、その値がパスの先頭に追加される。

  • TableOwner – このテーブルのスキーマ名

  • TableColumns – 単一または複数のマップの配列。各マップはソーステーブル内の列を次のとおり記述する。

    • ColumnName – ソーステーブル内の列名

    • ColumnType – 列のデータ型。有効なデータ型については、「ソースの Amazon S3 のデータ型」を参照。

    • ColumnLength - この列のバイト数。S3 ソースは完全 LOB モードをサポートしていないため、列の最大長は 2,147,483,647 バイト (2,047 メガバイト) に制限される。ColumnLength は次のデータ型に対して有効。

      • BYTE

      • STRING

    • ColumnNullable – この列に NULL 値を含めることができる場合に true となるブール値 (デフォルト=false)

    • ColumnIsPk – この列がプライマリキーの一部である場合に true となるブール値 (デフォルト=false)

    • ColumnDateFormat – DATE 型、TIME 型、DATETIME 型の列の入力日付形式。データ文字列を日付オブジェクトに解析するために使用される。次のとおりの値が可能。

      - YYYY-MM-dd HH:mm:ss - YYYY-MM-dd HH:mm:ss.F - YYYY/MM/dd HH:mm:ss - YYYY/MM/dd HH:mm:ss.F - MM/dd/YYYY HH:mm:ss - MM/dd/YYYY HH:mm:ss.F - YYYYMMdd HH:mm:ss - YYYYMMdd HH:mm:ss.F
  • TableColumnsTotal – 列の合計数。この数は TableColumns 配列内の要素の数と一致する必要がある。

特に指定がない限り、AWS DMS は ColumnLength がゼロであると想定します。

注記

AWS DMS のサポートされるバージョンでは、S3 ソースデータには、TableName 列値の前の最初の列としてオプションの操作列を含めることもできます。このような操作列は、フルロード時に S3 ターゲットエンドポイントにデータを移行するために使用される操作 (INSERT) を識別します。

操作列がある場合、この列の値は INSERT 操作キーワードの最初の文字 (I) となります。指定がある場合、この列は通常、S3 ソースが以前の移行中に S3 ターゲットとして DMS によって作成されたことを示します。

3.4.2 以前の DMS バージョンでは、この列は以前の DMS フルロードから作成された S3 ソースデータにはありませんでした。この列を S3 ターゲットデータに追加すると、フルロード中に書き込まれたか、CDC ロード中に書き込まれたかを問わず、S3 ターゲットに書き込まれるすべての行の形式に一貫性を持たせることができます。S3 ターゲットデータの形式のオプションの詳細については、「移行済み S3 データでのソース DB オペレーションの表示」を参照してください。

NUMERIC 型の列の場合、精度と位取りを指定します。精度は数値の桁の合計数であり、位取りは小数点以下の桁数です。次のとおり、これには ColumnPrecision 要素と ColumnScale 要素を使用します。

... { "ColumnName": "HourlyRate", "ColumnType": "NUMERIC", "ColumnPrecision": "5" "ColumnScale": "2" } ...

分数の秒を含むデータを持つ DATETIME 型の列の場合は、位取りを指定します。[位取り] は秒の小数点以下の桁数で、0~9 の範囲で指定します。これには次のとおり、ColumnScale 要素を使用します。

... { "ColumnName": "HireDate", "ColumnType": "DATETIME", "ColumnScale": "3" } ...

特に指定がない限り、AWS DMS は ColumnScale はゼロである想定し、秒の小数点以下を切り捨てます。

AWS DMS のソースとしての Amazon S3 での CDC の使用

AWS DMS はフルデータロードを実行した後、必要に応じてデータの変更をターゲットエンドポイントにレプリケートできます。これを行うには、変更データキャプチャ ファイル (CDC ファイル) を Amazon S3 バケットにアップロードします。AWS DMS​ は、アップロード時に CDC ファイルを読み取り、ターゲットエンドポイントに変更を適用します。

CDC ファイルは次のとおり名前が付けられます。

CDC00001.csv CDC00002.csv CDC00003.csv ...
注記

変更データフォルダ内の CDC ファイルをレプリケートするには、アップロードを辞書式順序 (アルファベット順) で正常に完了します。例えば、ファイル CDC00002.csv はファイル CDC00003.csv より前にアップロードします。順序を違えると、CDC00002.csv はスキップされ、CDC00003.csv の後にロードしてもレプリケートされません。ファイル CDC00004.csv を CDC00003.csv の後にロードすれば、CDC00004.csv は正常にレプリケートされます。

AWS DMS がファイルを検索できる場所を指定すには、cdcPath パラメータを使用します。引き続き前の例で説明すると、cdcPathchangedata に設定した場合、AWS DMS は次のパスにある CDC ファイルを読み取ります。

s3://mybucket/changedata

cdcPathchangedata に、bucketFoldermyFolder に設定した場合、AWS DMS は次のパスにある CDC ファイルを読み取ります。

s3://mybucket/myFolder/changedata

CDC ファイル内のレコードの形式は次のとおりです。

  • Operation – 実行すべき操作: INSERTIUPDATEUDELETE、または D 上記のキーワードと文字値では大文字と小文字は区別されない。

    注記

    サポートされている AWS DMS バージョンでは、AWS DMS は 2 つの方法でロードレコードに対して実行すべき操作を特定できます。AWS DMS では、レコードのキーワード値 (INSERT など) またはそのキーワードの最初の文字 (例えば、I) で識別します。以前のバージョンでは、AWS DMS がロード操作を認識できたのは完全なキーワード値からのみでした。

    AWS DMS の以前のバージョンでは、CDC データをログに記録する際、完全なキーワード値が書き込まれていました。それ以前のバージョンでは、S3 ターゲットへの操作値の書き込みにはキーワードの頭文字のみを使用していました。

    両方の形式を認識することにより、S3 ソースデータを作成するための操作列の記述形式を問わず、AWS DMS は操作を処理できるようになります。このアプローチにより、その後の移行のソースとして S3 ターゲットデータを使用することがサポートされます。このアプローチの場合、その後実行する S3 ソースの操作列に表示されるキーワードの初期値の形式を変更する必要はありません。

  • Table name – ソーステーブル名

  • Schema name – ソーススキーマ名

  • Data – 変更されるデータを表す単一または複数の列

employee というテーブル名の CDC ファイルの例が次に示されています。

INSERT,employee,hr,101,Smith,Bob,2014-06-04,New York UPDATE,employee,hr,101,Smith,Bob,2015-10-08,Los Angeles UPDATE,employee,hr,101,Smith,Bob,2017-03-13,Dallas DELETE,employee,hr,101,Smith,Bob,2017-03-13,Dallas

AWS DMS のソースとして Amazon S3 を使用する場合の前提条件

Amazon S3 を AWS DMS のソースとして使用する場合、ソースの S3 バケットはデータを移行する DMS レプリケーションインスタンスと同じ AWS リージョンに配置されている必要があります。さらに、移行に使用する AWS アカウントには、ソースバケットへの読み取りアクセスも必要です。

移行タスクの作成に使用するユーザーアカウントに割り当てられる AWS Identity and Access Management (IAM) ロールには、次のとおりのアクセス許可のセットが必要です。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::mybucket*/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::mybucket*" ] } ] }

Amazon S3 バケットでバージョニングが有効になっている場合、移行タスクの作成に使用するユーザーアカウントに割り当てられる AWS Identity and Access Management (IAM) ロールには、次のとおりのアクセス許可のセットが必要です。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "S3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::mybucket*/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::mybucket*" ] } ] }

AWS DMS のソースとして Amazon S3 を使用する場合の制限

Amazon S3 をソースとして使用する場合、次の制限が適用されます。

  • S3 のバージョニングは有効にしません。S3 のバージョニングが必要な場合は、ライフサイクルポリシーを使用して古いバージョンを積極的に削除します。これを行わないと、S3 list-object コールのタイムアウトが原因でエンドポイント接続テストが失敗する可能性があります。S3 バケットのライフサイクルポリシーを作成するには、「ストレージのライフサイクルの管理」を参照してください。S3 オブジェクトのバージョンを削除するには、「バージョニングが有効なバケットからのオブジェクトバージョンの削除」を参照してください。

  • VPC 対応 (ゲートウェイ VPC) S3 バケットはバージョン 3.4.7 以降でサポートされます。

AWS DMS のソースとしての Amazon S3 のエンドポイントの設定

追加の接続属性の使用と同様、エンドポイントの設定を使用して、ソースの Amazon S3 データベースを設定できます。ソースエンドポイントを作成する際に、AWS DMS コンソールを使用するか、AWS CLI--s3-settings '{"EndpointSetting": "value", ...}' の JSON 構文を指定して create-endpoint コマンドを使用して設定を指定します。

次の表は、ソースとして Amazon S3 を使用できるエンドポイント設定を説明しています。

オプション 説明
BucketFolder

(オプション) S3 バケットのフォルダ名。この属性を指定すると、ソースデータファイルと CDC ファイルがそれぞれパス s3://myBucket/bucketFolder/schemaName/tableName/s3://myBucket/bucketFolder/ から読み取られる。この属性が指定されていない場合、使用されるパスは schemaName/tableName/ となる。

'{"BucketFolder": "sourceData"}'

BucketName

S3 バケットの名前

'{"BucketName": "myBucket"}'

CdcPath CDC ファイルの場所。タスクで変更データをキャプチャする場合、この属性は必須となる。それ以外の場合はオプション。CdcPath がある場合、AWS DMS はこのパスから CDC ファイルを読み取り、データ変更をターゲットエンドポイントにレプリケートする。詳細については、「AWS DMS のソースとしての Amazon S3 での CDC の使用」を参照。

'{"CdcPath": "changeData"}'

CsvDelimiter

ソースファイル内の列を区切るために使用される区切り記号。デフォルトではカンマを使用する。次に例を示す。

'{"CsvDelimiter": ","}'

CsvNullValue

AWS DMS がソースから読み取る際に NULL として処理するユーザー定義の文字列。デフォルトは空の文字列。このパラメータを設定しない場合、空の文字列は NULL AWS DMS 値として処理される。このパラメータで「\ N」などの文字列を指定しても、AWS DMS はこの文字列を NULL 値として処理し、空の文字列は空の文字列値として処理される。

CsvRowDelimiter

ソースファイル内の行を区切るために使用される区切り記号。デフォルトは改行 (\n)。

'{"CsvRowDelimiter": "\n"}'

IgnoreHeaderRows

この値を 1 に設定すると、AWS DMS は .csv ファイルの最初の行ヘッダーを無視する。値が 1 の場合は機能が有効になり、値が 0 の場合は機能が無効になる。

デフォルトは 0。

'{"IgnoreHeaderRows": 1}'

Rfc4180

この値を true または y に設定する場合は、先頭の二重引用符の後に、最後の二重引用符を続ける必要がある。この形式 RFC 4180 に準拠している。この値を false または n に設定すると、文字列リテラルがターゲットにそのままコピーされる。この場合、区切り記号 (行または列) はフィールドの末尾を示す。つまり、区切り記号は値の末尾を示すため、これを文字列の一部とすることはできない。

デフォルトは true

有効値: truefalseyn

'{"Rfc4180": false}'

ソースの Amazon S3 のデータ型

AWS DMS のソースとして Amazon S3 を使用するデータ移行では、Amazon S3 から AWS DMS データ型にデータをマッピングする必要があります。詳細については、「AWS DMS のソースとしての Amazon S3 の外部テーブルの定義」を参照してください。

ターゲットにマップされるデータ型を確認する方法については、使用しているターゲットエンドポイントのセクションを参照してください。

AWS DMS のデータ型の詳細については、「AWS Database Migration Service のデータ型」を参照してください。

ソースの Amazon S3 では、次の AWS DMS データ型が使用されます。