Amazon Aurora MySQL DB クラスターから Amazon S3 バケット内のテキストファイルへのデータの保存 - Amazon Aurora

Amazon Aurora MySQL DB クラスターから Amazon S3 バケット内のテキストファイルへのデータの保存

SELECT INTO OUTFILE S3 ステートメントを使用して、Amazon Aurora MySQL DB クラスターのデータをクエリし、Amazon S3 バケット内のテキストファイルにデータを保存できます。Aurora MySQL では、ファイルを最初にローカルディスクに保存し、次に S3 にエクスポートします。エクスポートが完了すると、ローカルファイルは削除されます。

Amazon S3 マネージドキー (SSE-S3) または AWS KMS key (SSE-KMS: AWS マネージドキー またはカスタマーマネージドキー) を使用して Amazon S3 バケットを暗号化できます。

LOAD DATA FROM S3 ステートメントは、SELECT INTO OUTFILE S3 ステートメントで作成したファイルを使用してデータを Aurora DB クラスター内にロードできます。詳細については、「Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード」を参照してください。

注記

この機能は Aurora Serverless v1 DB クラスターに対してサポートされていません。Aurora Serverless v2 DB クラスターでサポートされています。

AWS Management Console、AWS CLI、または Amazon RDS API を使用して、DB クラスターデータと DB クラスタースナップショットデータを Amazon S3 に保存することもできます。詳細については、Amazon S3 への DB クラスターデータのエクスポートおよびAmazon S3 への DB クラスタースナップショットデータのエクスポートを参照してください。

Amazon S3 へのアクセスを Aurora MySQL に許可する

データを Amazon S3 バケット内に保存する前に、Amazon S3 へのアクセス権限を Aurora MySQL DB クラスターに付与する必要があります。

Amazon S3 へのアクセス権限を Aurora MySQL に付与するには
  1. バケットおよびオブジェクトのアクセス許可を付与し、Aurora MySQL DB クラスターから Amazon S3 へのアクセスを許可する AWS Identity and Access Management (IAM) ポリシーを作成します。手順については、Amazon S3 リソースにアクセスするための IAM ポリシーの作成 を参照してください。

    注記

    Aurora MySQL バージョン 3.05 以降では、AWS KMS カスタマーマネージドキーを使用してオブジェクトを暗号化できます。そのためには、IAM ポリシーに kms:GenerateDataKey アクセス許可を含めてください。詳細については、「AWS KMS リソースにアクセスするための IAM ポリシーの作成」を参照してください。

    AWS マネージドキー または Amazon S3 マネージドキー (SSE-S3) を使用してオブジェクトを暗号化する場合にはこのアクセス許可は必要ありません。

  2. IAM ロールを作成して、「Amazon S3 リソースにアクセスするための IAM ポリシーの作成」で作成した IAM ポリシーを新しい IAM ロールにアタッチします。手順については、Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成 を参照してください。

  3. Aurora MySQL バージョン 2 の場合、aurora_select_into_s3_role または aws_default_s3_role DB クラスターパラメータを、新しい IAM ロールの Amazon リソースネーム (ARN) に設定します。IAM ロールが aurora_select_into_s3_role に指定されていない場合、Aurora は aws_default_s3_role に指定されている IAM ロールを使用します。

    Aurora MySQL バージョン 3 の場合、aws_default_s3_role を使用します。

    クラスターが Aurora Global Database の一部である場合は、このパラメータをグローバルデータベース内の Aurora クラスターごとに設定します。

    DB クラスターのパラメータの詳細については、「Amazon Aurora の DB クラスターパラメータと DB インスタンスパラメータ」を参照してください。

  4. Aurora MySQL DB クラスター内のデータベースユーザーが Amazon S3 にアクセスできるように、「Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成」で作成したロールをその DB クラスターに関連付けます。

    Aurora Global Database の場合は、グローバルデータベース内の Aurora クラスターごとにロールを関連付けます。

    DB クラスターへの IAM ロールの関連付けの詳細については、「IAM ロールと Amazon Aurora MySQL DB クラスターの関連付け」を参照してください。

  5. Amazon S3 へのアウトバウンド接続を許可するように Aurora MySQL DB クラスターを設定します。手順については、「Amazon Aurora から他の AWS のサービスへのネットワーク通信の有効化」を参照してください。

    Aurora Global Database の場合は、グローバルデータベース内の Aurora クラスターごとにアウトバウンド接続を有効にします。

Aurora MySQL にデータを保存する権限の付与

