1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

実践!AWSネットワーク構築・運用30日チャレンジ: Day 25

Posted at

Day 25: サーバーレスネットワーク(Lambda/API Gateway):イベント駆動型アーキテクチャの裏側

皆さん、こんにちは!「実践!AWSネットワーク構築・運用30日チャレンジ」のDay 25へようこそ!

昨日はコンテナとマイクロサービス時代のネットワークとして、Amazon ECSとAmazon EKSにおけるネットワークの概念を深く掘り下げました。コンテナがVPC内でどのように振る舞い、連携するのか、その重要性を理解できたことと思います。

今日のテーマは、これとは異なるアプローチである「サーバーレス」です。特に、AWSの主要なサーバーレスサービスである「AWS Lambda」と「Amazon API Gateway」が、VPC内のリソースとどのように連携し、そのネットワークがどのように機能するのかを見ていきます。イベント駆動型アーキテクチャの裏側にあるネットワークの仕組みを理解することで、サーバーレスアプリケーションの設計とデプロイにおける、新たな視点が得られるでしょう。

1. サーバーレスとは?従来のアーキテクチャとの違い

「サーバーレス」とは、開発者がサーバーのプロビジョニング、スケーリング、管理を行う必要なく、コードを実行できるコンピューティングモデルです。AWS Lambdaはその代表的なサービスです。

従来のEC2インスタンスやコンテナベースのアプリケーションでは、常に稼働しているサーバーやコンテナが存在し、そこにネットワークインターフェースが割り当てられ、VPC内でIPアドレスを持ちます。しかし、サーバーレスの性質上、以下の点がネットワーク設計において異なります。

  • イベント駆動: Lambda関数は、HTTPリクエスト、S3イベント、DynamoDBストリームなど、特定のイベントがトリガーとなってコードが実行されます。
  • オンデマンドな実行: コードが必要なときにのみ実行され、実行が終了するとリソースが解放されます。常に稼働している状態ではありません。
  • 自動スケーリング: イベントの量に応じて自動的にスケールアウト/インし、開発者がスケーリングを管理する必要はありません。

これらの特性により、「サーバーがないのにどうやってVPC内のデータベースやサービスにアクセスするのか?」という疑問が生じます。

2. AWS Lambdaのネットワーク

AWS Lambda関数は、デフォルトではAWSの内部ネットワーク上で実行され、インターネット経由で他のAWSサービス(S3、DynamoDBなど)やパブリックなインターネットリソースにアクセスできます。

しかし、もしLambda関数がVPC内のプライベートなリソース(例: RDSデータベース、ElastiCacheクラスター、プライベートサブネットのEC2インスタンス、PrivateLinkエンドポイント経由のサービス)にアクセスする必要がある場合、Lambda関数をVPC内で実行するように設定する必要があります。

Lambda関数をVPC内で実行する仕組み

Lambda関数をVPC内に設定すると、AWSは以下の仕組みでプライベートネットワークアクセスを可能にします。

  1. Elastic Network Interface (ENI) のプロビジョニング:
    • Lambda関数が初めて呼び出されたとき、AWSは関数の実行環境のために、指定されたVPCのサブネットにHyperplane ENI (Elastic Network Interface) と呼ばれる特別なENIをプロビジョニングします。
    • このENIは、選択されたサブネットのプライベートIPアドレスを取得し、関数がVPC内のリソースにアクセスするためのプライベート接続を提供します。
    • Lambda関数がスケールアウトすると、必要に応じて追加のHyperplane ENIがプロビジョニングされます。
    • ポイント: このENIは、あなたのVPC内の通常のENIとは異なり、Lambdaサービスが管理する特別なENIです。Lambdaの実行環境は、このENIを介してVPC内のリソースに通信します。
  2. セキュリティグループの適用:
    • Lambda関数に割り当てるセキュリティグループは、このHyperplane ENIに適用されます。これにより、関数がVPC内のどのリソース(どのポート、どのIPアドレス範囲)と通信できるかを制御できます。
  3. ルーティングの仕組み:
    • Lambda関数がVPC内のリソースにアクセスする場合、VPCのルーティングテーブルが適用されます。
    • 関数がインターネットにアクセスする必要がある場合(例: 外部APIへの接続)、プライベートサブネットからインターネットにアクセスするためにはNAT Gatewayが必要です。VPCエンドポイント(インターフェースタイプ)を介してAWSサービスにアクセスする場合は、インターネットアクセスは不要です。

