Snowflake Knowledge - INSIGHT LAB

AWS Lambdaを使ってSnowflakeとSFTPサーバーを連携してみた

作成者: Osyou|2022年10月04日

概要

既存システムの様々な場所に散在したデータを、Snowflakeへ格納したいという要望は多いと思います。また、企業が保持するデータは機密性が高いため、アクセス制限をかけたSFTPサーバーに保存されることも多いのではないかと思います。

そこで、この記事ではAWSLambdaを用いて、SnowflakeとSFTPサーバーの日次連携処理を、サクッと実装する例をご紹介いたします。

 

要件概要

今回実装するシステムの要件概要を以下に示します。

  • SFTPサーバー上に1日1回出力されるファイルをSnowflakeへ連携する
  • SFTPサーバーのアクセスには、IPホワイトリスト制限がかかっている
  • SFTPサーバーの認証方式は、公開鍵認証方式を用いる

SnowflakeとSFTPサーバーの連携は、troccoやFivetranなどのデータ収集SaaSで簡単に実現できるとは思いますが、IPホワイトリスト制限がかかっていたり認証方式が指定されている場合などは、自前で実装してしまった方が早いこともあるのではないかと思います。

 

システム構成と処理フロー

実装するシステムの構成と、処理フローを以下に示します。

 

  1. Amazon Event Bridgeから定周期でAWS Lambdaを起動します
  1. Lambda内でSFTPサーバーからファイルをGetします
  1. GetしたファイルをAmazon S3にPutします
  1. SnowpipeでAmazon S3とSnowflakeを連携します
  2.  

実装のポイント

実装するでいくつかポイントとなりそうな点をまとめていきます。

ポイント1:AWS LambdaのIPアドレス固定

AWS Lambdaはデフォルトだと動的なパブリックIPが付与されます。これだと、IPホワイトリスト制限に対処不可能です。 IPアドレスを固定して、Lambdaから外部サービスにアクセスしたい場合は、以下の構成で解決します。

  • NATGatewayにElastic IPを付与
  • LambdaからはNATGatewayを経由してアクセス

ポイントは以下3点です。

  1. NAT GatewayにElastic IP を割り当てる

    NAT Gatewayを作成するときに、Elatic IPを割り当てます。所属するサブネットは事前に作成したパブリックサブネットです。

  1. LambdaをVPCに所属させる

    Lambdaを作成する際に、VPCオプションを有効にして、事前に作成したプライベートサブネットに所属させます。

  1. 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とデータ連携ができますね。