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 |
cd sprint5-api
docker build -t meibo-api .ビルドが成功すると、meibo-api:latestというイメージが作成されます。
# イメージの確認
docker images | grep meibo-apiMySQLコンテナと一緒に起動する場合:
# 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ローカルまたは外部の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# ヘルスチェック
curl http://localhost/health
# 期待されるレスポンス
# {"status":"ok","service":"meibo-api"}# Docker Composeの場合
docker compose down
# 単体実行の場合
docker stop meibo-api
docker rm meibo-apiAWS ECS Fargateで実行するために、ECRにイメージをプッシュします。
aws ecr create-repository --repository-name sprint5-api --region ap-northeast-1aws ecr get-login-password --region ap-northeast-1 | \
docker login --username AWS --password-stdin \
<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com# タグ付け
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:latestaws ecr describe-images --repository-name sprint5-api --region ap-northeast-1| エンドポイント | メソッド | 説明 |
|---|---|---|
/ |
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"
}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"
}curl http://localhost/api/persons[
{
"id": 1,
"name": "山田太郎",
"email": "yamada@example.com",
"phone": "090-1234-5678"
}
]curl -X PUT http://localhost/api/persons/1 \
-H "Content-Type: application/json" \
-d '{"name": "山田太郎(更新)", "email": "yamada-new@example.com", "phone": "090-9999-0000"}'curl -X DELETE http://localhost/api/persons/1
# 204 No Content(レスポンスボディなし)| カラム | 型 | 説明 |
|---|---|---|
| id | INT | 主キー (AUTO_INCREMENT) |
| name | VARCHAR(255) | 名前(必須) |
| VARCHAR(255) | メールアドレス | |
| phone | VARCHAR(50) | 電話番号 |
| created_at | TIMESTAMP | 作成日時 |
| updated_at | TIMESTAMP | 更新日時 |
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
);- 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.gogo 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