LambdaをVPC内で実行する際の考慮事項

  • ENIのプロビジョニング時間: 初めて関数が呼び出された際や、スケールアウト時、ENIのプロビジョニングに時間がかかることがあり、コールドスタートのレイテンシに影響を与える可能性があります。
  • サブネットのIPアドレス枯渇: 大量のLambda関数や、頻繁なスケールアウトが発生する場合、指定したサブネットのIPアドレスが枯渇する可能性があります。十分なサイズのサブネットを用意するか、複数のサブネットを利用する、またはAWS IPAMを検討する必要があります。
  • セキュリティグループの設計: 最小権限の原則に基づき、必要な通信のみを許可するセキュリティグループを設定することが重要です。
  • インターネットアクセス: VPC内のリソースと通信しつつインターネットにもアクセスする必要がある場合、NAT Gatewayが必要です。コストとIPアドレス枯渇のリスクを考慮する必要があります。

3. Amazon API Gatewayのネットワーク

Amazon API Gateway は、開発者がAPIを簡単に作成、公開、保守、監視、保護できるフルマネージドサービスです。API Gatewayは、HTTPエンドポイント、Lambda関数、その他のAWSサービスへのリクエストをルーティングするフロントエンドとして機能します。

API Gateway自体はVPCの外部に存在しますが、API GatewayからVPC内のプライベートなリソースにアクセスするための仕組みが提供されています。

API GatewayからVPCへの接続

  1. VPC リンク (VPC Link):

    • API Gateway (REST API/HTTP API) からVPC内のNetwork Load Balancer (NLB) にプライベートに接続するためのメカニズムです。
    • API Gatewayはインターネット経由でアクセスされますが、その後のバックエンドへの通信(NLB経由)はインターネットを経由せず、AWSのプライベートネットワーク内で完結します。
    • ユースケース: VPC内のプライベートなEC2インスタンス、ECSコンテナ、EKS PodなどにデプロイされたAPIやマイクロサービスをAPI Gateway経由で公開したい場合。
    • 仕組み: API GatewayからVPC Linkを介してNLBに接続し、NLBがVPC内のターゲット(EC2、ENI、IPアドレスなど)にトラフィックを転送します。
  2. プライベートAPIエンドポイント:

    • API Gatewayの特定のAPIをVPC内からのみアクセス可能にするための機能です。API Gateway自体にVPCエンドポイントポリシーを適用し、指定されたVPCやVPCエンドポイントからのみアクセスを許可します。
    • これにより、インターネットゲートウェイを介さずに、VPC内のリソース(例: 他のLambda関数、EC2インスタンス)からAPI Gatewayにアクセスできるようになります。
    • ユースケース: 内部向けのAPI、またはPrivateLink経由で他のVPCやオンプレミスからアクセスされるAPI。

API GatewayとLambdaの連携

API Gatewayの最も一般的なバックエンド統合はLambda関数です。

  • Lambdaプロキシ統合: API Gatewayが受け取ったHTTPリクエストをLambda関数にそのまま渡し、Lambda関数のレスポンスをそのままAPI Gatewayがクライアントに返すシンプルな統合。
  • Lambda非プロキシ統合: API GatewayがリクエストをJSON形式にマッピングしてLambda関数に渡し、Lambda関数のレスポンスをAPI Gatewayが変換してクライアントに返す柔軟な統合。

API GatewayからLambda関数への通信は、Lambda関数がVPC内に設定されていても通常はAWSの内部ネットワークを経由して行われ、特別なVPC Linkは不要です。Lambda関数がVPC内のリソースにアクセスする必要がある場合にのみ、Lambda関数をVPCに設定します。

4. サーバーレスネットワークのベストプラクティス

  • VPCアクセスは必要な場合のみ: Lambda関数をVPC内で実行することは、ENIのプロビジョニング時間やIPアドレスの枯渇などの考慮事項を伴います。VPC内のプライベートリソースにアクセスする必要がある場合のみVPC内での実行を設定しましょう。S3やDynamoDBのようなパブリックエンドポイントを持つAWSサービスにアクセスするだけであれば、VPC外のデフォルト環境で十分です(PrivateLinkエンドポイント経由の場合はVPC内設定が必要)。
  • 適切なサブネットとセキュリティグループ: Lambda関数がVPC内のプライベートリソースにアクセスできるよう、適切なプライベートサブネットを選択し、最小権限のセキュリティグループルールを設定します。
  • NAT Gatewayの理解: Lambda関数がVPC内のプライベートリソースにアクセスしつつ、さらにインターネット上のAPIなどにアクセスする必要がある場合は、NAT Gatewayが必要であることを理解し、コストとIPアドレス管理を考慮します。
  • API GatewayのVPC Linkの活用: VPC内のプライベートなAPIやマイクロサービスをインターネットに公開する場合、VPC Linkを通じてNLBを利用し、セキュリティを強化します。
  • Private APIエンドポイントの利用: 内部向けのAPI Gatewayは、プライベートAPIエンドポイントとして設定し、インターネットからのアクセスを制限します。

