LoginSignup
2
0

More than 3 years have passed since last update.

【勉強会資料】ecs-cliでハマったこととecspressoの紹介

Posted at

前書き

  • 社内勉強会用の資料です
  • 自分が発表できるレベルの文章と内容しかありません
  • 間違ってたらごめんなさい

Amazon ECS とは

スクリーンショット 2021-02-26 13.15.32.png

  • 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 の終了コードを取得できない

期待した動作

  1. ecs-cliくん!このコマンドをそのタスクで実行して!
  2. 開発者さん!了解やで!......(待機)
  3. よっしゃ!ちゃんと終わったで! or ほーん!?なんか異常終了したで!?
  4. ecs-cliくんあざ!終了状態は......(echo $?) なるほどな......(暗黒微笑)

実際の動作

  1. ecs-cliくん!このコマンドをそのタスクで実行して!
  2. 開発者さん!了解やで!
  3. よっしゃ!「このコマンドをそのタスクで実行しろと命令する」ことが終わったで!(終了コード0)
  4. 違うそうじゃない(鈴木雅之)

ecs-cli compose run "false"的なことをしても終了コードが0になる <- やばい

何がやばいの

  • 完了しても、失敗しても、終了コードが0(異常なし)になる
  • CIで失敗が取れないのでめちゃくちゃ気づきにくい
    • 普段からCIを信用しているとなおさら(信用しないはしたくない)

実際にあったケース

CIで、テストが通ったら手動でapproveして自動デプロイさせる、ということをしている。流れこんな感じ。

  1. テスト(CIのdocker imageで実行される)
  2. タスク定義登録(CIのdocker imageで実行される)
  3. ecs-cliでdb:migrate(タスク定義に設定されているdocker imageで実行される)
    • ここが絶対通る(成功とは言っていない)ようになる
  4. デプロイ(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 の詳細

開発者の方がアドベントカレンダーとして詳細な使い方を記載しています。

嬉しかった点

そのうち

まがじーんで清書したい気持ちが湧いてきたのでするかも

2
0
0

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
2
0