さくらインターネットの伊東です。この記事は さくらインターネット Advent Calendar 2024 17日目の記事です。
本エントリーでは、先日リリースされたさくらのクラウドの新サービスである AppRun を一通り使ってみましたので、レポートさせていただきます。
AppRunとは
AppRunは、コンテナ化されたアプリケーションを簡単にデプロイし、自動的にスケーリングを行うサービスです。インフラ管理の複雑さを気にすることなく、開発者が本来の業務であるアプリケーション開発に集中できる環境を提供します。
2024年12月17日時点ではβ版のサービスであり、制約事項があるものの全機能を無料で利用できます。嬉しいですね。
※詳細は https://manual.sakura.ad.jp/cloud/apprun/about.html をご参照ください。
AppRunを使おう
では早速AppRunを使ってみましょう。まずはこれから作るものをざっくりご紹介します。
サンプルアプリケーションとして、オブジェクトストレージに保管された画像を変換するWebアプリケーションを用意します。 このアプリケーションをAppRunでホスティングしてみます。
また、アプリケーションのビルドとデプロイをGitHub Actionsで行い、アプリケーションの更新時に自動でAppRunへデプロイできるようにします。
1. サンプルアプリケーションを作成する
まずはAppRunにデプロイするためのサンプルアプリケーションを用意して、コンテナイメージにまとめます。
nginxで「Test1」といった文字列を表示するだけでは面白みがないため、ちょっとしたアプリケーションを作ってみました。
imagineは、当社の画像変換・配信サービス ImageFlux のごく一部の画像変換機能を自作してみたものです。jpeg, webp, png, gif への画像変換と、width/heightを指定したサイズ変換ができます。
なお、私はImageFluxの実装は見たことがなく、あくまでも雰囲気を真似しただけのサンプルアプリケーションだとご理解ください 🙏
2. 変換元画像を用意する
上記でご紹介したimagineの変換元画像を用意しておきます。今回は 1.jpg
, 2.jpg
, 3.jpg
と3枚の画像を用意しました。
これらの画像を オブジェクトストレージ のバケットに配置します。
3. コンテナレジストリを作成する
サンプルアプリケーションのコンテナイメージをデプロイする先として、コンテナレジストリ を用意します。
このときに、レジストリ自体の公開範囲は「非公開」に設定し、PushとPullの権限を持つユーザーを作っておくのが望ましいです。
4. AppRun Applicationを作成する
前準備はここまでにして、ついにAppRun Applicationを作成します。
4.1. AppRun Applicationの作成手段
Applicationを作成する方法は主に3通りあります。
4.1.1. APIを直接叩く
ひとつめはAppRunが提供する操作用のAPIを直接叩く方法です。
4.1.2. APIライブラリを使う
ふたつめはGoで実装されたAppRunのAPIライブラリを使う方法です。
僕が頑張って作ったので使ってもらえると嬉しいです!!!
4.1.3. Terrafrom SakuraCloud Providerを使う
みっつめは、Terrafromを使う方法です。
内部的に上記で紹介したAPIライブラリを利用してAPIを叩いてコントロールをしていますので、ある意味ではふたつめとの合せ技とも言えます。
こちらも僕が頑張って作ったので使ってもらえると嬉しいです!!!
4.2. TerrafromでAppRun Applicationを作成
本エントリーではTerrafrom SakuraCloud ProviderでAppRun Applicationを作ってみます。
以下のようなtfファイルを作成することでAppRun Applicationを作成できます。
なお、以下の情報を書き換える必要があることに注意してください。(詳細は ドキュメント を参照してください)
container_registry
にコンテナレジストリ自体のイメージ名とホスト名、username
,password
に、で設定したPushとPullの権限を持つユーザーの認証情報AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
環境変数にオブジェクトストレージのアクセスキーの情報BUCKET_NAME
はオブジェクトストレージに作成したバケット名
また、さくらのクラウドのAPIの認証情報を設定しておく必要があります。詳しくは以下の情報を参照してください。
5. アクセスする
AppRun Applicationが正しく作成されたら、公開用URLが発行されます。
公開用URLはTerraformでdata sourceを利用するか、APIを叩く方法がありますが、せっかくなのでTerraformで取得してみましょう。
以下のようなtfファイルを作成することで、AppRun Applicationの公開用URLが取得できます。
実際に動かしてみると以下のようになります。(idはマスクしてあります)
$ terraform apply data.sakuracloud_apprun_application.imagine: Reading... sakuracloud_apprun_application.imagine: Refreshing state... [id=xxxxxxxxxxxx] data.sakuracloud_apprun_application.imagine: Read complete after 1s [id=xxxxxxxxxxxx] No changes. Your infrastructure matches the configuration. Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed. Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: imagine = "https://app-6d264259-85f4-4ee7-85dc-77a90a0cadf4.ingress.apprun.sakura.ne.jp"
先程の手順でオブジェクトストレージにアップロードした 1.jpg
をWebP形式・幅を1024にリサイズして取得してみます。
https://app-6d264259-85f4-4ee7-85dc-77a90a0cadf4.ingress.apprun.sakura.ne.jp/f=webp,w=1024/1.jpg
にアクセスすると、AppRun上でホスティングされたアプリケーションにアクセスできるので、ぜひ試してみてください!!
GitHub Actionsでデプロイをしよう
発展して、アプリケーションを更新した際にGitHub Actionsでデプロイをできるようにしてみます。デプロイの流れは以下のようになっています。
- mainブランチにpushされたときに実行
- コンテナイメージのビルド
- ビルドしたコンテナイメージをコンテナレジストリにPush
- コンテナイメージのタグは
latest
とcommit idの短縮表記
のふたつ
- コンテナイメージのタグは
- AppRunのApplicationに新しいコンテナイメージを反映
作成済みのyamlは先程紹介したサンプルアプリケーションのリポジトリに含まれますので参考にしてください。
なお、GitHub リポジトリの Actions secrets and variables
から Repository secrets
に以下のシークレットが登録してある前提となっていますのでご注意ください。
APPLICATION_ID
: AppRun ApplicationのID。公開用URL同様に、APIやTerraformから取得することができます。SAKURACLOUD_ACCESS_TOKEN
: さくらのクラウドのアクセストークン。SAKURACLOUD_ACCESS_TOKEN_SECRET
: さくらのクラウドのアクセストークンシークレット。SAKURACR_USER
: コンテナレジストリのユーザー名SAKURACR_PASSWORD
: コンテナレジストリのパスワード
おわりに
AppRunによるコンテナのホスティングはかなり簡単に行えたので、アプリケーションの実装に注力できてとてもいい感じでした。特に今回サンプルアプリケーションとしてご紹介したようなステートレスなアプリケーションと相性がいいですね。
また、本エントリーでは紹介できませんでしたが、AppRunにはアプリケーションのバージョンを管理する機能があり、バージョン間でトラフィックを分散する機能があります。 この仕組みを使えばカナリアリリースを行うことも可能で、AppRunが正式版としてリリースされれば、実運用にも耐えられると感じました。
AppRun自体の機能や周辺ツールなど「こんな機能があったら便利だな」というアイディアがありましたら、窓口 からフィードバックをお寄せください。
以上、最後まで読んでいただいてありがとうございました!