Snowflake から TiDB Cloud Lake へ移行する
Capabilities: Full Load
このチュートリアルでは、Snowflake から TiDB Cloud Lake にデータを移行する手順を説明します。移行では、Snowflake から Amazon S3 バケットにデータをエクスポートし、その後 TiDB Cloud Lake にロードします。プロセスは次の 3 つの主要なステップに分かれています。
このチュートリアルでは、Snowflake から Parquet 形式で Amazon S3 バケットにデータをエクスポートし、その後 TiDB Cloud Lake にロードする手順を説明します。
始める前に
開始する前に、次の前提条件を満たしていることを確認してください。
- Amazon S3 Bucket: エクスポートしたデータを保存するための S3 バケットと、ファイルをアップロードするために必要な権限が必要です。S3 バケットの作成方法を参照してください。このチュートリアルでは、エクスポートしたデータを stage する場所として
s3://lake-doc/snowflake/を使用します。 - AWS Credentials: S3 バケットにアクセスするための十分な権限を持つ AWS Access Key ID と Secret Access Key が必要です。AWS 認証情報の管理を参照してください。
- IAM ロールとポリシーを管理する権限: Snowflake と Amazon S3 間のアクセスを設定するために必要な IAM ロールとポリシーを作成および管理する権限があることを確認してください。IAM ロールとポリシーについてを参照してください。
ステップ 1: Amazon S3 用の Snowflake Storage Integration を設定する
このステップでは、IAM ロールを使用して Snowflake が Amazon S3 にアクセスできるように設定します。まず IAM ロールを作成し、その後そのロールを使用して、安全なデータアクセスのための Snowflake Storage Integration を確立します。
AWS Management Console にサインインし、IAM > Policies で次の JSON コードを使ってポリシーを作成します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource": "arn:aws:s3:::lake-doc/snowflake/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket", "s3:GetBucketLocation"], "Resource": "arn:aws:s3:::lake-doc", "Condition": { "StringLike": { "s3:prefix": ["snowflake/*"] } } } ] }このポリシーは、
lake-docという名前の S3 バケットと、そのバケット内のsnowflakeフォルダに対して適用されます。s3:PutObject,s3:GetObject,s3:GetObjectVersion,s3:DeleteObject,s3:DeleteObjectVersion: snowflake フォルダ内のオブジェクト(例:s3://lake-doc/snowflake/)に対する操作を許可します。このフォルダ内でオブジェクトのアップロード、読み取り、削除ができます。s3:ListBucket,s3:GetBucketLocation:lake-docバケットの内容一覧の取得と、そのロケーションの取得を許可します。Condition要素により、一覧取得はsnowflakeフォルダ内のオブジェクトに制限されます。
IAM > Roles で
lake-doc-roleという名前のロールを作成し、先ほど作成したポリシーをアタッチします。- ロール作成の最初のステップで、Trusted entity type に AWS account、An AWS account に This account (xxxxx) を選択します。
- ロールの作成後、ロール ARN をコピーして安全な場所に保存します。例:
arn:aws:iam::123456789012:role/lake-doc-role - Snowflake アカウントの IAM ユーザー ARN を取得した後で、このロールの Trust Relationships を更新します。
Snowflake で SQL worksheet を開き、ロール ARN を使用して
my_s3_integrationという名前の storage integration を作成します。CREATE OR REPLACE STORAGE INTEGRATION my_s3_integration TYPE = EXTERNAL_STAGE STORAGE_PROVIDER = 'S3' STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/lake-doc-role' STORAGE_ALLOWED_LOCATIONS = ('s3://lake-doc/snowflake/') ENABLED = TRUE;storage integration の詳細を表示し、結果内の
STORAGE_AWS_IAM_USER_ARNプロパティの値を取得します。例:arn:aws:iam::123456789012:user/example。この値は、次のステップでロールlake-doc-roleの Trust Relationships を更新するために使用します。DESCRIBE INTEGRATION my_s3_integration;AWS Management Console に戻り、ロール
lake-doc-roleを開いて Trust relationships > Edit trust policy に移動します。次のコードをエディタにコピーします。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/example" }, "Action": "sts:AssumeRole" } ] }arn:aws:iam::123456789012:user/exampleという ARN は、前のステップで取得した Snowflake アカウントの IAM ユーザー ARN です。
ステップ 2: Amazon S3 へのデータの準備とエクスポート
Snowflake で、Snowflake storage integration
my_s3_integrationを使用して外部 stage を作成します。CREATE OR REPLACE STAGE my_external_stage URL = 's3://lake-doc/snowflake/' STORAGE_INTEGRATION = my_s3_integration FILE_FORMAT = (TYPE = 'PARQUET');URL = 's3://lake-doc/snowflake/'は、データを stage する S3 バケットとフォルダを指定します。パスs3://lake-doc/snowflake/は、S3 バケットlake-docと、そのバケット内のsnowflakeフォルダに対応します。エクスポートするデータを準備します。
CREATE DATABASE doc; USE DATABASE doc; CREATE TABLE my_table ( id INT, name STRING, age INT ); INSERT INTO my_table (id, name, age) VALUES (1, 'Alice', 30), (2, 'Bob', 25), (3, 'Charlie', 35);COPY INTOを使用して、テーブルデータを外部 stage にエクスポートします。COPY INTO @my_external_stage/my_table_data_ FROM my_table FILE_FORMAT = (TYPE = 'PARQUET') HEADER=true;lake-docバケットを開くと、snowflakeフォルダ内に Parquet ファイルが表示されます。
ステップ 3: TiDB Cloud Lake へのデータのロード (load)
TiDB Cloud Lake にターゲットテーブルを作成します。
CREATE DATABASE doc; USE DATABASE doc; CREATE TABLE my_target_table ( id INT, name STRING, age INT );COPY INTO を使用して、バケット内のエクスポート済みデータをロードします。
COPY INTO my_target_table FROM 's3://lake-doc/snowflake' CONNECTION = ( ACCESS_KEY_ID = '<your-access-key-id>', SECRET_ACCESS_KEY = '<your-secret-access-key>' ) PATTERN = '.*[.]parquet' FILE_FORMAT = ( TYPE = 'PARQUET' );ロードしたデータを確認します。
SELECT * FROM my_target_table;
┌──────────────────────────────────────────────────────┐
│ id │ name │ age │
├─────────────────┼──────────────────┼─────────────────┤
│ 1 │ Alice │ 30 │
│ 2 │ Bob │ 25 │
│ 3 │ Charlie │ 35 │
└──────────────────────────────────────────────────────┘