5. Lambda関数のVPC内デプロイ実践

ここでは、シンプルなLambda関数を作成し、VPC内にデプロイして、そのネットワーク設定を確認してみましょう。このLambda関数は、VPC内のEC2インスタンス(または将来的にRDSなど)にアクセスすることを想定しています。

事前準備:

  • Day 9で作成したVPC (my-vpc) とそのプライベートサブネット (my-private-subnet-a, my-private-subnet-c) が存在することを確認してください。
  • 新しいセキュリティグループを作成します。
    • SG名: lambda-vpc-access-sg
    • 説明: Allow outbound traffic from Lambda to VPC resources
    • インバウンドルール: なし(Lambda関数は通常、他のリソースから直接インバウンド接続を受けることはありません)
    • アウトバウンドルール:
      • タイプ: すべてのトラフィック
      • 宛先: あなたのVPCのCIDR (10.0.0.0/16 など)
      • ポイント: ここでVPC内の通信を許可します。より厳密にするなら、アクセス対象のリソース(例: RDSのIPとポート)に絞るべきです。

5.1. Lambda関数の作成

  1. AWSマネジメントコンソールで「Lambda」サービスを開きます。
  2. 関数の作成」ボタンをクリックします。
  3. 一から作成を選択します。
  4. 関数名: my-vpc-lambda-function
  5. ランタイム: Python 3.9 (または任意のランタイム)
  6. アーキテクチャ: x86_64 (デフォルト)
  7. 実行ロール:
    • 基本的な Lambda アクセス許可で新しいロールを作成する」を選択します。(これによりCloudWatch Logsへの書き込み権限が与えられます)
    • ポイント: 後でVPCアクセスに必要な権限を追加します。
  8. 関数の作成」をクリックします。

