0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

個人的備忘録:ECS で migrate を動かすために Dockerfile を修正し、migrate 専用コンテナを立ち上げてみた

Last updated at Posted at 2025-02-20

はじめに

本記事では、Dockerfile.prod に migrate のビルドと実行を組み込む方法 について解説します。

ECS 上で migrate を適切に動作させるために、Docker イメージ内に migrate を含める設定 を行いました。

また、aws ecs execute-commandaws ecs run-task を用いた migrate の実行方法についても説明します。

本番環境でのマイグレーション管理をスムーズに行うための参考になれば幸いです。

書こうと思ったきっかけ

ECS でアプリケーションをデプロイする際、データベースのマイグレーションをどのように管理するか が課題になりました。
特に、

  • migrate をコンテナに含めるか
  • 専用の migrate コンテナを作成するか

の選択に迷い、整理する必要がありました。

また、aws ecs execute-commandrun-task を活用した migrate の実行方法についても知見をまとめたかったためです。

実際に設定を試しながら学んだことを整理し、今後の運用に活かせるように記事にしました。

ざっくりと、こんなイメージです👇

Screenshot 2025-02-21 at 6.39.35.png

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-commandrun-task を使用して migrate を手動または自動で実行可能

3. ECSmigrate を実行する方法

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.prodmigrate のビルドを追加し、ECS で実行可能に修正。
  • migrate のバイナリをコンテナに含めることで、ECS で execute-commandrun-task を使用して実行可能。
  • 本番環境では migrate コンテナを別途作成し、マイグレーションを確実に管理するのが推奨。

ECS でのマイグレーションを効率的に管理するために、適切な戦略を選択していきたいです!

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?