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は以下の仕組みでプライベートネットワークアクセスを可能にします。
-
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内のリソースに通信します。
-
セキュリティグループの適用:
- Lambda関数に割り当てるセキュリティグループは、このHyperplane ENIに適用されます。これにより、関数がVPC内のどのリソース(どのポート、どのIPアドレス範囲)と通信できるかを制御できます。
-
ルーティングの仕組み:
- 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への接続
-
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アドレスなど)にトラフィックを転送します。
-
プライベート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とポート)に絞るべきです。
- タイプ:
- SG名:
5.1. Lambda関数の作成
- AWSマネジメントコンソールで「Lambda」サービスを開きます。
- 「関数の作成」ボタンをクリックします。
- 一から作成を選択します。
-
関数名:
my-vpc-lambda-function
-
ランタイム:
Python 3.9
(または任意のランタイム) -
アーキテクチャ:
x86_64
(デフォルト) -
実行ロール:
- 「基本的な Lambda アクセス許可で新しいロールを作成する」を選択します。(これによりCloudWatch Logsへの書き込み権限が与えられます)
- ポイント: 後でVPCアクセスに必要な権限を追加します。
- 「関数の作成」をクリックします。
5.2. Lambda関数をVPCに設定
- 作成したLambda関数 (
my-vpc-lambda-function
) の詳細ページを開きます。 - 「設定」タブをクリックし、左側ナビゲーションから「VPC」を選択します。
- 「VPC を有効化」セクションで、「編集」ボタンをクリックします。
-
VPC: あなたのVPC (
my-vpc
など) を選択します。 -
サブネット: プライベートサブネットを複数選択します。(例:
my-private-subnet-a
,my-private-subnet-c
) -
セキュリティグループ: 先ほど作成したセキュリティグループ (
lambda-vpc-access-sg
) を選択します。 - 「保存」をクリックします。
保存後、Lambda関数は指定されたサブネット内にHyperplane ENIをプロビジョニングし始めます。これには数分かかる場合があります。
5.3. IAMロールへのVPCアクセス権限の追加
Lambda関数がVPCに接続するためには、実行ロールに追加のIAM権限が必要です。
- Lambda関数の「設定」タブに戻り、左側ナビゲーションから「アクセス権限」を選択します。
- 「実行ロール」のロール名をクリックして、IAMコンソールでそのロールのページを開きます。
- 「許可ポリシーの追加」または「ポリシーをアタッチ」をクリックします。
- 検索ボックスで
AWSLambdaVPCAccessExecutionRole
を検索し、このポリシーを選択してアタッチします。-
ポイント: このポリシーには、LambdaがENIを作成・管理するために必要な
ec2:CreateNetworkInterface
,ec2:DescribeNetworkInterfaces
,ec2:DeleteNetworkInterface
などの権限が含まれています。
-
ポイント: このポリシーには、LambdaがENIを作成・管理するために必要な
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連携は少し複雑ですが、理解すると強力なツールになりますね!ぜひ「いいね」👍で教えてください!