AWS Fargate上でAtlantisを使用したTerraform実行時のNATコスト削減
はじめに
Terraformを使ってインフラをコードとして管理する際、Atlantisを利用することで、GitOpsのワークフローに統合しやすくなります。
しかし、大規模なTerraformプランや複数の環境に対して同時にプランを実行する際、NAT Gatewayの通信コストが急増する問題に直面することがあります。
本記事では、この問題に対処するために行った調査と、それに基づく解決策について解説します。
背景と問題点
AWS上でFargateを使用してAtlantisをホストし、Terraformのプランと適用を実行しています。私たちは、各プロダクトのインフラ定義と別に、自前のモジュールを管理するリポジトリを使用しています。
ある日、Atlantisで大きなプランを実行した際や複数の環境で同時にプランを実行した際、NAT Gatewayの通信コストが急増する現象に気付きました。この問題を解決するために、まず通信のボトルネックを調査しました。
通信のボトルネック調査
最初に、どの通信が料金に支配的なのかを把握するためにVPC Flow Logを有効化しました。次に、取得したFlow Logを元に送信元および宛先IPアドレスごとに通信量の集計を行いました。
集計にはCloudWatch Logs Insightsを利用しました。
fields @timestamp, @message, @logStream, @log
| sort @timestamp desc
| stats sum(bytes) as bytesSum by srcAddr
| sort bytesSum desc
宛先IPアドレスごとに集計した結果。Atlantis自身とNAT Gatewayが占めており参考にならなかった。
送信元IPアドレスごとに集計した結果。
調査の結果、送信元IPアドレスの集計で(当然ですが)NAT Gatewayが最も多くのトラフィックを生成しており、その次に多かったのがMicrosoftとAWSのIPアドレスでした。これにより、GitHubからのGit clone操作とAWS APIの利用が通信の主要な要因であると推測しました。
この中で、AWS APIの通信量はTerraformがインフラを操作する際に必要不可欠なため削減が難しいと考え、Git cloneによる通信量を削減することに焦点を当てました。
Git Cloneの通信量削減
次に、Git cloneによる通信量のボトルネックを特定するために、Atlantisが行う通信を分析しました。具体的には、Terraformの定義が置かれたリポジトリ、自前のモジュールが置かれたリポジトリ、そしてTerraformのプロバイダーの内どのダウロードが多くを占めるのかを調べました。
調査の結果、モジュールのリポジトリが最も大きな通信量を占めていることが分かりました。ダウンロードしたモジュールの合計サイズは1.2GBに達しており、他のリポジトリやプロバイダーと比較しても圧倒的に大きかったのです。
対応策の検討
通信量を削減するために、以下の2つの対応策を検討しました。
CodeCommitへのミラーリングとVPCエンドポイントの導入
この方法では、モジュールのリポジトリをCodeCommitにミラーリングし、VPCエンドポイントを使用してNAT Gatewayを経由しない通信でモジュールをダウンロードします。これにより通信量を大幅に削減できますが、導入には手間がかかります。
さらにモジュールの取得元がGitHubからCodeCommitに変わるため、ローカルでterraform操作を行いたい開発者はCodeCommitアカウントを持つ必要があるというデメリットがあります。
Shallow Cloneの利用
もう一つの方法として、モジュールをshallow cloneすることを検討しました。これは、Gitの履歴を取得せずに最新のコミットだけをクローンする方法で、非常に簡単に導入できます[1]。通信量を減らす効果はミラーリングより劣るものの、導入の手軽さと実際の効果を考慮して、こちらの方法を採用しました。
実施結果
shallow cloneの導入により、NAT Gatewayの通信コストを大幅に削減することができました。多いときで月に数十ドルに達していた通信料が、月10ドル未満にまで減少しました。
結論
Atlantisを使ったTerraformの実行時に発生するNAT Gatewayのコスト増加問題は、Git cloneの方法を見直すことで効果的に対処できました。特に、shallow cloneを利用することで、簡単に実装可能でありながら大幅なコスト削減を実現できたことが大きな成果です。
初心者の方でも、今回紹介した方法を参考にすることで、ネットワークコストの最適化に役立つはずです。
We're hiring!
atama plusは教育をテクノロジーの力で進化させていくことに情熱を持つエンジニアを募集しています。
興味のある方は、ぜひご応募ください!
Discussion