はじめに
本記事では、Dockerfile.prod に migrate のビルドと実行を組み込む方法 について解説します。
ECS 上で migrate を適切に動作させるために、Docker イメージ内に migrate を含める設定 を行いました。
また、aws ecs execute-command や aws ecs run-task を用いた migrate の実行方法についても説明します。
本番環境でのマイグレーション管理をスムーズに行うための参考になれば幸いです。
書こうと思ったきっかけ
ECS でアプリケーションをデプロイする際、データベースのマイグレーションをどのように管理するか が課題になりました。
特に、
- migrate をコンテナに含めるか
- 専用の migrate コンテナを作成するか
の選択に迷い、整理する必要がありました。
また、aws ecs execute-command や run-task を活用した migrate の実行方法についても知見をまとめたかったためです。
実際に設定を試しながら学んだことを整理し、今後の運用に活かせるように記事にしました。
ざっくりと、こんなイメージです👇
1. Dockerfile.prod の修正内容
現在の Dockerfile.prod では、migrate のビルドとコンテナへのコピーが適切に行われるよう修正済みです。
FROM golang:1.23.5-alpine3.21 AS builder
WORKDIR /usr/src/app
# 依存関係を取得
COPY go.mod go.sum ./
RUN go mod download && go mod tidy
# ソースコードをコピー
COPY . .
# `server` と `migrate` の両方をビルド
RUN CGO_ENABLED=0 GOOS=linux go build -o server .
RUN CGO_ENABLED=0 GOOS=linux go build -o migrate ./migrate/migrate.go
# 本番環境用の軽量コンテナ
FROM alpine:3.21
# `server` と `migrate` をコンテナにコピー
COPY --from=builder /usr/src/app/server .
COPY --from=builder /usr/src/app/migrate .
# デフォルトの CMD は `server`
CMD ["./server"]
2. migrate のバイナリをコンテナに含める理由
-
ECS で
migrateを実行できるようにするため。 -
アプリケーション (
server) とデータベースのマイグレーション (migrate) を分離できる。 -
ECS の
execute-commandやrun-taskを使用してmigrateを手動または自動で実行可能。
3. ECS で migrate を実行する方法
3.1 aws ecs execute-command を使用する方法
ECS のコンテナ内で migrate を実行するには、以下のコマンドを使用します。
aws ecs execute-command --cluster my-ecs-cluster \
--task <TASK_ID> \
--container app \
--command "/migrate"
3.2 aws ecs run-task を使用する方法
タスクを作成し migrate を実行するには、以下のコマンドを使用します。
aws ecs run-task --cluster my-ecs-cluster \
--task-definition my-ecs-task \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxx],securityGroups=[sg-xxxxx],assignPublicIp=ENABLED}" \
--overrides '{"containerOverrides":[{"name":"app","command":["/migrate"]}]}'
まとめ
-
Dockerfile.prodにmigrateのビルドを追加し、ECS で実行可能に修正。 -
migrateのバイナリをコンテナに含めることで、ECS でexecute-commandやrun-taskを使用して実行可能。 - 本番環境では
migrateコンテナを別途作成し、マイグレーションを確実に管理するのが推奨。
ECS でのマイグレーションを効率的に管理するために、適切な戦略を選択していきたいです!
