VPC Lambdaを使ってみた

VPC Lambdaを使ってみた

この記事は?

先日、社内の業務を自動化するために、lambdaを用いてバッチを作成していました。 要件を実現するために、lambdaをVPCに設置することになったため、 その時に考えたことをこちらにアウトプットしたいと思います。

要件

大まかに、 以下の3つがバッチで実現したいことになります。

  • slackのAPIを使ってデータを取得する
  • 取得したデータをEC2で動くSQLserverにデータをinsertする
  • 月に1回、月初に実行する
image

問題点

lambdaは、以下のキャプチャのように、 VPCに設置するかどうかを選ぶことができます。

作成時に設定

image

作成後に設定

image

VPC内に設置することで、VPC内のリソースにアクセスできるようになります。 したがって、今回の要件を満たすためには、 VPC内へのlambdaの設置はマストになってくると考えました。

ただ、ここで1つの問題が発生します。 VPC内にlambdaを設置する際には、private subnetを指定しなければなりません。 すなわち、VPC内に設置したlambdaは、 基本的にはインターネットへの通信を行うことができない状態になってしまします。

🤔
このままではslackのapiを叩くことができません、、、

解決策

案1

private subnetにlambda、 public subnetにNATゲートウェイを設置する。

メリット

1つのlambdaを作成することで、要件を達成できる

デメリット

NATゲートウェイの料金がかかる

image
そのトラフィック、NATゲートウェイを通す必要ありますか?適切な経路で不要なデータ処理料金は削減しましょう | DevelopersIO

コスト最適化のご相談をいただくなかで、NAT Gateway に不要なコストが掛かっているパターンが多くみられます。また、そのような環境に限って NAT Gateway にかなりのコストが掛かっていることを把握されていない ケースも少なくありません。 今回は見落としがちな NAT Gateway で無駄なコストが発生してしまうケース、何処へのアクセスで NAT Gateway を浪費してるかを確認する方法、そしてどのような改善パターンがあるかをご紹介します。 (本記事中で記載の価格はいずれも、執筆時点の東京リージョン価格を参考にしています) たとえば以下のような構成です。 パブリックアクセスのフロントに ALB を配置しているので、EC2 はプライベートサブネットに配置 プライベートサブネットからインターネットへのアクセスに NAT Gateway を配置 ダウンロードやアップロード AWS リソースのエンドポイントや、非 AWS リソースへアクセス NAT Gateway 起動料金 $0.062/h NAT データ転送料金 $0.062/GB AWS といえばデータインに関しては料金がかからない印象がありますが、NAT Gateway のデータ転送料金はイン/アウトに関わらず発生します EC2 からインターネット $0.114/GB 主に非 AWS リソースへのデータ転送料金に掛かります 多くのAWSサービスで同一AZ間、同一リージョン間の通信は無料です AZ 間のデータ転送料金 $0.01/GB

そのトラフィック、NATゲートウェイを通す必要ありますか?適切な経路で不要なデータ処理料金は削減しましょう | DevelopersIO
⚠️
NATゲートウェイにかかる料金は、以下の通りになります。

時間単位料金以外は微々たるものにしかならなさそうなので、 時間単位料金のみを計算すると、

0.062 USD / h × 24 h × 30 days = 44.64 USD

1月あたり約5500円!!!!(@2022/03/30 10:30 (GMT+9) 現在) 月に1度しか動かないバッチに対して、これはさすがに料金が高すぎます、、、

そこで発見したのが以下の方法になります。

案2

VPC外に設置したlambdaで、 slackからデータを取得し、 S3に保存する

VPC内に設置したlambdaで、 S3から取得したデータを、 EC2のSQL Serverにinsertする

メリット

NATゲートウェイが不要

デメリット

lambdaを2つと、 s3を作成する必要がある

image
🤔
この方法でも、 結局はVPC内のlambdaから、 VPCの外にあるS3へアクセスするために、 NATゲートウェイが必要になるのでは、、、?
💡
VPCエンドポイントを用いれば、 この問題を解決することができます!
VPC エンドポイント

VPC エンドポイントを使用すると、Virtual Private Cloud (VPC) とサポートされているサービスの間の接続が有効になります。インターネットゲートウェイ、NAT デバイス、VPN 接続、および AWS Direct Connect 接続は必要ありません。したがって、ユーザーが VPC から到達可能な特定の API エンドポイント、サイト、およびサービスを制御することになります。 VPC エンドポイントは仮想デバイスです。これらは水平にスケールされ、冗長で、可用性の高い VPC コンポーネントです。VPC エンドポイントのさまざまなタイプを次に示します。サポートされるサービスにより要求される VPC エンドポイントを作成します。 インターフェイスエンドポイント インターフェイスエンドポイントは、サブネットの IP アドレス範囲のプライベート IP アドレスを持つ Elastic Network Interface です。これは、AWS 所有、または AWS 顧客またはパートナーが所有するサービス宛てのトラフィックのエントリポイントとして機能します。AWS PrivateLink と統合される AWS サービスのリストについては、 AWS PrivateLink と統合できる AWS のサービス を参照してください。 時間単位の使用料金とデータ処理料金が課金されます。詳細については、「 インターフェイスエンドポイントの料金 」を参照してください。 Gateway

💡
案2ならばコストも許容範囲内なので、 こちらの方法を採用することにしました!!

考えたこと

  • awsの各リソースが、どこに設置されるものなのかを意識することが重要だと感じた。
  • private subnet内で常にインターネットと通信を行う必要がある、 すなわち、常にNATゲートウェイを立てておく必要のあるサービスの1部として、 今回のような要件を満たすlambdaを作成する場合は、 VPC lambda × NATゲートウェイの構成でも良いと思いました。
  • 🤔
    NATゲートウェイって高いんですね、、、

最後に

結果的にこちらの構成で、バッチを作成していくことになりました。 技術の指定は特になかったため、勉強中の以下の技術を使って実装を行いました!

  • Golang
  • terraform

これらの技術を使った感想や、考えたことなども、追々記事にできたらと考えています🤔