Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

名簿管理API (Meibo API)

Go言語で実装された名簿管理APIサーバーです。コンテナ化されており、AWS ECS Fargateでの実行に最適化されています。

技術スタック

  • Go 1.21
  • MySQL 8.0
  • Docker (マルチステージビルド)
  • gorilla/mux (ルーティング)
  • go-sql-driver/mysql (MySQLドライバ)
  • rs/cors (CORS対応)

環境変数

変数名 必須 説明
DB_HOST MySQLホスト localhost または RDSエンドポイント
DB_USER MySQLユーザー名 admin
DB_PASSWORD MySQLパスワード yourpassword
DB_NAME データベース名 meibo

Dockerイメージのビルドと実行

1. イメージのビルド

cd sprint5-api
docker build -t meibo-api .

ビルドが成功すると、meibo-api:latestというイメージが作成されます。

# イメージの確認
docker images | grep meibo-api

2. ローカルでの実行

方法A: Docker Composeを使用(推奨)

MySQLコンテナと一緒に起動する場合:

# docker-compose.ymlを作成(以下の内容)
cat << 'EOF' > docker-compose.yml
version: '3.8'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: meibo
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  api:
    build: .
    ports:
      - "80:80"
    environment:
      DB_HOST: db
      DB_USER: root
      DB_PASSWORD: password
      DB_NAME: meibo
    depends_on:
      db:
        condition: service_healthy
EOF

# 起動
docker compose up -d

# ログ確認
docker compose logs -f api

方法B: 単体での実行

ローカルまたは外部のMySQLに接続する場合:

# ローカルのMySQLに接続(Mac/Windows)
docker run -d \
  --name meibo-api \
  -p 80:80 \
  -e DB_HOST=host.docker.internal \
  -e DB_USER=root \
  -e DB_PASSWORD=yourpassword \
  -e DB_NAME=meibo \
  meibo-api

# RDSに接続(本番環境テスト用)
docker run -d \
  --name meibo-api \
  -p 80:80 \
  -e DB_HOST=your-rds-endpoint.ap-northeast-1.rds.amazonaws.com \
  -e DB_USER=admin \
  -e DB_PASSWORD=yourpassword \
  -e DB_NAME=meibo \
  meibo-api

3. 動作確認

# ヘルスチェック
curl http://localhost/health

# 期待されるレスポンス
# {"status":"ok","service":"meibo-api"}

4. コンテナの停止・削除

# Docker Composeの場合
docker compose down

# 単体実行の場合
docker stop meibo-api
docker rm meibo-api

ECRへのプッシュ

AWS ECS Fargateで実行するために、ECRにイメージをプッシュします。

1. ECRリポジトリの作成(Terraformで作成済みの場合はスキップ)

aws ecr create-repository --repository-name sprint5-api --region ap-northeast-1

2. ECRへログイン

aws ecr get-login-password --region ap-northeast-1 | \
  docker login --username AWS --password-stdin \
  <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com

3. イメージのタグ付けとプッシュ

# タグ付け
docker tag meibo-api:latest \
  <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/sprint5-api:latest

# プッシュ
docker push \
  <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/sprint5-api:latest

4. プッシュの確認

aws ecr describe-images --repository-name sprint5-api --region ap-northeast-1

API仕様

エンドポイント一覧

エンドポイント メソッド 説明
/ GET ヘルスチェック
/health GET ヘルスチェック
/api/health GET ヘルスチェック
/api/persons GET 名簿一覧取得
/api/persons/{id} GET 名簿詳細取得
/api/persons POST 名簿登録
/api/persons/{id} PUT 名簿更新
/api/persons/{id} DELETE 名簿削除

ステータスコード

エンドポイント 成功 エラー
GET /health 200 -
GET /api/persons 200 500
GET /api/persons/{id} 200 400, 404, 500
POST /api/persons 201 400, 500
PUT /api/persons/{id} 200 400, 404, 500
DELETE /api/persons/{id} 204 400, 404, 500

リクエスト・レスポンス例

ヘルスチェック

curl http://localhost/health
{
  "status": "ok",
  "service": "meibo-api"
}

名簿登録 (POST)

curl -X POST http://localhost/api/persons \
  -H "Content-Type: application/json" \
  -d '{"name": "山田太郎", "email": "yamada@example.com", "phone": "090-1234-5678"}'
{
  "id": 1,
  "name": "山田太郎",
  "email": "yamada@example.com",
  "phone": "090-1234-5678"
}

名簿一覧取得 (GET)

curl http://localhost/api/persons
[
  {
    "id": 1,
    "name": "山田太郎",
    "email": "yamada@example.com",
    "phone": "090-1234-5678"
  }
]

名簿更新 (PUT)

curl -X PUT http://localhost/api/persons/1 \
  -H "Content-Type: application/json" \
  -d '{"name": "山田太郎(更新)", "email": "yamada-new@example.com", "phone": "090-9999-0000"}'

名簿削除 (DELETE)

curl -X DELETE http://localhost/api/persons/1
# 204 No Content(レスポンスボディなし)

データベーススキーマ

personsテーブル

カラム 説明
id INT 主キー (AUTO_INCREMENT)
name VARCHAR(255) 名前(必須)
email VARCHAR(255) メールアドレス
phone VARCHAR(50) 電話番号
created_at TIMESTAMP 作成日時
updated_at TIMESTAMP 更新日時

初期化SQL

CREATE DATABASE IF NOT EXISTS meibo;
USE meibo;

CREATE TABLE IF NOT EXISTS persons (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255),
  phone VARCHAR(50),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

ローカル開発(Docker不使用)

前提条件

  • Go 1.21以上
  • MySQL 8.0以上

セットアップ

# 依存関係のインストール
go mod tidy

# 環境変数を設定
export DB_HOST=localhost
export DB_USER=root
export DB_PASSWORD=yourpassword
export DB_NAME=meibo

# 起動
go run main.go

ビルド

go build -o meibo-api main.go
./meibo-api

トラブルシューティング

コンテナが起動しない

# ログを確認
docker logs meibo-api

# よくある原因
# - DB_HOST が正しくない
# - MySQLが起動していない
# - ネットワーク接続の問題

データベースに接続できない

# MySQLの接続テスト
docker run --rm mysql:8.0 mysql -h <DB_HOST> -u <DB_USER> -p<DB_PASSWORD> -e "SELECT 1"

# host.docker.internal が解決できない場合(Linux)
docker run --add-host=host.docker.internal:host-gateway ...

ヘルスチェックが失敗する

ALBのヘルスチェックは /health エンドポイントを使用します。コンテナが正常に起動していることを確認してください。

# コンテナ内からテスト
docker exec meibo-api wget -qO- http://localhost/health

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages