apprun-cliを使ってさくらクラウドAppRun β版をActionsで自動deployする

触ってみたという記事がいくつか出ていて、自分も気になったので触ってみました。

さくらのクラウド AppRun β版 とは

manual.sakura.ad.jp

関連記事

作ったもの

github.com

Rust + Axum で最小構成なHello, world!するだけのものです。後述の通りバージョン情報を取るエンドポイントだけ追加しています

アプリケーション作成

マニュアルにある通り、AppRunアプリケーションの作成には最低限以下の作業が必要です。(さくらのクラウドのアカウント作成、電話番号認証などは済んでいる前提)

  1. (事前準備) Webアプリケーションを作成して、コンテナイメージをビルド
  2. さくらのクラウドにコンテナレジストリを作成
  3. 作成したレジストリにコンテナイメージをプッシュ
  4. AppRunアプリケーションを作成

Terraformで作成

普通にWeb UIをポチポチして作業しても出来るけど、Terraformで作成する方法もあるそうなので、極力コントロールパネルを開きたくない人向けに一応書いてみました。

https://github.com/sugyan/apprun-example/tree/main/tf

適当に コンテナレジストリの名前、ユーザのパスワードだけ .tfvars に書いて実行すれば とりあえず構成だけは作れるはずです。

ただこれは単に「コンテナレジストリを作ってそれをAppRunで参照する構成を作る」というだけなので、実際にイメージをビルドしてプッシュする部分は別途必要になります。上記のものでアプリケーションは作成されるけど、実際にはレジストリに何もイメージがないので最初のデプロイは当然失敗します。

apprun-cli でデプロイ

ともあれ構成さえ作ることができれば、あとはCLIで諸々の操作ができるはず。 id:sfujiwara さんの便利CLIを使わせていただきます。

github.com

Jsonnetで現在の設定を引いてきて、それを適宜編集して deploy コマンドに渡すことで新しい設定を反映させることができるようです。

apprun-cli init --name my_web_app --jsonnet > myapp.jsonnet
# edit myapp.jsonnet
apprun-cli deploy --app myapp.jsonnet

Actionsで自動デプロイ

ここまでできるのであれば、あとはもう 「イメージのビルド→プッシュ→デプロイ」を自動化できるはず。

ということでGitHub Actionsでやってみました。

https://github.com/sugyan/apprun-example/blob/main/.github/workflows/deploy.yml

Jsonnetで環境変数から CONTAINER_REGISTRY_IMAGE を使うよう設定しておき、

main branchにpushされたら、

  • Repository を checkout
  • Dockerfile から image を build&push
  • push された image の digest を CONTAINER_REGISTRY_IMAGE にセット
  • apprun-cli でデプロイ

という流れで、自動で最新のコードがAppRunに反映されるようになりました。

バージョン情報を含める一工夫

実際に動いているWebAppが本当に最新のものか分からなくなりがちなので、metadata-action を使って最新の commit の hash や date を取得し、 labelsbuild-args でイメージや環境変数に埋め込むようにしています。

これによってランタイム上で GET /version すると、build した時の commit hashや日付が返ってくるようになりました。

まとめ

とりあえず 2025年2月現在の AppRun β版 での簡単なデプロイ自動化の例を書いてみました。他にも便利な方法をご存知の方がいれば教えてください。 もっと便利にやっていけるよう貢献できるところがあればやっていきたいと思います。