前書き
- 社内勉強会用の資料です
- 自分が発表できるレベルの文章と内容しかありません
- 間違ってたらごめんなさい
Amazon ECS とは
- docker-compose.ymlを元にコンテナ定義、タスク定義が作成できる
- cluster, serviceが作成済みであれば、このタスク実行して!と投げるだけで良いのでとても楽
ecs-cli の使い方
コマンド例
- 設定作成
ecs-cli configure --region ap-northeast-1 --cluster ${cluster-name} --config-name ${config-name}
- タスク作成
ecs-cli compose --project-name ${service-name} --file ${compose-path} service create --cluster-config ${config-name}
- タスクで任意のコマンドを実行する
ecs-cli compose --project-name ${service-name} run --cluster-config ${config-name} ${service-name} "echo Hello"
- デプロイ
ハマった点: ecs-cli compose run ${cmd}
は $cmd の終了コードを取得できない
期待した動作
- ecs-cliくん!このコマンドをそのタスクで実行して!
- 開発者さん!了解やで!......(待機)
- よっしゃ!ちゃんと終わったで! or ほーん!?なんか異常終了したで!?
- ecs-cliくんあざ!終了状態は......(echo $?) なるほどな......(暗黒微笑)
実際の動作
- ecs-cliくん!このコマンドをそのタスクで実行して!
- 開発者さん!了解やで!
- よっしゃ!**「このコマンドをそのタスクで実行しろと命令する」**ことが終わったで!(終了コード0)
- 違うそうじゃない(鈴木雅之)
ecs-cli compose run "false"
的なことをしても終了コードが0になる <- やばい
何がやばいの
- 完了しても、失敗しても、終了コードが0(異常なし)になる
- CIで失敗が取れないのでめちゃくちゃ気づきにくい
- 普段からCIを信用しているとなおさら(信用しないはしたくない)
実際にあったケース
CIで、テストが通ったら手動でapproveして自動デプロイさせる、ということをしている。流れこんな感じ。
- テスト(CIのdocker imageで実行される)
- タスク定義登録(CIのdocker imageで実行される)
- ecs-cliでdb:migrate(タスク定義に設定されているdocker imageで実行される)
- ここが絶対通る(成功とは言っていない)ようになる
- デプロイ(CIのdocker imageで実行される)
- タイミングによってはdb:migrateが正常終了しない場合でもデプロイされることがある
-
db:migrateが失敗していてもデプロイが実行される
- デプロイ自体が失敗すればまだ良いが、そのままデプロイされてしまった場合、いつ落ちるか分からない状況に気づかず運用することになる
- やばい!!!!!
この時の原因は
タスク内で実行したコマンドの終了コードが取れるものを使おう
というわけでecspresso
ecspresso でコマンドを実行してみる
-
ecspresso run --config ${config-path} --overrides="$overrides"
- 直接コンテナに上書きする
- 文字列の配列にする
"echo hoge"
->"echo", "hoge"
こんな感じでやってます。
cmd=$(echo ${raw_cmd} | sed -e "s/^/\"/" -e "s/\$/\"/" -e "s/ /\", \"/g")
overrides=$(cat <<OVERRIDES
{
"ContainerOverrides": [
{
"Command": [
$cmd
],
"Name": "app"
}
]
}
OVERRIDES
)
ecspresso run --config ${config-path} --overrides="$overrides"
ecspresso の詳細
開発者の方がアドベントカレンダーとして詳細な使い方を記載しています。
嬉しかった点
- 設定をコマンドの引数として設定する必要が無くなった
- serviceごとに存在するconfig.ymlを指定するだけで良い
- 既存リソースの設定をinitコマンドで自動出力できるので、既にECSを使用していれば導入がとても楽
- 環境変数の扱いがめっちゃ楽
- docker imageのrevisionなどを環境変数で渡す必要があったりした
- https://zenn.dev/fujiwara/articles/ecspresso-20201205
- 手軽なお布施手段がある 買いましょう
そのうち
まがじーんで清書したい気持ちが湧いてきたのでするかも