Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20260916【JAWS-UG朝会 #85LT②】NATゲートウェイの料金を何とかしたい

Avatar for Taka Taka
September 15, 2026
180

20260916【JAWS-UG朝会 #85LT②】NATゲートウェイの料金を何とかしたい

Avatar for Taka

Taka

September 15, 2026

More Decks by Taka

Transcript

  1. 自己紹介 野崎 高弘(のざき たかひろ) ・仕事:前職まではインフラ構築・保守やSOCセキュリティアナリスト 現在は技術検証が主のクラウドインフラエンジニア ・趣味:資格取得、犬の散歩、ドラマ鑑賞、巨人ファン ・資格:現在AWS・GCP全冠、その他100種以上保持の資格オタク ・2024年3月『AWS認定 高度なネットワーキング-専門知識(ANS-C01)完全

    対応テキスト』(リックテレコム)部分執筆(2章、巻末模擬問題担当) ・AWSクイズメルマガ:https://www.mag2.com/m/0001699804 ・主な受賞歴 2023 Japan AWS All Certifications Engineers 2024 Japan AWS All Certifications Engineers 2024 Japan AWS Top Engineers(Networking) JAWS-UG朝会 #85 LT② 2
  2. 実装概要 ・停止(不要な時)の処理 1. プライベートサブネットのルートテーブルから、NATGW宛のデフォルトルート (0.0.0.0/0 → nat-xxxxx)を削除 2. NATGWを削除(DeleteNatGateway) 3.

    (コストをさらに削減したい場合)EIPも解放する。ただし、同じIPを維持したい場合はEIP は解放せず保持しておく(EIPは未アタッチでもわずかな料金がかかりますが、NATGW自 体の時間課金よりはるかに安く済む) 2024年2月以降は、使用中かどうかにかかわらずEIPには時間課金($0.005/時間)が発生する 仕様になっています。NATGW削除中もEIPを保持したままだと、その分課金が続きます。 なので、ここではEIPも一緒に解放・再取得する形にしています。 JAWS-UG朝会 #85LT② 6
  3. 実装概要 ・起動(必要な時)の処理 1. 既存のEIP(保持しておいたもの)を使って、NAT Gatewayを新規作成 (CreateNatGateway) 2. 作成完了(availableステータスになる)まで待機 3. プライベートサブネットのルートテーブルに、新しいNATGWへのデフォルトルートを追

    加 典型的な構成パターン • 定期的なスケジュール(夜間・休日は不要)の場合:EventBridge Schedulerで「平日9時に 作成、19時に削除」のようなcron式を設定するのが最もシンプルで、実装事例も豊富です。 • 不定期・オンデマンドで必要な場合:API Gatewayや別のイベント(バッチ処理の開始な ど)をトリガーにLambdaを起動し、処理開始前にNATGWを作成→処理完了後に削除、と いう形にできます。 JAWS-UG朝会 #85LT② 7
  4. 注意事項 • 複数のEC2インスタンスが同じNATGWを共有する場合 1台だけ停止しても、他のインスタンスがまだ稼働中ならNAT Gatewayを消してはいけま せん。delete_nat_gateway()の中で、「対象サブネット内の他のインスタンスが全て停 止しているか」を確認するロジックを追加する必要があります。 • NATGW作成には数分かかる 削除は比較的早いですが、作成(available状態になるまで)は数分程度かかるため、必要に

    なった瞬間に即座に使えるわけではない点に注意してください。オンデマンドで動的に起 動するユースケースでは、この起動時間(レイテンシ)を許容できるか事前に確認が必要で す。 もしEC2起動直後からインターネットアクセスが必須(例:起動スクリプトでyumやpip installを行う)なら、この構成は不向きです。 • Lambdaのタイムアウト設定に注意 最大6回×10秒待機=60秒のリトライ余地を持たせているので、Lambdaのタイムアウトは 「NATGW作成/削除待ち」の時間に加えて、さらに1分程度余裕を持たせる必要がありま す。目安として、タイムアウトを7〜8分程度に設定しておくと安心です。 JAWS-UG朝会 #85 LT② 10
  5. 作業の流れ 1. EC2を起動 2. NATGWが生成されていることを確認 3. プライベートルートテーブルでデフォルトルートがNATGW宛に設定されてい ることを確認 4. EIPがNATGWに割り当たっていることを確認

    5. EC2を停止 6. NATGWが削除されていることを確認 7. プライベートルートテーブルでデフォルトルートが無くなっていることを確認 8. EIPが解放されていることを確認 JAWS-UG朝会 #85 LT② 12
  6. Lambda関数のポイント • allocate_address()をcreate_nat_gateway()内で毎回呼び出す:NAT Gateway作成のた びにEIPを新規発行します。 • delete_nat_gateway()側で、削除完了を待ってからrelease_address()を呼ぶ:NATGW がまだdeleting状態のうちにEIPを解放しようとすると、InvalidIPAddress.InUseのよう なエラーになることがあるため、nat_gateway_deletedのwaiterで完全に削除されるのを 待ってから解放しています。

    • VPC単位で判定する もしそのVPC内に、この2台以外のEC2インスタンスが存在しない(今後も増える予定がな い)なら、VPC IDだけで絞り込む方法が最も手軽です。 こちらは「このVPC内で自分以外に動いているインスタンスがいるか」だけを見ます。た だし、将来そのVPCに無関係な別のEC2インスタンスが追加された場合、それも巻き込ん でNAT Gatewayの削除タイミングに影響してしまう点には注意してください。 JAWS-UG朝会 #85 LT② 16
  7. Lambda関数のポイント • lambda_handlerで、停止イベント受信時にまずother_instances_running()を呼んで判 定し、他に稼働中のインスタンスがなければdelete_nat_gateway()を実行する、という 条件分岐を追加しました。other_instances_running()自体は、VPC単位で判定する方法 を採用しています。 • delete_nat_gateway()のドキュメントDeleteNatGateway - Amazon

    Elastic Compute Cloudにも明記されている通り、「パブリックNATゲートウェイを削除すると、その Elastic IPアドレスの関連付けは解除されますが、アカウントからアドレスが解放されるわ けではありません。」という仕様です。つまり、EIPの解放はこちらが明示的に行う必要が あり、そのタイミングでバックエンド側のENI後片付けがまだ終わっていないとエラーに なります。 JAWS-UG朝会 #85 LT② 17
  8. IAMロール(Lambda実行ロールに必要な権限) "Version": "2012-10-17", "Statement": [ {"Effect": "Allow", "Action": [ "ec2:CreateNatGateway",

    "ec2:DeleteNatGateway", "ec2:DescribeNatGateways", "ec2:CreateRoute", "ec2:DeleteRoute", "ec2:DescribeRouteTables", "ec2:AllocateAddress", "ec2:ReleaseAddress", "ec2:DescribeInstances" ], "Resource": "*" } ] JAWS-UG朝会 #85 LT② 18
  9. 現状の課題 とはいえ、設計上の制約と運用面における課題も… • 1. EC2起動直後の空白時間 NATGWがavailableになるまで約2分かかるため、その間はインターネットに出られませ ん。UserDataでyum installやpip installを実行するような構成だと、そもそもこの方式が採 用できません。

    • 2. IaCとの状態乖離 CFn/Terraform管理下のNATGWをLambdaで直接操作すると、次回のIaC実行時に差分と して検出されます。実運用への展開ではここが最大の障壁になりそうです。 • 3. マルチAZ構成に未対応 環境変数がSUBNET_ID・ROUTE_TABLE_IDともに単数のため、AZごとにプライベート サブネット・ルートテーブルを分けている一般的な本番構成には、そのままでは適用できま せん。 JAWS-UG朝会 #85 LT② 20
  10. まとめ •課題: 常時起動のNATGWは使っていない時間もコストが発生するため、EC2の 稼働に連動してオンデマンドに作成・削除する仕組みを構築 •トリガー設計: EventBridgeでEC2のrunning/stopped/terminatedをイベント駆動で 検知し、Lambdaが「対象VPC内に他の稼働中インスタンスがいないか」を判定して から、NATGWの作成/削除を実行 •コスト最適化: EIPも都度確保・解放する方式にし、未使用時間の課金まで含めて

    削減できる構成に。IP自体は再作成の度に変わる点はトレードオフとして許容 •注意点: NATGW作成には数分かかるため、EC2起動直後は一時的にインター ネット接続できない空白時間が生じる。Lambdaのタイムアウトは7〜8分程度の余裕 を持たせる必要がある JAWS-UG朝会 #85 LT② 21