5.2. Lambda関数をVPCに設定

  1. 作成したLambda関数 (my-vpc-lambda-function) の詳細ページを開きます。
  2. 設定」タブをクリックし、左側ナビゲーションから「VPC」を選択します。
  3. VPC を有効化」セクションで、「編集」ボタンをクリックします。
  4. VPC: あなたのVPC (my-vpc など) を選択します。
  5. サブネット: プライベートサブネットを複数選択します。(例: my-private-subnet-a, my-private-subnet-c
  6. セキュリティグループ: 先ほど作成したセキュリティグループ (lambda-vpc-access-sg) を選択します。
  7. 保存」をクリックします。

保存後、Lambda関数は指定されたサブネット内にHyperplane ENIをプロビジョニングし始めます。これには数分かかる場合があります。

5.3. IAMロールへのVPCアクセス権限の追加

Lambda関数がVPCに接続するためには、実行ロールに追加のIAM権限が必要です。

  1. Lambda関数の「設定」タブに戻り、左側ナビゲーションから「アクセス権限」を選択します。
  2. 実行ロール」のロール名をクリックして、IAMコンソールでそのロールのページを開きます。
  3. 許可ポリシーの追加」または「ポリシーをアタッチ」をクリックします。
  4. 検索ボックスで AWSLambdaVPCAccessExecutionRole を検索し、このポリシーを選択してアタッチします。
    • ポイント: このポリシーには、LambdaがENIを作成・管理するために必要な ec2:CreateNetworkInterface, ec2:DescribeNetworkInterfaces, ec2:DeleteNetworkInterface などの権限が含まれています。

5.4. テスト (VPC内アクセス確認の概念)

Lambda関数からVPC内のプライベートリソースへのアクセスを実際にテストするには、VPC内にテスト用のEC2インスタンス(またはRDSインスタンス)を用意し、そのインスタンスのプライベートIPアドレスにLambda関数からpingを打ったり、HTTPリクエストを送信するコードを記述する必要があります。

例 (Python Lambdaコード):

import os
import requests

def lambda_handler(event, context):
    # アクセスしたいVPC内リソースのプライベートIPアドレスまたはDNS名
    # 例: EC2インスタンスのプライベートIP
    target_ip = os.environ.get('TARGET_IP', '10.0.1.100')
    
    try:
        # 例: VPC内WebサーバーへのHTTPリクエスト
        response = requests.get(f'http://{target_ip}:80/')
        print(f"Response from {target_ip}: {response.status_code}")
        return {
            'statusCode': 200,
            'body': f"Successfully accessed {target_ip}: {response.status_code}"
        }
    except requests.exceptions.RequestException as e:
        print(f"Error accessing {target_ip}: {e}")
        return {
            'statusCode': 500,
            'body': f"Failed to access {target_ip}: {e}"
        }

このコードをLambda関数にデプロイし、テストイベントで実行してみてください。ターゲットのEC2インスタンスが実行中で、セキュリティグループが許可していることを確認してください。

6. AI時代におけるサーバーレスネットワークの活用シナリオ

AI/MLワークロードは、イベント駆動型であることが多く、サーバーレスアーキテクチャと相性が良いです。サーバーレスネットワークは、特にデータ取り込み、前処理、推論のワークフローでその真価を発揮します。

  • イベント駆動型データ前処理:
    • S3バケットに新しい学習データがアップロードされた際にLambda関数をトリガーし、そのLambda関数がVPC内のプライベートなデータ処理サービス(例: EC2上のSparkクラスター、RDS内のデータウェアハウス)にアクセスしてデータを前処理します。この際、LambdaをVPC内に設定することで、セキュアなプライベート通信を実現します。
  • リアルタイム推論API:
    • API GatewayでHTTP APIエンドポイントを作成し、バックエンドにLambda関数(推論モデルをホスト)を統合します。Lambda関数がVPC内のプライベートなデータストア(例: 特徴量ストアのDynamoDB、キャッシュのElastiCache)にアクセスして推論に必要なデータを取得する場合、LambdaをVPC内にデプロイします。
  • 非同期推論と通知:
    • S3へのファイルアップロード、SQSキューへのメッセージ到着などをトリガーにLambda関数を起動し、推論を実行します。推論結果をVPC内のデータベースに保存したり、VPC内の通知サービスに送信したりする場合、LambdaのVPCアクセスが必須です。
  • 画像/動画処理パイプライン:
    • 新しい画像や動画がS3にアップロードされるとLambda関数がトリガーされ、そのLambda関数がVPC内のプライベートなGPUインスタンス(コンテナ化された処理サービスなど)にアクセスして、画像認識や動画解析などの重い処理をオフロードする、といった連携も可能です(この場合、Lambdaは処理を開始するトリガー役で、実際の処理はVPC内の他のサービスが担当)。
  • PrivateLinkとLambdaの連携:
    • Lambda関数が、PrivateLink経由で公開されているサードパーティのML APIサービスや、別のVPC内のカスタムMLサービスにアクセスする場合、LambdaをVPC内にデプロイし、PrivateLinkのVPCエンドポイント経由で安全に通信します。

本日のまとめと次へのステップ

今日は、サーバーレスの代表格であるLambdaとAPI Gatewayが、VPC内のリソースとどのように連携し、ネットワークを構築するのかを学び、Lambda関数のVPC内デプロイを実践しました。

  • Lambda関数はデフォルトでAWSの内部ネットワークで実行されるが、VPC内のプライベートリソースにアクセスするにはVPC内に設定する必要がある。
  • Lambda関数をVPC内に設定すると、Hyperplane ENIがプロビジョニングされ、VPCのプライベートIPアドレスとセキュリティグループが適用される。
  • API GatewayからVPC内のバックエンドへのプライベート接続にはVPC Link(NLB経由)を利用し、API Gateway自体をプライベートに公開するにはプライベートAPIエンドポイントを利用する。
  • サーバーレスはイベント駆動型であり、そのネットワーク設計は従来のEC2/コンテナとは異なる考慮事項がある。

サーバーレスアーキテクチャは、運用のオーバーヘッドを大幅に削減し、AI/MLワークロードのデプロイを高速化する強力な手段です。その裏側にあるネットワークの仕組みを理解することで、より効率的でセキュアなサーバーレスアプリケーションを設計できるようになります。

明日のDay 26では、「ネットワーク自動化とIaC(Infrastructure as Code)の導入」と題して、これまで手動で行ってきたネットワークリソースの構築を、AWS CloudFormationやTerraformなどのIaCツールを使って自動化する方法について学びます。


今日のサーバーレスネットワークの学習、新しい気づきはありましたか?LambdaのVPC連携は少し複雑ですが、理解すると強力なツールになりますね!ぜひ「いいね」👍で教えてください!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?