SELECT INTO OUTFILE S3 ステートメントを発行するデータベースユーザーは、特定のロールまたは権限を保持している必要があります。Aurora MySQL バージョン 3 では、AWS_SELECT_S3_ACCESS ロールを付与します。Aurora MySQL バージョン 2 では、SELECT INTO S3 権限を付与します。DB クラスターの管理ユーザーにはデフォルトで適切なロールまたは権限が付与されます。他のユーザーに権限を付与するには、次のいずれかのコマンドが使用できます。

Aurora MySQL バージョン 3 では、次のステートメントを使用します:

GRANT AWS_SELECT_S3_ACCESS TO 'user'@'domain-or-ip-address'
ヒント

Aurora MySQL バージョン 3 でロールテクニックを使用する場合は、SET ROLE role_name または SET ROLE ALL ステートメントを使用してロールを有効化することもできます。MySQL 8.0 ロールシステムに馴染みがない場合は、ロールベースの特権モデル で詳細を確認頂けます。詳細については、「MySQL リファレンスマニュアル」の「Using roles」を参照してください。

これは現在アクティブなセッションにのみ適用されます。再接続するときは、SET ROLE ステートメントを再度実行して権限を付与する必要があります。詳細については、MySQL リファレンスマニュアルの「SET ROLE ステートメント」を参照してください。

ユーザーが DB インスタンスに接続したときに、activate_all_roles_on_login DB クラスターパラメータを使用して、すべてのロールを自動的に有効化できます。このパラメータを設定すると、通常、SET ROLE ステートメントを明示的に呼び出してロールをアクティブ化する必要はありません。詳細については、MySQL リファレンスマニュアルの「activate_all_roles_on_login」を参照してください。

ただし、ストアドプロシージャを別のユーザーから呼び出す場合は、ストアドプロシージャの先頭で SET ROLE ALL を明示的に呼び出してロールをアクティブ化する必要があります。

Aurora MySQL バージョン 2 では、次のステートメントを使用します:

GRANT SELECT INTO S3 ON *.* TO 'user'@'domain-or-ip-address'

AWS_SELECT_S3_ACCESS ロールまたは SELECT INTO S3 権限は Amazon Aurora MySQL に固有であり、MySQL データベースおよび MySQL DB インスタンスの RDS では使用できません。Aurora MySQL DB クラスターをレプリケーションソースとし、MySQL データベースをレプリケーションクライアントとして両者間にレプリケーションを設定した場合、ロールまたは権限の GRANT ステートメントはエラーとなり、レプリケーションが停止します。エラーをスキップして、レプリケートを再開できます。RDS for MySQL DB インスタンスでエラーをスキップするには、 mysql_rds_skip_repl_error プロシージャを使用します。外部 MySQL データベースでエラーをスキップするには、slave_skip_errors システム変数 (Aurora MySQL バージョン 2) または replica_skip_errors システム変数 (Aurora MySQL バージョン 3) を使用します。

Amazon S3 バケットへのパスの指定

Amazon S3 バケットにデータとマニフェストファイルを保存するためのパスを指定する構文は、次に示すように、LOAD DATA FROM S3 PREFIX ステートメントで使用する構文と似ています。

s3-region://bucket-name/file-prefix

パスに指定する値は以下のとおりです。

  • region (オプション) - データの保存先の Amazon S3 バケットがある AWS リージョン。この値はオプションです。region 値を指定しないと、Aurora は DB クラスターと同じリージョンの Amazon S3 にファイルを保存します。

  • bucket-name - データの保存先である Amazon S3 バケットの名前。仮想フォルダのパスを識別するオブジェクトプレフィックスがサポートされています。

  • file-prefix - Amazon S3 に保存するファイルを識別する Amazon S3 オブジェクトプレフィックス。

SELECT INTO OUTFILE S3 ステートメントで作成したデータファイルでは、次のパスを使用します。00000 はゼロから始まる 5 桁の整数です。

s3-region://bucket-name/file-prefix.part_00000

例えば、SELECT INTO OUTFILE S3 ステートメントでデータファイルの保存先のパスとして s3-us-west-2://bucket/prefix を指定し、3 つのデータファイルを作成したとします。この場合、指定した Amazon S3 バケットに保存されるデータファイルは以下のとおりです。

  • s3-us-west-2://bucket/prefix.part_00000

  • s3-us-west-2://bucket/prefix.part_00001

  • s3-us-west-2://bucket/prefix.part_00002

データファイルをリスト化するマニフェストの作成

