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