前提
- 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でマネージドされているのが良い。暗号化したいならKMSを利用する)
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などで連携する。