Share
Embed
Transcript
22 slides
-
JAWS -UG 朝会 #85 LT ② NATゲートウェイの料金を何とかしたい JAWS-UG朝会 #85 LT②
9月16日 登壇者:野崎 高弘 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 -
実装概要 重要な前提として、NATGWには一時停止(Stop)という状態がありません。 「作成」か「削除」かの2択しかないため、「必要な時だけ使う」を実現するには、実質的に 「削除→再作成」を自動化する仕組みを作ることになります。以下、実現方法を整理します。 基本方針:Lambda + スケジューラでNATGWを削除・再作成する 今回考えたアーキテクチャは以下の通りです。 EventBridgeスケジューラー(または CloudWatchイベント)
↓ 定期実行 or 手動トリガー Lambda関数 ↓ NATGWの削除 or 作成 + プライベートサブネットのルートテーブル更新 JAWS-UG朝会 #85LT② 5 -
実装概要 ・停止(不要な時)の処理 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 -
実装概要 ・起動(必要な時)の処理 1. 既存のEIP(保持しておいたもの)を使って、NAT Gatewayを新規作成 (CreateNatGateway) 2. 作成完了(availableステータスになる)まで待機 3. プライベートサブネットのルートテーブルに、新しいNATGWへのデフォルトルートを追
加 典型的な構成パターン • 定期的なスケジュール(夜間・休日は不要)の場合:EventBridge Schedulerで「平日9時に 作成、19時に削除」のようなcron式を設定するのが最もシンプルで、実装事例も豊富です。 • 不定期・オンデマンドで必要な場合:API Gatewayや別のイベント(バッチ処理の開始な ど)をトリガーにLambdaを起動し、処理開始前にNATGWを作成→処理完了後に削除、と いう形にできます。 JAWS-UG朝会 #85LT② 7 -
実装概要 今回は、EC2が起動されている時のみNATGWがあって欲しいので、EC2の起動・停止のイベ ント駆動型にします。EC2の状態変化(running/stopped/terminated)をEventBridgeで検知 し、LambdaでNATGWを作成・削除する構成です。 ・アーキテクチャ ・EC2インスタンス起動(running) ⇨ EventBridgeルール ⇨ Lambda
⇨ NATGW作成 + ルート追加 ・EC2インスタンス停止(stopped/terminated) ⇨ EventBridgeルール ⇨ Lambda ⇨ NATGW削除 + ルート削除 JAWS-UG朝会 #85LT② 8 -
注意事項 • EIPは解放せず、再利用する設計にするのが望ましい NATGWを再作成するたびにEIPも新規発行してしまうと、パブリックIPが変わってしまい、 外部システム側のIP許可リスト(ホワイトリスト)と食い違う問題が起きます。 • ルートテーブルの操作が本質的に重要 NATGWの作成・削除そのものより、プライベートサブネットのルートテーブルを正しく 追従させる処理が実装のキモになります。ここを誤ると、意図しない通信断や、逆に古い ルートが残って通信できない状態が発生します。
• IaC管理下にある場合の注意 CloudFormationやTerraformでNATGWを管理している場合、Lambdaで直接APIを叩い て削除・作成すると、IaC側の状態(state)と実際のリソースが乖離してしまう問題があり ます。 JAWS-UG朝会 #85 LT② 9 -
注意事項 • 複数の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 -
作業の流れ 1. EC2を起動 2. NATGWが生成されていることを確認 3. プライベートルートテーブルでデフォルトルートがNATGW宛に設定されてい ることを確認 4. EIPがNATGWに割り当たっていることを確認
5. EC2を停止 6. NATGWが削除されていることを確認 7. プライベートルートテーブルでデフォルトルートが無くなっていることを確認 8. EIPが解放されていることを確認 JAWS-UG朝会 #85 LT② 12 -
事前作業 1. EventBridgeルール(イベントパターン) EC2は状態変化のたびに自動的にデフォルトイベントバスへイベントを送出します。 ・起動検知用ルール: "source": ["aws.ec2"], "detail-type": ["EC2 Instance
State-change Notification"], "detail": { "state": ["running"] } JAWS-UG朝会 #85 LT② 13 -
事前作業 ・停止検知用ルール: "source": ["aws.ec2"], "detail-type": ["EC2 Instance State-change Notification"], "detail":
{ "state": [”stopped”, ”terminated”] } JAWS-UG朝会 #85 LT② 14 -
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 -
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 -
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 -
現状の課題 とはいえ、設計上の制約と運用面における課題も… • 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 -
まとめ •課題: 常時起動のNATGWは使っていない時間もコストが発生するため、EC2の 稼働に連動してオンデマンドに作成・削除する仕組みを構築 •トリガー設計: EventBridgeでEC2のrunning/stopped/terminatedをイベント駆動で 検知し、Lambdaが「対象VPC内に他の稼働中インスタンスがいないか」を判定して から、NATGWの作成/削除を実行 •コスト最適化: EIPも都度確保・解放する方式にし、未使用時間の課金まで含めて
削減できる構成に。IP自体は再作成の度に変わる点はトレードオフとして許容 •注意点: NATGW作成には数分かかるため、EC2起動直後は一時的にインター ネット接続できない空白時間が生じる。Lambdaのタイムアウトは7〜8分程度の余裕 を持たせる必要がある JAWS-UG朝会 #85 LT② 21 -
ご清聴ありがとうございました ブログURL : https://nozakitakahirokun.hatenablo g.com/entry/2026/07/29/165553 ★ご 質問・ 感想などございましたらお 気軽にお 寄せください
!★ JAWS -UG 朝会 #85 JAWS-UG朝会 #85 LT② 22