Edited at

RailsのmigrateをAWS Fargateに移行した時の話


前提


  • ECSでRailsアプリが起動されていること

  • migrateはfargateでやってなかった

  • テスト環境でやること


作業内容

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs_run_task_fargate.html

これ見ながら作業する。実際は、コマンドでやると何をしているのかよくわからないので、まずはGUIでやる。把握した後にコード化するというのが良い。そうすることで、全てのオプションやらパラメータの世界が見えてくる。


念の為、新規DBを作成

t2.microなどで良い

何らかのエラーが出たときの切り分けにしたい。

インスタンスが作れたら、アプリケーションデプロイ用のタスクにDBの環境変数を設定する(Systems Managerが使えるなら ECS containerから valueFrom で呼び出せるのでjson自体をgit管理できる。AWSでマネージドされているのが良い)


taskを定義する

実際は、コマンドなどを付与したりするのでENTRYPOINTで設定している。

これは、Initial,Migrate,Seedそれぞれリビジョンで分けるだけで良い。Initial,Seed,Migrateの順で作る。

※なお、実際の運用ではInitialやらSeedは使わない。これは、今回新規でRDSを立ち上げたので必要になっただけ。LATESTリビジョンだけがあれば良い。

key
value

ネットワークモード
awsvpc

互換性が必要
FARGATE

タスクメモリ(GB)
0.5GB

タスクCPU(vCPU)
0.25 vCPU


containerの環境設定(Initial)

key
value

エントリポイント
bundle,exec,rails,db:create

作業ディレクトリ

/app(アプリがある場所)

  "containerDefinitions": [

{
"entryPoint": [
"bundle",
"exec",
"rails",
"db:create"
],
"workingDirectory": "/app"
}
]


containerの環境設定(Migrate)

key
value

エントリポイント
bundle,exec,rails,db:migrate

作業ディレクトリ

/app(アプリがある場所)

  "containerDefinitions": [

{
"entryPoint": [
"bundle",
"exec",
"rails",
"db:migrate"
],
"workingDirectory": "/app"
}
]


containerの環境設定(Seed)

key
value

エントリポイント
bundle,exec,rails,db:seed,a=b

作業ディレクトリ

/app(アプリがある場所)

  "containerDefinitions": [

{
"entryPoint": [
"bundle",
"exec",
"rails",
"db:seed",
"a=b"
],
"workingDirectory": "/app"
}
]


taskを実行する


  • VPCを設定、subnetを設定

  • ネットに繋がるものを設定しておく


2つエラーが発生した


  • メモリ不足エラー → メトリクスをチェックして、スペックの問題ならスペックを上げる


    • コンテナインスタンスのリソースから、メモリ使用量を見る



  • ECRからイメージをpullしてこれず、エラー → インターネットにつながるネットワークを設定する


結果を見る


  • PROVISIONING→PENDING→RUNNING→STOPのようなフローだったような気がする

  • タスクのStoppedの中でログを確認する。

  • Migrateタスクならば、以下のようなログが吐かれているだろう。

2019-10-09 18:16:45D, [2019-10-09T09:16:45.290941 #1] DEBUG -- : [1m[35m (572.8ms)[0m [1m[35mCREATE DATABASE "test_database" ENCODING = 'unicode'[0m

2019-10-09 18:16:45Created database 'test_database'


  • 実際にアプリケーション側でも確認する。

  • 問題がなければCodeDeployやCIなどで連携する。