DMS#AWS大高大輔2021.11.17この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。サービスソリューション部の大高です。外部データベースからSnowflakeへのデータ連携方法として、世の中には様々な便利なプロダクトがあると思います。これらのプロダクトはとてもユーザーフレンドリーで管理もしやすいので、個人的にはプロダクトの利用をオススメしたいです。一方で、「リアルタイム連携がしたい」、「細かいカスタマイズがしたい」、「コストを抑えたい」というケースなどでプロダクトの利用がフィットしない場合があり、その場合にはプロダクトに代わる方法を自ら実装する必要が出てくる場合もあります。今回はそういった、自ら実装するケースにおいて「外部データベースからSnowflakeへのリアルタイム連携」で良い方法がないかな?と調べている中で、Onishiさんの書かれている、こちらの記事のような方法があることを知りました。今回はこちらで紹介されている連携方法のうち、下記の図のように「S3」から「Snowflake」へ連携する箇所を実際に試してみたいと思います。「Aurora」から「S3」へ連携する箇所については、下記エントリもご参照ください。DMSがファイル出力するS3バケットのパスについては、事前にストレージ統合や外部ステージの設定を済ませています。DMSからS3への連携については取り上げません。DMSから出力されるファイルは、AWSのドキュメントに記載されている通り以下のようなcsvファイルが継続的に連携されるものとしました。AngelesU,101,Smith,Bob,13-Mar-17,DallasD,101,Smith,Bob,13-Mar-17,Dallasここをcsvなどにして、Snowflake側のテーブル定義もカチッとした定義にするかどうかは要件に応じて変わると思います。Aurora側のテーブル定義が変更されたときに、パイプラインで「エラーを起こさせないようにしたい」のか、それとも「エラーにしたいのか」のかなど、要件に応じて変わると思います。今回はお試しなのでcsvでいきます!S3からSnowflakeへの連携概要では、実際にS3からSnowflakeへの連携をどうするかを考えたいと思います。今回は、基本的に以下のエントリで紹介した流れを踏襲してみます。一方で、「Task」については少し検討が必要です。DMSが出力するファイルにI、U、DというDML操作に応じたフラグが存在します。このフラグに応じてDML操作を変えたいので、TaskのクエリについてはこのDMLフラグを見て処理を変える必要がありますね。実装してみるでは、実際に実装してみましょう。テーブルとStreamの作成まずは、Snowpipeのデータを受けるテーブルと、そのStream、また、最終的にデータをロードするテーブルを作成します。ootaka_sandbox_db.public.cdc_users_pipe;初期データのロード次に初期データのロードをします。DMSはフルロードでAuroraからのデータをS3に出力するとLOAD00000001.csvというようなファイルを出力します。このファイルのデータには標準ではDMLフラグは含まれずに、以下のような形式となります。100,Raiden,Jack,4-Jul-76,Philadelphiaそのため、このファイルは対象テーブルへ直接ロードする必要があるので、以下のようなクエリでロードする必要があります。'CSV');なお、今回ここでは取り上げませんが、DMSのS3に対するエンドポイント設定において、IncludeOpForFullLoadオプションを有効にすることでによってDMLフラグも出力されるようになり、上記の対応については不要になる認識です。次にSnowpipeを作成します。これによりS3上に配置したファイルのデータは、自動的にcdc_users_pipe、および、そのストリームcdc_users_streamに反映されるようになりました。最後にTaskの作成です。DMSが出力したファイルのDMLフラグI(INSERT)、U(UPDATE)、D(DELETE)に応じた処理の振り分けをしています。idカラムが主キーになっているので、このキーとDMLフラグを組み合わせて判断をおこなっています。RESUME;今回はMERGE文としていますが、他にも色々やり方はあるかと思います。これでTASKも出来たので、STREAMにデータがきたら自動で対象テーブルcdc_usersにデータがロードされるようになりました。当エントリでは、「S3」から「Snowflake」へ連携する箇所だけを対象とするので、DMSは動かしません。以下の3ファイルを用意して、想定される動作がされるかだけを確認します。それぞれのファイルをS3バケット配置したあとのcdc_usersテーブルを見てみます。DMSから出力されたファイルをSnowflakeにロードしてみました。DMSを利用した一連の流れでの連携も試してみたのですが、結果としてはわりと良い感じに動いたかとおもいます!一方で以下のような課題も感じられました。このあたりは要件に応じた設計が必要となると思いますので、適宜よく検討して課題を解決していく必要がありそうです。想定外のファイルがS3上に配置された場合に、どのようにSnowflake側のデータをリカバリするのかどなたかのお役に立てば幸いです。