はじめに
ECS Exec を活用することで、ECS のデプロイを変更することなく、手動でコンテナ内に入りデータベースのマイグレーションを実行できます。
本記事では、その手順を詳しく解説します。
個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。
書こうと思ったきっかけ
最近、ECS で運用されているアプリケーションのデータベースマイグレーションを実施する機会がありました。
その際、デプロイの手順を変更せずに手軽に実施できる方法として ECS Exec を活用しました。
この経験を基に、ECS Exec を使った手動マイグレーションの方法を共有したいと思い、この記事を書きました。
ECS Exec を使って手動マイグレーションを実行する手順
1. ECS Exec の事前設定
ECS Exec を利用して手動でマイグレーションを行うために、以下の事前設定を行います。
(1) ECS Exec が有効化されているか確認
ECS Exec を使用するには、タスク定義の enableExecuteCommand
が true
になっている必要があります。以下のコマンドで有効化できます。
ECS サービスを更新する場合:
aws ecs update-service --cluster your-cluster \
--service your-service \
--enable-execute-command
タスク起動時に設定する場合:
aws ecs run-task --cluster your-cluster \
--task-definition your-task \
--enable-execute-command
(2) 必要な IAM ポリシーを付与
ECS Exec を利用するには、IAM ロールに以下のポリシーを追加します。
{
"Effect": "Allow",
"Action": [
"ecs:ExecuteCommand",
"ssm:StartSession",
"ssm:SendCommand",
"ssm:GetCommandInvocation"
],
"Resource": "*"
}
2. 実行中の ECS タスクに接続
まず、現在実行中のコンテナを確認します。
aws ecs list-tasks --cluster your-cluster
例:
{
"taskArns": [
"arn:aws:ecs:region:account-id:task/your-cluster/task-id"
]
}
この task-id
を使用して、コンテナに接続します。
aws ecs execute-command \
--cluster your-cluster \
--task task-id \
--container your-container-name \
--interactive \
--command "/bin/sh"
これで ECS コンテナのシェルに入ることができます。
3. コンテナ内でマイグレーションを実行
ECS コンテナ内で、アプリケーションに応じたマイグレーションコマンドを実行します。
Django(Python)
python manage.py migrate
Flask(Alembic)
flask db upgrade
Node.js(TypeORM / Sequelize)
npx sequelize-cli db:migrate # Sequelize
typeorm migration:run # TypeORM
4. 接続を終了
マイグレーションが完了したら、以下のコマンドでコンテナシェルを終了します。
exit
まとめ
- ECS Exec を有効化
- タスク一覧を取得し、実行中のコンテナを特定
-
aws ecs execute-command
でコンテナに接続 - マイグレーションコマンドを実行
- 完了後に
exit
で終了
この方法を使えば、ECS のデプロイを変更せずに簡単に手動でマイグレーションを実行できます!