Amazon AppFlow を用いて Amazon S3 バケット上の CSV/JSON の中身をTiDB Serverlessに書き込む
PingCapがTiDB とAmazon AppFlowを統合して様々なデータソースと連携し、その中身をバッチでTiDBに書き込むサンプルを提供してくれています。
上記ドキュンメント上はデータソースにSalesforceをもちいていますが、ちょっとしたお勉強目的でSalesforceアカウントを準備するのはなかなか大変です。ということで少し改造しAmazon S3の中に格納されているCSV/JSONファイルの中身をTiDBに書き込む手順を纏めます。
1. 環境整備
AWS CloudShellを使います
PingCapがTiDBへデータを書き込むためのAppFlowと連携する専用のLambda関数をJavaで提供してくれているため、mvn
をインストールします。
sudo yum update -y
sudo yum install maven -y
つぎにGitから提供されているサンプルレポジトリをクローンします。
git clone https://github.com/pingcap-inc/tidb-appflow-integration
2. AWS SAM/CloudFormationを使ってLambda 関数のアップロード
cd tidb-appflow-integration
mvn clean package
BUILD SUCCESS
と表示されれば次に進みます。target
フォルダの中にtest-appflow-and-tidb-1.0.jar
というLambda関数用パッケージが出来ていますのでこれをアップロードします。
sam deploy --guided
y/n
で聞かれるものには全てy
、入力を求められるものには全てそのままEnterでデフォルトで作業を進めます。
2つのCloudFormationスタックが作成されるので完成まで待ちます。
完成するとLambda関数が一つ作成されています。
この関数がAppFlowと連携してデータをTiDBに書き込みます。
3. Amazon S3 バケットの設定とCSVファイルのアップロード
このシナリオではCSVを使ってみます。
Column1,Column2
Row1-Col1,Row1-Col2
Row2-Col1,Row2-Col2
Row3-Col1,Row3-Col2
Row4-Col1,Row4-Col2
このCSVファイルを適当な名前で作成し保存します。
次にこれを適当なS3バケットのappflow
フォルダに保存します。拡張子は.csv
にしておきます。AppFlowはバケット直下のファイルは指定できないようです。
4. データ書き込み用テーブルをTiDBで作成
USE test;
CREATE TABLE appflow (
column1 VARCHAR(255) NOT NULL,
column2 VARCHAR(255) NOT NULL
);
5. AppFlow の設定
コネクタの登録
まずはデータターゲットとなるTiDBをコネクタとして登録します。実際はLambda関数経由での書き込みとなるため、登録すべきはLambda関数です。新しいコネクタを登録
をクリックします。
先ほど作成されたLambda関数を選択して登録
をクリックします。
接続の作成
次に先ほどテーブルを作成したTiDB上のデータベースへの接続を登録します。TiDBはMySQL互換ですので、MySQLドライバーを用います。接続を作成
をクリックします。
必要なパラメータを入力して接続する
をクリックします。TLSの使用は必須です。
フローの作成
先ほど作成したコネクタと接続を使用してTiDBのテーブルとの連携がセットできていますので、Amazon S3からデータを流すフローを作成します。
フローを作成
をクリックします。
適当な名前を入力して次へ
をクリックします。送信もとにCSVが保存されているS3バケットを選択し、CSVが格納されているフォルダを指定します。前述の通りバケット直下は指定不可ですので気を付けてください。
コネクタ
と接続
を指定します。
ここまでの設定があっていればオブジェクトのドロップダウンにTiDBのテーブルが表示されますので先ほど作成したappflow
を指定します。あとはデフォルトのまま次へ
をクリックします。
S3バケット内のCSVのカラムを認識していますのでそれを書き込むTiDBテーブルのカラムにマッピングします。(マッピングフィールドボタンを押すと登録されます)
次へ
を2回押してフローを作成
をクリックするとフローが作成されます。
実行
では作成されたフローを実行します。
データが問題なく書き込まれています。
Discussion