既存システムの様々な場所に散在したデータを、Snowflakeへ格納したいという要望は多いと思います。また、企業が保持するデータは機密性が高いため、アクセス制限をかけたSFTPサーバーに保存されることも多いのではないかと思います。
そこで、この記事ではAWSLambdaを用いて、SnowflakeとSFTPサーバーの日次連携処理を、サクッと実装する例をご紹介いたします。
今回実装するシステムの要件概要を以下に示します。
SnowflakeとSFTPサーバーの連携は、troccoやFivetranなどのデータ収集SaaSで簡単に実現できるとは思いますが、IPホワイトリスト制限がかかっていたり認証方式が指定されている場合などは、自前で実装してしまった方が早いこともあるのではないかと思います。
実装するシステムの構成と、処理フローを以下に示します。
実装するでいくつかポイントとなりそうな点をまとめていきます。
AWS Lambdaはデフォルトだと動的なパブリックIPが付与されます。これだと、IPホワイトリスト制限に対処不可能です。 IPアドレスを固定して、Lambdaから外部サービスにアクセスしたい場合は、以下の構成で解決します。
ポイントは以下3点です。
NAT Gatewayを作成するときに、Elatic IPを割り当てます。所属するサブネットは事前に作成したパブリックサブネットです。
Lambdaを作成する際に、VPCオプションを有効にして、事前に作成したプライベートサブネットに所属させます。
Lambdaに付与するロールには、AWSLambdaENIManagementAccess, AWSLambdaVPCAccessExecutionRoleを付与します。
今回は、pythonで「paramiko」というライブラリを利用しました。 Lambdaで外部ライブラリを利用する場合、パッケージとしてビルドすることも可能ですが、今回は「Layer」を利用しました。
レイヤーの作成方法の詳細は、こちらの公式を参照ください。
LambdaでSFTPサーバーからファイルを取得して、S3にPUTするサンプルコードを示します。 認証に利用する秘密鍵はAWS SecretManagerに保存してある前提です。
※AWS SecretManagerでは改行がスペースに変換されるため、その逆変換処理が入ってます
いかがでしたでしょうか。簡単な例ではありますが、SFTPサーバーとSnowflakeを連携する方法をご紹介しました。Snowpipeを利用するとLambdaでS3にファイルを置くだけで、簡単にSnowflakeとデータ連携ができますね。