hekiblo

hekki blog

さくらのクラウド - AppRunで画像変換サービスを作ってみた!

さくらインターネットの伊東です。この記事は さくらインターネット Advent Calendar 2024 17日目の記事です。

本エントリーでは、先日リリースされたさくらのクラウドの新サービスである AppRun を一通り使ってみましたので、レポートさせていただきます。

AppRunとは

AppRunは、コンテナ化されたアプリケーションを簡単にデプロイし、自動的にスケーリングを行うサービスです。インフラ管理の複雑さを気にすることなく、開発者が本来の業務であるアプリケーション開発に集中できる環境を提供します。

2024年12月17日時点ではβ版のサービスであり、制約事項があるものの全機能を無料で利用できます。嬉しいですね。

※詳細は https://manual.sakura.ad.jp/cloud/apprun/about.html をご参照ください。

AppRunを使おう

では早速AppRunを使ってみましょう。まずはこれから作るものをざっくりご紹介します。

https://app-6d264259-85f4-4ee7-85dc-77a90a0cadf4.ingress.apprun.sakura.ne.jp/f=webp,w=1024/apprun001.png

サンプルアプリケーションとして、オブジェクトストレージに保管された画像を変換するWebアプリケーションを用意します。 このアプリケーションをAppRunでホスティングしてみます。

また、アプリケーションのビルドとデプロイをGitHub Actionsで行い、アプリケーションの更新時に自動でAppRunへデプロイできるようにします。

1. サンプルアプリケーションを作成する

まずはAppRunにデプロイするためのサンプルアプリケーションを用意して、コンテナイメージにまとめます。

nginxで「Test1」といった文字列を表示するだけでは面白みがないため、ちょっとしたアプリケーションを作ってみました。

github.com

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を直接叩く方法です。

manual.sakura.ad.jp

4.1.2. APIライブラリを使う

ふたつめはGoで実装されたAppRunのAPIライブラリを使う方法です。

僕が頑張って作ったので使ってもらえると嬉しいです!!!

github.com

4.1.3. Terrafrom SakuraCloud Providerを使う

みっつめは、Terrafromを使う方法です。

内部的に上記で紹介したAPIライブラリを利用してAPIを叩いてコントロールをしていますので、ある意味ではふたつめとの合せ技とも言えます。

こちらも僕が頑張って作ったので使ってもらえると嬉しいです!!!

4.2. TerrafromでAppRun Applicationを作成

本エントリーではTerrafrom SakuraCloud ProviderでAppRun Applicationを作ってみます。

以下のようなtfファイルを作成することでAppRun Applicationを作成できます。

gist.github.com

なお、以下の情報を書き換える必要があることに注意してください。(詳細は ドキュメント を参照してください)

  • container_registry にコンテナレジストリ自体のイメージ名とホスト名、username, password に、で設定したPushとPullの権限を持つユーザーの認証情報
  • AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 環境変数にオブジェクトストレージのアクセスキーの情報
  • BUCKET_NAME はオブジェクトストレージに作成したバケット

また、さくらのクラウドAPIの認証情報を設定しておく必要があります。詳しくは以下の情報を参照してください。

docs.usacloud.jp

5. アクセスする

AppRun Applicationが正しく作成されたら、公開用URLが発行されます。

公開用URLはTerraformでdata sourceを利用するか、APIを叩く方法がありますが、せっかくなのでTerraformで取得してみましょう。

以下のようなtfファイルを作成することで、AppRun Applicationの公開用URLが取得できます。

gist.github.com

実際に動かしてみると以下のようになります。(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

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
    • コンテナイメージのタグは latestcommit idの短縮表記 のふたつ
  • AppRunのApplicationに新しいコンテナイメージを反映

作成済みのyamlは先程紹介したサンプルアプリケーションのリポジトリに含まれますので参考にしてください。

github.com

なお、GitHub リポジトリActions secrets and variables から Repository secrets に以下のシークレットが登録してある前提となっていますのでご注意ください。

おわりに

AppRunによるコンテナのホスティングはかなり簡単に行えたので、アプリケーションの実装に注力できてとてもいい感じでした。特に今回サンプルアプリケーションとしてご紹介したようなステートレスなアプリケーションと相性がいいですね。

また、本エントリーでは紹介できませんでしたが、AppRunにはアプリケーションのバージョンを管理する機能があり、バージョン間でトラフィックを分散する機能があります。 この仕組みを使えばカナリアリリースを行うことも可能で、AppRunが正式版としてリリースされれば、実運用にも耐えられると感じました。

AppRun自体の機能や周辺ツールなど「こんな機能があったら便利だな」というアイディアがありましたら、窓口 からフィードバックをお寄せください。

以上、最後まで読んでいただいてありがとうございました!