1. 概要
- このシステムでは、Go言語のWebフレームワークであるGinを使用してヘルスチェックAPIを実装する
- ヘルスチェックエンドポイントは、システムの稼働状態を監視するための重要な機能を提供する
- 特に、マイクロサービスアーキテクチャやコンテナ化された環境において、サービスの健全性を確認する上で不可欠な要素である
2. システム構成
2.1 使用技術
- 言語: Go 1.23.3
- フレームワーク: Gin v1.10.0
- アーキテクチャ: クリーンアーキテクチャ
- データベース: PostgreSQL(ヘルスチェックの対象として監視)
2.2 ディレクトリ構造
backend/
├── internal/
│ ├── presentation/
│ │ └── handlers/
│ │ └── health_handler.go # ヘルスチェックハンドラー
│ └── adapter/
│ └── routes/
│ └── routes.go # ルーティング定義
└── cmd/
└── app/
└── main.go # アプリケーションエントリーポイント
3. 実装の詳細
3.1 ルーティング設定
routes.go
ファイルでは、以下のようにヘルスチェックエンドポイントを定義している:
backend/internal/adapter/routes/routes.go
func setupHealthRoutes(api *gin.RouterGroup) {
api.GET("/health", handlers.HealthCheck)
}
このコードでは、以下の重要な点を実装している:
- APIグループ内にヘルスチェックエンドポイントを配置
- GETメソッドのみを許可
- ハンドラー関数との明確な紐付け
- パスを
/api/health
として設定
3.2 ハンドラーの実装
health_handler.go
ファイルには、実際のヘルスチェック処理を実装している:
backend/internal/presentation/handlers/health_handler.go
func HealthCheck(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"status": "ok",
})
}
このハンドラーは以下の特徴と利点を持つ:
- シンプルで軽量な実装
- 明確なステータス表示
- JSON形式でのレスポンス提供
- 標準的なHTTPステータスコードの使用
- コンテキストを活用した効率的な処理
3.3 アプリケーションの起動設定
main.go
ファイルでは、アプリケーションの初期化とサーバーの起動を行っている:
backend/cmd/app/main.go
func main() {
if os.Getenv("DEBUG") == "true" {
gin.SetMode(gin.DebugMode)
log.Println("Ginをデバッグモードで起動します")
} else {
gin.SetMode(gin.ReleaseMode)
log.Println("Ginをリリースモードで起動します")
}
database.InitDB()
r := gin.Default()
r.Use(middleware.CORSConfig())
routes.SetupRoutes(r)
if err := r.Run(":8000"); err != nil {
log.Fatalf("サーバの起動に失敗しました: %v", err)
}
}
主な設定内容と特徴:
-
環境に応じたモード設定
- デバッグモード:詳細なログ出力
- リリースモード:最適化されたパフォーマンス
-
データベース初期化
- 接続プールの管理
- エラーハンドリング
-
ミドルウェアの設定
- CORSポリシーの適用
- セキュリティ対策の実装
-
エラーハンドリング
- 起動失敗時の適切なログ出力
- プロセス終了の制御
4. APIの仕様
4.1 エンドポイント詳細
項目 | 説明 |
---|---|
URL | /api/health |
メソッド | GET |
認証 | 不要 |
レスポンス形式 | application/json |
タイムアウト | 5秒(デフォルト) |
4.2 レスポンス例
{
"status": "ok"
}
5. セキュリティ考慮事項
システムには以下のセキュリティ対策を実装している:
backend/internal/adapter/middleware/cors.go
package middleware
import (
"os"
"strings"
"time"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
)
// CORSConfig CORSミドルウェアの設定を行う関数
// Cross-Origin Resource Sharing (CORS) の設定により、
// 異なるオリジン間でのリソース共有を制御する
func CORSConfig() gin.HandlerFunc {
// 許可するオリジンを環境変数から取得しカンマ区切りで配列化
// 例: "http://localhost:3000,https://example.com"
allowOrigins := strings.Split(os.Getenv("CORS_ALLOW_ORIGINS"), ",")
// 許可するHTTPメソッドを環境変数から取得
// 例: "GET,POST,PUT,DELETE,OPTIONS"
allowMethods := strings.Split(os.Getenv("CORS_ALLOW_METHODS"), ",")
// 許可するHTTPヘッダーを環境変数から取得
// 例: "Content-Type,Authorization"
allowHeaders := strings.Split(os.Getenv("CORS_ALLOW_HEADERS"), ",")
// レスポンスで公開するヘッダーを環境変数から取得
// クライアントがアクセスできるレスポンスヘッダーを指定
// TODO: CSRF対策実装時に "X-CSRF-Token" を追加検討
exposeHeaders := strings.Split(os.Getenv("CORS_EXPOSE_HEADERS"), ",")
// クレデンシャル(Cookie等)の送信を許可するかどうか
// true の場合、withCredentials: true での XMLHttpRequest を許可
allowCredentials := os.Getenv("CORS_ALLOW_CREDENTIALS") == "true"
// プリフライトリクエストの結果をキャッシュする時間
// 環境変数から取得できない場合は12時間をデフォルト値として使用
maxAge, err := time.ParseDuration(os.Getenv("CORS_MAX_AGE"))
if err != nil {
maxAge = 12 * time.Hour
}
// CORSミドルウェアの生成と設定の適用
return cors.New(cors.Config{
AllowOrigins: allowOrigins, // アクセスを許可するオリジン
AllowMethods: allowMethods, // 許可するHTTPメソッド
AllowHeaders: allowHeaders, // 許可するHTTPヘッダー
ExposeHeaders: exposeHeaders, // クライアントに公開するヘッダー
AllowCredentials: allowCredentials, // クレデンシャルの許可
MaxAge: maxAge, // プリフライトリクエストのキャッシュ時間
})
}
このコードは、セキュリティの重要な要素であるCORS(Cross-Origin Resource Sharing)の設定を行っている。環境変数を使用することで、開発環境と本番環境で異なる設定を柔軟に適用することが可能である
特に重要な点として:
- すべての設定値を環境変数から取得することで、環境ごとの柔軟な設定変更が可能
- プリフライトリクエストのキャッシュ時間設定により、パフォーマンスの最適化が可能
- クレデンシャルの制御により、セキュアな認証処理の実装が可能
- TODO コメントにより、CSRF対策の実装予定が明確化されている
これらの設定により、セキュアでかつ柔軟なCORS制御を実現している
6. 運用上の注意点
-
環境変数の管理
-
DEBUG
モードの適切な設定 - CORS関連パラメータの厳密な管理
- 本番環境での値の検証
-
-
モニタリング戦略
- エンドポイントの定期的な監視
- レスポンス時間のトラッキング
- 異常検知の仕組み構築
- アラート設定の最適化
-
ログ管理方針
- 起動時ログの保存
- エラーログの集中管理
- ログローテーションの設定
- 重要度に応じた分類
-
パフォーマンス最適化
- コネクションプールの適切な設定
- タイムアウト値の調整
- リソース使用量の監視
7. まとめ
- このヘルスチェックAPIの実装により、システムの稼働状態を効率的に監視することが可能となる
- また、マイクロサービスアーキテクチャにおける重要な構成要素として、システム全体の安定性と信頼性の向上に貢献する