前提
【裏技】Lambda の固定IP化にまだ NatGateway 使ってるの? を参考に実施させていただきました。
ありがとうございます!!
はじめに
- 通常、AWS Lambdaの送信元IPアドレスを固定する場合、「LambdaをVPC内に配置し、NAT Gatewayを経由させてElastic IPから通信させる」のがベストプラクティスかと思います
- しかし、NAT Gatewayは維持費だけで月額約4,500円〜($0.045/時間)かかります
- 今回は、NAT Gatewayを一切使わず、Elastic IPのコスト(約500円/月)のみで固定IP化していきます!
📌 全体像とこの構成の注意点(重要)
- 通常、VPC内のLambdaはパブリックIPを持てないため、パブリックサブネットに配置しても直接インターネットへ出られません
- しかし、AWS側が事前にプロビジョニングするHyperplane ENIに対して、無理やりElastic IP(パブリックIP)をマッピングすることで、インターネットへの直接通信を可能にします
⚠️ 運用の注意点(本番非推奨)
- 1サブネット・1AZ限定: LambdaのスケールアウトやAZ障害に対応するため、複数サブネットに分散すると固定IPが外れます
- ENIの再作成リスク: Lambda関数が長期間実行されない、または内部的なアップデートがあると、ENIが削除・再作成され、Elastic IPの紐付けが外れる可能性があります
- あくまで「実験・個人開発用」: 本番環境ではおとなしくNAT Gatewayか、格安の「NATインスタンス」を使いましょう
今回の構成
1. ネットワーク(VPC)の構築
まずはLambdaを配置する土台となるVPCと、インターネットに直接つながるパブリックサブネットを作成します。
🟩 1-1. VPCの作成
- VPCコンソールを開き、「VPC を作成」をクリック
- 「VPC のみ」を選択
- 名前タグに
(任意の名前)例:mock-server-vpcと入力 - IPv4 CIDR ブロックに
10.0.0.0/16と入力して作成
🟩 1-2. サブネットの作成
- 左メニュー「サブネット」から「サブネットを作成」をクリック
- VPC IDで
mock-server-vpcを選択 - サブネット名に
(任意の名前)例:mock-server-vpc-subnet-01と入力 - アベイラビリティゾーンで
ap-northeast-1aを選択(※1つのAZに絞るのがポイントです) - IPv4 VPC CIDR ブロックに
10.0.1.0/24と入力し、右下の「サブネットを作成」をクリック
🟩 1-3. パブリックIP自動割り当ての有効化
- 作成した
mock-server-vpc-subnet-01にチェックを入れる - 右上の「アクション」>「サブネット設定の編集」をクリック
- 「パブリック IPv4 アドレスの自動割り当てを有効化」にチェックを入れ、保存
🟩 1-4. インターネットゲートウェイ(IGW)の作成と接続
- 左メニュー「インターネットゲートウェイ」から「インターネットゲートウェイの作成」をクリック
- 任意の名前(例:
mock-server-igw)を入力して作成 - 作成後、右上の「アクション」>「VPC にアタッチ」をクリック
-
mock-server-vpcを選択してアタッチ
🟩 1-5. ルートテーブルの設定(外への道を作る)
- 左メニュー「ルートテーブル」を開き、
mock-server-vpcに紐づいているメインルートテーブルを選択 - 画面下の「ルート」タブ >「ルートを編集」をクリック
- 「ルートを追加」をクリックし、以下を設定
送信先:0.0.0.0/0
ターゲット:インターネットゲートウェイ> 作成したmock-server-igwを選択 - 「変更を保存」をクリック
2. 固定IP(Elastic IP)の確保
インターネット側から識別される、あなただけの固定IPを1つ確保します
🟩 2-1. Elastic IPの取得
- 左メニュー「Elastic IP アドレス」を開き、「Elastic IP アドレスを割り当てる」をクリック
- 設定はデフォルトのまま、右下の「割り当て」をクリック
- 割り当てられた 「IPv4 アドレス」 と 「割り当て ID (eipalloc-xxx...)」 をメモします
📝 確保したIP: [ ]
3. Lambdaの設定とENIの紐付け
- ここからがこの裏技の本番です
- Lambdaにネットワークインターフェースを生成させ、そこにElastic IPを強引に紐付けます
🟩 3-1. Lambda関数をVPCに配置
- Lambdaコンソールを開き、対象の関数を選択
- 「設定」タブ >「VPC」を選択し、「編集」をクリック
- 以下を選択して保存(適用完了まで2〜3分待ちます)
VPC:mock-server-vpc
サブネット:mock-server-vpc-subnet-01
セキュリティグループ: 任意のグループ(default等、アウトバウンドが全許可されているもの)
🟩 3-2. Lambdaのテスト実行(ENIの自動生成トリガー)
- Lambdaの「テスト」タブから、関数を1回テスト実行します
- ※これにより、AWS側でLambda専用のENI(Hyperplane ENI)がサブネット内に自動生成されます
🟩 3-3. 自動生成されたENI IDの特定
- EC2コンソールを開き、左メニュー「ネットワークインターフェイス (ENI)」を選択
- 検索窓に
mock-server-vpc-subnet-01のサブネットIDを入力して絞り込みます - 説明欄に
AWS Lambda Predicted ENI...と記載されている、またはタイプがlambdaになっているものを探します - その 「ネットワークインターフェイス ID (eni-xxx...)」 をコピーしてメモします
📝 LambdaのENI ID:eni-xxxxxxxxxxxxxxxxx
🟩 3-4. Elastic IPをENIに関連付け(固定IP化の完了)
- VPCコンソールの「Elastic IP アドレス」に戻ります
- 確保したIPにチェックを入れ、「アクション」>「Elastic IP アドレスの関連付け」をクリック
- 以下を設定し、右下の「関連付け」をクリック
リソースタイプ:ネットワークインターフェイス
ネットワークインターフェイス: コピーした LambdaのENI ID を選択
プライベート IP アドレス: 候補として表示されるIP(10.0.1.xx)を選択
