0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go製チャットサーバをFargateで動かすまでをTerraformで自動化してみた

Posted at

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拡張を行えば、スケーラブルなチャットサービス基盤としてそのまま発展可能です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?