NATとは何か? 1つのパブリックアドレスを共有する
NAT(network address translation)は、プライベートIPアドレスを持つホストが、送信時にトラフィックを共有パブリックアドレスを使うよう書き換えることで、インターネットに到達できるようにします。
プライベートサブネットはインターネットへ直接ルーティングできませんが、そのホストは依然としてパッケージの取得や外部APIの呼び出しを必要とします。NATは、プライベートなソースアドレスをパブリックなものへ変換し、応答が正しく戻るようマッピングを追跡することでこれを解決します。プライベートサブネット内のCIのrunnerは、すべての送信トラフィックでNATに依存します。
アドレスを変換する
プライベートホストがトラフィックを外へ送ると、NATデバイスはソースを自身のパブリックアドレスへ書き換え、マッピングを記憶します。応答が戻ると、デスティネーションを元のプライベートホストへ変換し直します。
送信のみ
NATは通常、プライベートホストが外向きにコネクションを開始することは許可しますが、インターネットが内向きにコネクションを開始することは許可しません。これにより、プライベートリソースはegressのために到達可能なまま、直接の受信アクセスから守られます。
NATと安定したegress IP
- すべてのプライベートホストがNATのパブリックアドレスを共有します。
- それにより、downstreamでallowlistできる安定したegress IPが得られます。
- デスティネーションから個々のホストのアドレスを隠します。
CI/CDにおけるNAT
プライベートサブネット内のrunnerは、NAT gatewayを通じて依存関係をダウンロードしAPIを呼び出します。トラフィックが1つの既知のアドレスから出るため、downstreamのサービスはその単一のegress IPをallowlistできます。
NATがボトルネックになるとき
NAT gatewayにはコネクションと帯域幅の上限があります。重いダウンロードを行う大規模なrunnerのフリートは、ポートを枯渇させたりgatewayを飽和させたりして、断続的な接続失敗を引き起こすことがあります。
一時的なNATの負荷
NAT gatewayが一時的に飽和したために失敗するコネクションは一時的で、しばしばretryで成功します。Latchkeyのrunnerはこうした一時的なegressの失敗を一般的なエンドポイントに対してretryするため、瞬間的なNATのスパイクがjobを失敗させることはありません。
重要なポイント
- NATは、共有されたパブリックアドレスを通じてプライベートホストがインターネットに到達できるようにします。
- 送信コネクションを許可しつつ、要求されていない受信コネクションをブロックします。
- 飽和したNAT gatewayは、断続的でretry可能なegressの失敗を引き起こします。