はじめに
本記事では、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 でのマイグレーションを効率的に管理するために、適切な戦略を選択していきたいです!