はじめに
ニフティグループ Advent Calendar 2024 2日目の記事です !
はじめまして!
私はサポシスと呼ばれるチームに所属しており、普段カスタマーサポートセンター(以降CS)向けのアプリケーションの開発と運用を担当しています。
CS向けのアプリケーションはパッケージアプリケーションを利用するだけでなく、完全内製のアプリケーションの作成なども行っています。サポシスでは、これらの内製ツールのデプロイは Terraform と AWS SAM を使用しています。
本記事では、それらのツールを選択した理由と、実際の使ってみた開発メンバーの声を紹介していきたいと思います。
IaCの選択肢
デプロイ先はAWSとします。AWSで利用可能なIaCの一覧は以下の通りです。
- Cloudformation
- AWS CDK
- AWS SAM
- AWS Chalice
- Serverless Frameworks
- Terraform
- Pulumi
各ツールの説明については、ここでは割愛します。
現在サポシスでは、ECSなどを含むアプリケーションは Terraform、Lambdaのみで完結するツールはAWS SAMを使用しています。
ツールの選定理由
それぞれのツールを選んだ理由について、各ツールの長所と短所を交えながら説明していきます。
Terraform
冪等性が担保される
Terraformは宣言型のIaCとして設計されており、状態をtfstateファイルを用いて管理します。デプロイにはAWSのAPIを利用しており、APIの呼び出し結果を元に、tfstateファイルを更新することで冪等性を担保しています。また、デプロイ時にはtfstateファイルとAWS上のリソースを比較し、差分がある場合のみデプロイを実行するため、無駄なデプロイを防ぐことができます。
リソースのAPIコール順序はTerraform側で自動的に制御されるため、コード内での記述順序を気にする必要はありません。
社内・社外ともにナレッジが豊富
Terraformはニフティ内で5年以上前から利用されており、多くの社員が使い慣れているツールです。そのため、トラブルが発生した際も社内の経験者に相談することで解決できることが多く、社内ドメインに沿ったベストプラクティスなども成熟しつつあります。
また、社外でも広く利用されているため、インターネット上の情報も豊富で、トラブルシューティングが容易です。
モジュール分割機能が便利
モジュールを再利用可能な単位に分割でき、環境依存の設定を外側に分離することで、本番環境と開発環境のデプロイを効率的に管理できます。
サーバーレスアプリの開発には向いていない
Terraformはサーバーレスアプリケーションの管理が得意ではありません。特にLambdaに関しては、1つの関数に対して多くのプロパティを設定する必要があり、また、デプロイに必要なzipファイルのビルドプロセスも複雑になりがちです。そのため、私たちのチームではこれらの課題に対処するためにAWS SAMを採用しています。
コラム:動画紹介
Terraformのメリットについて、もっと詳しく知りたい方は、うちのメンバーが分かりやすく解説しているTech talkの動画もチェックしてみてください!
AWS SAM
各種パッケージの管理が容易
AWS SAM はデプロイ前にビルドプロセスが実行します。その際に必要なパッケージのインストールとデプロイ用のzipファイルの作成が自動的に行われます。
こちらのbuildはオプションでコンテナ上でも行うことができるため、build環境に依存しない作りにすることができます。
開発機能が豊富
ローカル環境での実行・テストが可能で、コンテナベースの動作により環境依存性を排除できます。また、syncというリモートのAWS上とローカルのコードを動悸する機能も搭載されており、開発効率を向上させることができます。
チーム間での管理が容易
CloudFormationを利用して管理されているため、tfstateファイルといった依存関係管理ファイルをS3にアップロードする必要がありません。また、リソースの削除もCLIだけでなく、AWSコンソールから一括で行うことができます。
大規模アプリケーションは不向き
CloudFormationをベースとしているため、モジュール化して分離することがほぼ不可能となっています。また、YAML形式で書かれているため、コードが冗長になってしまい、可読性が低下することもAWS SAMの課題です。
実際に運用してみて
チームメンバーからの感想を聞いてみました。
- コンソールでの作業手順の作成が不要になったのは嬉しい
- デプロイ時はIaCを通さなければいけないので、全員が変更履歴を追えるようになった
- Git(GitHub)で管理できるようになったので、バージョン管理ができるようになった
- デプロイ時は環境差分のみに集中すればよくなったので、非常にリリース時のミスが減った
- AWS SAMに関しては、実行まで手元のエディタで全て完結するのは開発体験としていい
- デプロイが遅いので、待たなければいけないのは不便(lambdaのコピペは直ぐにすんだので)
- 管理が楽になると回りから聞いていたけど、実際は思っていたより楽ではなかった
- IaCが読めるようになるまでの学習コストが高い
- コードで全て管理できるが、グラフィカルに依存関係を見ることができないのは残念
IaCの導入によって管理効率や変更履歴の追跡が向上した一方で、学習コストやデプロイ時間などの運用面での課題も見えてきました。
まとめ
本記事では、ニフティのサポシスチームにおけるIaCツールの選択と運用について紹介しました。Terraformは冪等性の担保や豊富なナレッジ、モジュール分割機能など、大規模なインフラ管理に適している一方、AWS SAMはサーバーレスアプリケーションの開発に特化した機能を提供しています。
実際の運用では、変更履歴の追跡やバージョン管理、環境差分の管理が容易になるなどのメリットが確認できました。一方で、学習コストやデプロイ時間、可視化の課題なども浮き彫りになりました。
これらのツールを目的に応じて使い分けることで、より効率的なインフラ管理が可能になっています。今後も開発者の声に耳を傾けながら、より良い開発環境の整備を進めていきたいと思います。