Go製チャットサーバをFargateで動かすまでをTerraformで自動化してみた
概要
コード全体は以下のリポジトリにあります:
👉 ms1546/chat-be本記事ではソースコードは扱わず、構成と運用設計に焦点を当てています。
🎯 この記事で目指す構成
- Go製WebSocketチャットサーバを Dockerコンテナ化
- TerraformによるAWSリソース自動構築
- GitHub ActionsによるECRへのイメージpush
- ALB経由でFargate上のコンテナにアクセス
- RDS(PostgreSQL)で履歴保存、Redis(ElastiCache)でPub/Sub通知
- すべてのリソースはTerraformで定義、手動操作なし
🏗️ アーキテクチャ全体像
🧩 使用技術
分類 | 技術 | 用途 |
---|---|---|
言語 | Go 1.22 | WebSocketサーバ |
IaC | Terraform | AWSリソース管理 |
コンテナ | Docker / Fargate | 実行基盤 |
DB | RDS (PostgreSQL) | メッセージ履歴保存 |
キャッシュ | ElastiCache (Redis) | Pub/Sub通知 |
CI/CD | GitHub Actions | ECRイメージ更新 |
監視 | CloudWatch Logs | ログ管理 |
🛠️ Terraformによる自動構築
Terraformで次のAWSリソースを自動生成します。
リソース | 内容 |
---|---|
VPC / Subnet / SG | 通信基盤構成 |
ECR | コンテナイメージ保存 |
ECS + Fargate | コンテナ稼働環境 |
ALB + TargetGroup | HTTP経由でコンテナへトラフィック転送 |
RDS | メッセージ履歴保存用DB |
ElastiCache (Redis) | メッセージ配信(Pub/Sub) |
IAM | ECS実行ロールやログ権限 |
CloudWatch Logs | アプリ・ALBログ収集 |
Terraformはローカル実行を前提とし、環境の再現性とデプロイの確実性を担保します。
⚙️ デプロイフロー
1️⃣ GitHub Actions(ECR更新のみ)
-
main
ブランチへのpushをトリガーに、ActionsがDocker Build & Pushを実行。 -
github.sha
タグを使い、ECRにイミュータブルなイメージを登録。 - それ以上のAWS操作(Terraform実行など)は行わない。
2️⃣ Terraform(ローカル適用)
- 新しいイメージタグをTerraformに渡して適用。
- ECSサービスがローリングデプロイを行い、新タスクに自動切替。
terraform plan -var "image_tag=$(git rev-parse HEAD)"
terraform apply -auto-approve
メリット
- CI/CDを明確に分離:ActionsはECRまで、Terraformは本番反映まで。
- 状態管理が一元化され、リソースのドリフトを防止。
🧱 インフラ構成(Terraformモジュール)
モジュール | 内容 |
---|---|
vpc.tf |
VPC / Subnet / RouteTable / IGW / NATGW |
ecs.tf |
ECS Cluster / Service / Task Definition / ALB / CloudWatch Logs |
rds.tf |
PostgreSQLインスタンス(履歴保存) |
redis.tf |
ElastiCache Redis(Pub/Sub) |
ecr.tf |
ECRリポジトリ定義 |
iam.tf |
ECS実行ロール、タスクロール |
alb.tf |
ALBリスナー / ターゲットグループ設定 |
💻 ローカル開発環境
Docker Composeを使い、アプリ・DB・Redisを一括起動できます。
起動
docker compose up -d --build
停止
docker compose down -v
- 通信はHTTP/WSを利用(TLSなし)
- 本番もTLS構成は検討必須(ALB経由のみで通信)
📡 API概要
履歴取得:GET /messages
- メッセージ履歴をJSON配列で返す。
WebSocket接続:/ws
- クライアントから送信されたメッセージを全クライアントに配信。
- 接続時に過去履歴を取得して自動表示。
🔒 セキュリティと運用
- SG制御:ALB→ECSのみ許可、DB/RedisはECSからのみアクセス可。
- CloudWatch Logs:アプリ・ALBログを集中管理。
- スケーリング:CPU/メモリ利用率でFargateタスク数を自動調整。
- RDSバックアップ:自動スナップショット設定。
💰 コスト目安(ap-northeast-1)
- Fargate:0.25vCPU / 0.5GB × 2タスク
- ALB:固定 + LCU課金
- RDS:db.t4g.micro
- Redis:cache.t4g.micro
検証環境は単一AZ。本番はMulti-AZを推奨。
🚀 今後の拡張
- ACM導入によるHTTPS/WSS化
- Redis Pub/Subの分散対応
- Terraform CloudによるCI/CD統合
- JWT認証・ユーザー管理の導入
🧠 まとめ
- Go + Terraform + Fargate で軽量かつ再現性の高いチャットバックエンドを構築
- GitHub ActionsはECR更新のみ に限定し、Terraformで本番適用 を制御
- インフラを完全コード化し、AWSコンソール操作を不要化
本記事は ms1546/chat-be を参考に構成しています。
これをベースにTLS対応やCI/CD拡張を行えば、スケーラブルなチャットサービス基盤としてそのまま発展可能です。