APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Container Appsのリビジョン機能で安全にアプリをリリースする

はじめに

こんにちは、ACS事業部の吉川です。
最近2回連続でAzure Container AppsのCI/CDについて紹介してきました。

techblog.ap-com.co.jp

techblog.ap-com.co.jp

これまで紹介してきた内容は、アプリケーションを最新のものに置き換える というものでした。
実際のアプリケーションリリースのシーンでは、

「エンドユーザーがアクセスする前に動作確認したい!」
「一部のトラフィックのみを新バージョンに向けたい!」
「リリースに問題があったら即座に切り戻したい!」

といったご要望もあるかと思います。

そんなご要望を解決するのがContainer Appsの リビジョン機能 です。

リビジョンとは

Container Appsにおけるリビジョンとは、

  • 起動するコンテナイメージ
  • リソースの割り当て
  • スケーリング設定

などの設定値がまとまったものです。
App Serviceを使ったことがある方には、『デプロイスロットのようなもの』と捉えていただくのがよいかと思います。(似て非なるものではあるのですが、イメージとしては近いかなと)

このリビジョンを活用することで、アプリケーションリリース手法の幅を広げることができます。

なお、Container Appsはこのリビジョンを 最大100個 作ることができます。

docs.microsoft.com

環境の作成

ここから今回の説明用の環境を作成していきます。

リソースグループ・ACR・Container Apps環境を作るところまでは前回と同様です。

# リソース名とリージョンの定義
rgName=rg-sample
acrName=acrsample
location=japaneast
caeName=cae-sample

# リソースグループ作成
az group create --location $location --name $rgName

# ACR作成
az acr create --name $acrName -g $rgName -l $location --sku Basic

# Container Apps環境作成
az containerapp env create --name $caeName -g $rgName -l $location

Container Appsを作成する際に、revisions-mode オプションに mutiple を指定します。このオプションにより、1つのContainer Apps内に複数のリビジョンを共存させることができます。
また、revision-suffix オプションでリビジョンに名前を付けることができます。必須ではないですが、ここでは blue と指定しました。

# リソース名の定義
acaName=aca-sample

# Container Apps作成
az containerapp create -n $acaName -g $rgName \
  --environment $caeName \
  --ingress external \
  --target-port 80 \
  --registry-identity system \
  --registry-server ${acrName}.azurecr.io \
  --revisions-mode multiple \
  --revision-suffix blue

ポータルからできあがったリソースを確認すると、<Container Apps名>--<リビジョンサフィックス> という名前でリビジョンが作成されています。 今回の例ですと、aca-sample--blue という名前です。

新リビジョンの作成

作成したContainer Appsに新しいリビジョンを追加してみましょう。

と、その前にIngressの設定を変更しておきます。
デフォルトのIngress設定は 最新のリビジョンに100%振り向ける という設定となっています。

az containerapp ingress traffic show -g $rgName -n $acaName
[
  {
    "latestRevision": true,
    "weight": 100
  }
]

このまま新しいリビジョンを追加すると、即座に新しいリビジョンに全トラフィックが流れてしまいます。
以下のようにして、最初にデプロイした blue リビジョンに100%振り向けるように設定しておきましょう。

az containerapp ingress traffic set -g $rgName -n $acaName \
  --revision-weight aca-sample--blue=100
[
  {
    "latestRevision": true,
    "weight": 0
  },
  {
    "revisionName": "aca-sample--blue",
    "weight": 100
  }
]

Ingressの設定が終わったら新しいリビジョンを作成します。
既存のリビジョンをコピーして変更箇所を指定する形で作成します。下記コマンド例では blue リビジョンをベースにコンテナーイメージのみを nginx:latest に変更しています。
ここでは、新たに作成するリビジョンのサフィックスを green としました。

az containerapp revision copy -g $rgName -n $acaName \
  --image nginx:latest \
  --from-revision aca-sample--blue \
  --revision-suffix green

ポータルから確認すると、リビジョンが増えていることが確認できます。

リビジョンを指定してアクセスする

前項までの設定で、新しく追加した green リビジョンのトラフィックの値は 0% となっており、通常のアクセスは全て blue リビジョンに向くようになっています。
Container Appsは通常のURL以外にリビジョンごとに固有のURLを持っており、トラフィックが0%の状態であっても green リビジョンにアクセスできます。

ポータルで リビジョンの詳細 内にある リビジョン URL がそれにあたります。

CLIでは以下のコマンドで確認可能です。

az containerapp revision show -g $rgName -n $acaName \
  --revision aca-sample--green \
  --query properties.fqdn -o tsv

このリビジョンURLを利用することで、新しいバージョンのアプリをデプロイ後、ユーザーリクエストの切り替え前に動作確認を行う ことができます。

トラフィックの比率を変更する。

ポータルのトラフィックの項目がパーセント表記なことから既にお気づきかもしれませんが、リビジョンに対するトラフィックの割り当て比率を指定することができます。
例えば以下のようにすることで、全体の20%のトラフィックのみを green リビジョンに向ける ことができます。

CLIでは以下のように設定します。各リビジョンに指定した値の合計が100になるように設定しましょう。

az containerapp ingress traffic set -g $rgName -n $acaName \
  --revision-weight aca-sample--blue=80 aca-sample--green=20

注意点として、トラフィックの振り分けは比率のみでの設定となり、セッションアフィニティなどの高度な処理には対応していません。
特定のユーザーのみこちらのリビジョンへ…といった制御はできないので、使いどころは要検討です。

また、トラフィックの比率変更を使うことで以下のようなこともできます。
新バージョンのアプリをデプロイして100%のトラフィックを振り向け、

az containerapp ingress traffic set -g $rgName -n $acaName \
  --revision-weight aca-sample--blue=0 aca-sample--green=100

何か問題が発覚した時には すぐに元のバージョンへ切り戻し ます。

az containerapp ingress traffic set -g $rgName -n $acaName \
  --revision-weight aca-sample--blue=100 aca-sample--green=0

元のバージョンのコンテナが起動したままの状態を維持できるため、デプロイし直すよりも素早く切り戻しができます。

不要なリビジョンの削除

旧リビジョンのトラフィックを0%にしていても、コンテナーが起動していれば課金の対象となります。動作確認が終わり不要となったタイミングで忘れずに旧リビジョンを停止しておくようにしましょう。
リビジョンを 非アクティブ化 することで停止することができます。

ポータルで操作する場合は、停止するリビジョンの アクティブ のチェックを外し保存します。

CLIの場合は以下のコマンドで非アクティブ化できます。

az containerapp revision deactivate -g $rgName -n $acaName --revision aca-sample--blue

おわりに

Container Appsのアプリケーションリリース時に利用できるリビジョン機能について紹介しました。
CI/CDツールで利用しやすいよう各操作のCLIでのコマンド例も付けていますので、ぜひご活用いただければと思います。

本記事の投稿者: 吉川 俊甫
AKSをメインにインフラ系のご支援を担当しています。AKS以外のコンテナもぼちぼち触っていきます。
Shunsuke Yoshikawa - Credly