Blog

GitHub ActionsでPushしたついでにタスク定義も作ってほしい!

はじめに

おはようございます。IWSです

私達のチームではECRへのイメージのビルド、プッシュにGitHub Actionsを使っているのですが、ついでにECSのタスク定義も新しいのを作ってくれると便利なタイミングがあるかな〜とおもったので試しに作ってみました。せっかくなのでどういうのを作ったか書き残しておこうかなと思います。

タスク定義を作る

あらかじめビルドしてECRにプッシュするところまでは出来ている状態で作っていきます。

タスク定義の作成には AWS CLI の aws ecs register-task-definition を使います。
オプションを1つずつ指定していっても使えますが、大変なのでタスク定義のJSONファイルを渡す方法を使いましょう。

既存のタスク定義のJSONを取得する

タスク定義のJSONファイルを1から用意するのは面倒くさいので、今回は元々あるタスク定義を持ってきて必要な部分だけを変えて作ろうかと思います。まずは既存のタスク定義を取得するところからはじめましょう。

タスク定義の取得には aws ecs describe-task-definition --task-definition <タスク定義の名前> を使います。
コマンドを叩くとこのようなJSONが取得できるはずです。

これをそのまま使えたら楽なのですが、残念ながらこのままだと使えないので少し整えてあげる必要があります。

JSONを整える

やることは

  • taskDefinitionの中身を取り出す
  • taskDefinitionArn を削除
  • revision を削除
  • status を削除
  • requiresAttributes を削除
  • compatibilities を削除
  • registeredAt を削除
  • registeredBy を削除

です。

GitHub Actions ではデフォルトで使える jq コマンドで整形すると簡単です。

jqコマンドで整形後のタスク定義JSON

これでタスク定義が作れるJSONになりました!

イメージを変える

ここまでで aws ecs register-task-definition に渡せるJSONファイルが用意できました。ですが、中身の設定は当然前のタスク定義のままです。そのため、このままタスク定義を作成しても前と同じものが出来てしまうだけになります。

今度は中身の設定を変えていきましょう!

今回は使用するイメージ(containerDefinitions[0].image)のタグの部分だけを変更します。

containerDefinitions[0].image はこうなっています

: の後がタグになっているので split を使って古いタグを取得して置き換えてしまいましょう

古いタグが取得できたらあとは新しく設定するタグと置き換えるだけです。

jq の sub() を使うことで対象の部分を置き換えることができます。jqはなんでもできますね……

これで新しいタスク定義のJSONファイルができました!

タスク定義を作成

ここまできたらあとは完成したJSONファイルを使ってタスク定義を作るだけです。

--cli-input-json を使うことでパラメーターをJSONファイルで渡すことが出来ます。

このコマンドが成功すればタスク定義にあたらしいリビジョン番号が増え、設定に新しいイメージタグが書かれているはずです。
どうでしょう?タスク定義は出来ましたか?

あとはこのタスク定義を使って aws ecs update-service なりしてあげれば、新しいタスク定義を使用したECSタスクが立ち上がってくると思います。

最後に自分の作ったコードを一部載せておくので良ければ参考にしてください。

タスク定義作成部分コード

事前にAWS credentialsやイメージのビルドなどをしてください。

まとめ

今回はGitHub Actionsでのタスク定義の作成について書きました。
最近はGitHub Actionsを使ってAWSのリソースを作ったりイメージをPushしたりいろいろなことをやったりしています。今回もそのなかで試しにやってみたことを記事にしてみました。いつか何かしらの参考になればうれしいです。

ここまでお読みいただきありがとうございました!

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

Tech TalkやMeetUpも開催しております!
こちらもお気軽にご応募ください!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!