SELECT INTO OUTFILE S3 ステートメントで MANIFEST ON オプションを使用すると、このステートメントで作成されるテキストファイルをリストするマニフェストファイルを JSON 形式で作成できます。LOAD DATA FROM S3 ステートメントでは、このマニフェストファイルを使用してデータファイルを逆に Aurora MySQL DB クラスター内にロードできます。マニフェストファイルを使用して Amazon S3 から Aurora MySQL DB クラスター内にデータファイルをロードする方法の詳細については、「マニフェストを使用して、ロードするデータファイルを指定する」を参照してください。

SELECT INTO OUTFILE S3 ステートメントで作成されたマニフェストでは、このステートメントで作成された順にデータファイルがリストされます。例えば、SELECT INTO OUTFILE S3 ステートメントでデータファイルの保存先のパスとして s3-us-west-2://bucket/prefix を指定し、マニフェストファイルを作成したとします。この場合、指定した Amazon S3 バケットに保存されるマニフェストファイルは s3-us-west-2://bucket/prefix.manifest という名前で、以下の内容になります。

{ "entries": [ { "url":"s3-us-west-2://bucket/prefix.part_00000" }, { "url":"s3-us-west-2://bucket/prefix.part_00001" }, { "url":"s3-us-west-2://bucket/prefix.part_00002" } ] }

SELECT INTO OUTFILE S3

SELECT INTO OUTFILE S3 ステートメントを使用して、DB クラスターからクエリしたデータを直接 Amazon S3 バケット内の区切りテキストファイルに保存できます。

圧縮ファイルはサポートされていません。暗号化ファイルは Aurora MySQL バージョン 2.09.0 以降でサポートされています。

構文

SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr [, select_expr ...] [FROM table_references [PARTITION partition_list] [WHERE where_condition] [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] [HAVING where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] INTO OUTFILE S3 's3_uri' [CHARACTER SET charset_name] [export_options] [MANIFEST {ON | OFF}] [OVERWRITE {ON | OFF}] [ENCRYPTION {ON | OFF | SSE_S3 | SSE_KMS ['cmk_id']}] export_options: [FORMAT {CSV|TEXT} [HEADER]] [{FIELDS | COLUMNS} [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char'] ] [LINES [STARTING BY 'string'] [TERMINATED BY 'string'] ]

パラメータ

SELECT INTO OUTFILE S3 ステートメントでは、Aurora に固有の次の必須パラメータとオプションパラメータを使用します。

s3-uri

Amazon S3 のプレフィックスとして使用する URI を指定します。「Amazon S3 バケットへのパスの指定」で説明されている構文を使用してください。

フォーマット {CSV|テキスト} [ヘッダー]

必要に応じて、データを CSV 形式で保存します。

TEXT オプションはデフォルトで、既存の MySQL エクスポート形式を生成します。

CSV オプションは、カンマ区切りのデータ値を生成します。CSV 形式は、 RFC-4180 の仕様に従います。オプションのキーワード HEADER を指定すると、出力ファイルに 1 つのヘッダー行が含まれます。ヘッダー行のラベルは、SELECT ステートメントの列名に対応します。AWS ML サービスで使用するトレーニングデータモデルに CSV ファイルを使用できます。AWS ML サービスでエクスポートされた Aurora データを使用する方法の詳細については、「SageMaker モデルトレーニング用のデータを Amazon S3 にエクスポートする (高度)」を参照してください。

マニフェスト {オン | オフ}

Amazon S3 でマニフェストファイルを作成するかどうかを指定します。マニフェストファイルは、JSON (JavaScript Object Notation) ファイルであり、LOAD DATA FROM S3 MANIFEST ステートメントでデータを Aurora DB クラスター内にロードする際に使用できます。LOAD DATA FROM S3 MANIFEST の詳細については、Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード を参照してください。

クエリで MANIFEST ON を指定すると、すべてのデータファイルが作成されてアップロードされた後で、Amazon S3 内にマニフェストファイルが作成されます。マニフェストファイルは次のパスで作成されます。

s3-region://bucket-name/file-prefix.manifest

マニフェストファイルのコンテンツの詳しい形式については、「データファイルをリスト化するマニフェストの作成」を参照してください。

上書き {オン | オフ}

指定した Amazon S3 バケット内の既存のファイルを上書きするかどうかを指定します。OVERWRITE ON を指定すると、s3-uri に指定した URI のファイルプレフィックスと一致する既存のファイルは上書きされます。上書きされないと、エラーが発生します。

ENCRYPTION {ON | OFF | SSE_S3 | SSE_KMS ['cmk_id']}

Amazon S3 マネージドキーを使ったサーバー側の暗号化 (SSE-S3) または AWS KMS keys (SSE-KMS、AWS マネージドキー およびカスタマーマネージドキーを含む) を使用するかどうかを指定します。SSE_S3 および SSE_KMS 設定は、Aurora MySQL バージョン 3.05 以降で使用できます。

次の例に示すように、ENCRYPTION 句の代わりに aurora_select_into_s3_encryption_default セッション変数を使用することもできます。SQL 句またはセッション変数のいずれかを使用しますが、両方は使用できません。

set session set session aurora_select_into_s3_encryption_default={ON | OFF | SSE_S3 | SSE_KMS};

SSE_S3 および SSE_KMS 設定は、Aurora MySQL バージョン 3.05 以降で使用できます。

aurora_select_into_s3_encryption_default を次の値に設定した場合:

  • OFF – S3 バケットのデフォルトの暗号化ポリシーが適用されます。aurora_select_into_s3_encryption_default の初期値は OFF です。

  • ON または SSE_S3 – S3 オブジェクトは Amazon S3 マネージドキー (SSE-S3) を使用して暗号化されます。

  • SSE_KMS – S3 オブジェクトは AWS KMS key を使用して暗号化されます。

    この場合は、セッション変数 aurora_s3_default_cmk_id も含めます。次に例を示します。

    set session aurora_select_into_s3_encryption_default={SSE_KMS}; set session aurora_s3_default_cmk_id={NULL | 'cmk_id'};
    • aurora_s3_default_cmk_idNULL のとき、S3 オブジェクトは AWS マネージドキー を使用して暗号化されます。

    • aurora_s3_default_cmk_id がが空でない文字列 cmk_id の場合、S3 オブジェクトはカスタマーマネージドキーを使用して暗号化されます。

      cmk_id の値は空の文字列にはできません。

SELECT INTO OUTFILE S3 コマンドを使用すると、Aurora は次のように暗号化を決定します。

  • SQL コマンドに ENCRYPTION 句が含まれている場合、Aurora は ENCRYPTION の値のみに依存し、セッション変数を使用しません。

  • ENCRYPTION 句がない場合、Aurora はセッション変数の値に依存します。

詳細については、Amazon Simple Storage Service ユーザーガイドの「Amazon S3 マネージドキー (SSE-S3) によるサーバー側の暗号化」および「AWS KMS キー (SSE-KMS) によるサーバー側の暗号化」を参照してください。

他のパラメータの詳細については、MySQL ドキュメントの「SELECT ステートメント」と「LOAD DATA ステートメント」を参照してください。

考慮事項

Amazon S3 バケットに書き込まれるファイルの数は、SELECT INTO OUTFILE S3 ステートメントで選択したデータの量と Aurora MySQL のファイルサイズのしきい値によって異なります。デフォルトのファイルサイズのしきい値は 6 GB です。ステートメントで選択したデータがファイルサイズのしきい値より少ない場合は、1 つのファイルが作成されます。それ以外の場合は、複数のファイルが作成されます。このステートメントで作成されるファイルについては、以下の点にも留意してください。

  • Aurora MySQL では、データファイルの行がファイル境界で分割されないことが保証されます。複数のファイルの場合、最後のファイルを除くすべてのデータファイルは、通常、ファイルサイズのしきい値に近いサイズになります。ただし、ファイルサイズのしきい値を常に下回る必要があるために、1 つの行が 2 つのデータファイル間にまたがる場合がまれにあります。この場合、Aurora MySQL では行が分割されないようにデータファイルを作成するため、ファイルサイズのしきい値を上回ることがあります。

  • Aurora MySQL では各 SELECT ステートメントをアトミックトランザクションとして実行するため、SELECT INTO OUTFILE S3 ステートメントで大きなデータセットを選択すると、実行時間が長引く場合があります。何らかの理由でステートメントが失敗すると、ステートメントの発行をやり直す必要が生じる場合があります。ただし、ステートメントが失敗しても、Amazon S3 にアップロード済みのファイルは保存先の Amazon S3 バケット内に残るため、再実行するステートメントでは初期からではなく残りのデータだけをアップロードできます。

  • 選択するデータが 25 GB を超える場合は、複数回の SELECT INTO OUTFILE S3 ステートメントを使用してデータを Amazon S3 に保存することをお勧めします。実行するステートメントごとに、保存するデータ部分を選択し、保存先として file_prefix パラメータに異なる s3-uri を指定します。選択するデータを複数のステートメントでパーティション化すると、1 つのステートメントでエラーから回復しやすくなります。1 つのステートメントでエラーが発生した場合は、データの一部だけを再選択して Amazon S3 にアップロードする必要があります。複数のステートメントを使用すると、1 回のトランザクションの実行時間が短くなり、パフォーマンスも向上します。

  • 複数の SELECT INTO OUTFILE S3 ステートメント間で、file_prefix パラメータに同じ s3-uri を指定した場合、これらのステートメントを同時に実行してデータを Amazon S3 に保存しようとしたときの動作は定義されていません。

  • Aurora MySQL では、テーブルスキーマやファイルメタデータなどのメタデータは Amazon S3 にアップロードされません。

  • 障害から回復する目的などで SELECT INTO OUTFILE S3 を再実行する場合もあります。このような場合は、s3-uri で指定するファイルプレフィックスと同じ既存のデータファイルを Amazon S3 バケットから削除するか、OVERWRITE ON クエリで SELECT INTO OUTFILE S3 を指定します。

SELECT INTO OUTFILE S3 ステートメントの成否に応じて、一般的な MySQL エラー番号およびレスポンスが返されます。MySQL エラー番号およびレスポンスにアクセスできない場合は、最も簡単な確認方法として MANIFEST ON をステートメントで指定します。マニフェストファイルは、ステートメントで最後に書き込まれるファイルです。つまり、マニフェストファイルがあれば、ステートメントが完了したことになります。

現在、実行中に SELECT INTO OUTFILE S3 ステートメントの進行状況を直接モニタリングする方法はありません。ただし、このステートメントを使用して Aurora MySQL から Amazon S3 に大量のデータを書き込む際に、ステートメントで選択されるデータのサイズがわかっている場合があります。このような場合、Amazon S3 でデータファイルの作成をモニタリングすることで、進行状況を推測できます。

そのためには、ステートメントで選択する約 6 GB のデータごとにデータファイルが指定先の Amazon S3 バケットに作成されることに注目します。選択対象のデータのサイズを 6 GB で割り、作成されるデータファイルの推定数を割り出します。次に Amazon S3 にアップロードされたファイルの数をステートメントの実行中にモニタリングして、ステートメントの進行状況を推測できます。

次のステートメントでは、employees テーブルからすべてのデータを選択し、そのデータを Aurora MySQL DB クラスターとは異なるリージョンにある Amazon S3 バケット内に保存します。このステートメントで作成されるデータファイルでは、各フィールドの末尾にカンマ (,) 文字、各行の末尾に改行 (\n) 文字が付きます。指定先の Amazon S3 バケットに sample_employee_data ファイルプレフィックスと一致するファイルがあると、ステートメントからエラーが返されます。

SELECT * FROM employees INTO OUTFILE S3 's3-us-west-2://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';

次のステートメントでは、employees テーブルからすべてのデータを選択し、そのデータを Aurora MySQL DB クラスターと同じリージョンにある Amazon S3 バケット内に保存します。このステートメントで作成されるデータファイルでは、各フィールドの末尾にカンマ (,) 文字、各行の末尾に改行 (\n) 文字が付きます。このステートメントでは、マニフェストファイルも作成されます。指定先の Amazon S3 バケットに sample_employee_data ファイルプレフィックスと一致するファイルがあると、ステートメントからエラーが返されます。

SELECT * FROM employees INTO OUTFILE S3 's3://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' MANIFEST ON;

次のステートメントでは、employees テーブルからすべてのデータを選択し、そのデータを Aurora DB クラスターとは異なるリージョンにある Amazon S3 バケット内に保存します。このステートメントで作成されるデータファイルでは、各フィールドの末尾にカンマ (,) 文字、各行の末尾に改行 (\n) 文字が付きます。指定先の Amazon S3 バケットで sample_employee_data ファイルプレフィックスと一致する既存のファイルは上書きされます。

SELECT * FROM employees INTO OUTFILE S3 's3-us-west-2://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' OVERWRITE ON;

次のステートメントでは、employees テーブルからすべてのデータを選択し、そのデータを Aurora MySQL DB クラスターと同じリージョンにある Amazon S3 バケット内に保存します。このステートメントで作成されるデータファイルでは、各フィールドの末尾にカンマ (,) 文字、各行の末尾に改行 (\n) 文字が付きます。このステートメントでは、マニフェストファイルも作成されます。指定先の Amazon S3 バケットで sample_employee_data ファイルプレフィックスと一致する既存のファイルは上書きされます。

SELECT * FROM employees INTO OUTFILE S3 's3://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' MANIFEST ON OVERWRITE ON;