ファクトマーケティング株式会社 / 開発部
インフラのモダン化
## プロジェクトの目的・背景 - EC2ベースの従来インフラにおける以下の課題解決 - インフラ管理の属人化(IaC未導入) - デプロイ・マイグレーションの属人化 - 可用性 - セキュリティ・コスト最適化の不足 - インフラのモダン化(コンテナ化)要望への対応 ## プロジェクト規模・体制 - 4~5名の副業エンジニアで構成されるチームに専任インフラエンジニアとして途中参画 ## 担当業務・役割 - インフラリプレイスの設計・実装の主担当 - AWSインフラのIaC化 - CI/CDパイプラインの構築 - セキュリティ強化 - コスト最適化 - インフラドキュメントの整備と共有 ## 使用技術 - AWS(CloudFront・WAF・ALB・ECS/Fargate・RDS・SecurityHub・GuardDuty) - GitHub Actions ## 課題 開発当初は専任のインフラエンジニアが居なかったため、バックエンドエンジニアの開発メンバーの方がEC2ベースでインフラを構築されていました。 しかし、以下の点が問題となっておりこれらを改善するためにプロジェクトに参画しました。 - インフラ周りが適切に管理できていない(IaCなどが使われていない) - デプロイ作業の属人化 - 可用性が担保されていないこと - セキュリティやコスト最適化がされていないこと また、プロジェクトオーナーの方から後々のことを考えてコンテナ化などインフラをモダンにしてほしいとの要望もありました。 ## 具体的な取り組み 上記の課題に対して以下の取り組みを行いました。 1. インフラのモダン化 - バックエンドをEC2からECS/Fargateに移行 - フロントエンドをAppRunnerからECS/Fargateに移行 - コンテナスペックやスケーリング設定など - 踏み台サーバのコスト低減 2. 手動作業・属人化の排除 - GitHub Actionsを使ったデプロイフローの整備 - Notionを使いインフラ周りのドキュメント整備 3. セキュリティ対応 - GuardDutyやSecurityHubを設定・対応 ## 工夫した点 1. 技術選定 AWSインフラのリプレイスを行うにあたり、ECS/FargateおよびAppRunnerのどちらを使うか技術検証を行いました。 私自身AppRunnerの利用経験がないこととAppRunnerの本番利用の事例をあまり聞いたことがなかったため、リプレイスにあたり機能要件・非機能要件を満たせるか検証を行いました。 結果として、以下の理由によりAppRunnerは採用せずECS/Fargateを利用することに決めました。 - 一部AppRunnerのリソースがTerraform管理できない - ネットワーク周りのリソースの更新ができない(削除→再作成となる) - デプロイが遅い(内部でB/Gデプロイが行われているため) - オートスケーリングの指標が限られている(リクエスト数のみ) 2. Terraformを使ったIaC化 既存のAWSリソースは全てIaC管理されていなかったため、リプレイスにあたり全てをTerraform管理するようにしました。Terraformに詳しい開発メンバーがいなかったため、なるべく複雑性を下げるためmoduleは使用しないようにしました。また、コード品質の担保とセキュリティ・ガバナンスの観点からTerraformのCI/CDをGitHub Actionsで実装し開発メンバーでも簡単にPRを出せるようにドキュメントを整備しました。 - PR作成時のCI - plan実行して結果をPRにコメント - tflint・trivyの実行 - PRマージ時のCD - apply実行して結果をPRにコメント 3. コスト最適化の実現 コスト削減のため、踏み台コンテナを常時起動するのではなく開発メンバーが必要なタイミングで起動できるような構成を作りました。 工夫した内容としては、 - Slackから踏み台コンテナを起動 - AWS Chatbotを使って踏み台コンテナを起動させることで誰がいつ踏み台を起動したかを記録できるようにしました - 作業終了時に自動でコンテナを落とす - コンテナのエントリーポイントとして、10分おきにコンテナ内にSSMで接続しているユーザ数をチェックし接続ユーザがいなければプロセスが落ちるようにしました ## 得られた知見・教訓 1. DevOpsとDX向上 - IaCとCI/CD整備により、開発者が安全かつ効率的にインフラ操作可能に - ドキュメント整備による知見共有の重要性 2. 技術選定の重要性 - 新技術(AppRunner)の検証による適切な判断 - チーム全体の技術レベルを考慮した実装方針決定 3. コスト最適化とユーザビリティの両立 - Slack連携による使いやすさの実現 - 自動化による運用コスト削減 4. チーム全体の生産性向上 - インフラ操作の民主化 - 属人化の解消 - 自動化による作業効率の向上