Azure Container Apps でのトラフィック分割

既定では、イングレスが有効になっている場合、すべてのトラフィックは、デプロイされた最新のリビジョンにルーティングされます。 コンテナー アプリの 複数のリビジョン モード を有効にすると、受信トラフィックをアクティブなリビジョン間で分割できます。

トラフィック分割は、コンテナー アプリの更新プログラムをテストする場合に便利です。 トラフィック分割を使用して、ブルーグリーン デプロイ または A/B テスト で新しいリビジョンを段階的に導入できます。

トラフィック分割は、各リビジョンにルーティングされるトラフィックの重み (割合) に基づいています。 すべてのトラフィック分割ルールの重みの合計が 100% である必要があります。 リビジョンは、リビジョン名または リビジョン ラベル で指定できます。

この記事では、コンテナー アプリのトラフィック分割ルールを構成する方法について説明します。 次の例を実行するには、複数のリビジョンを含むコンテナー アプリが必要です。

トラフィック分割を構成する

az containerapp ingress traffic set コマンドを使用して、リビジョン間のトラフィック分割を構成します。 リビジョンは、 --revision-weight パラメーターを使用して名前で指定することも、--label-weight パラメーターを使用してリビジョン ラベルで指定することもできます。

次のコマンドでは、各リビジョンのトラフィックの重みを 50% に設定します。

az containerapp ingress traffic set \
    --name <APP_NAME> \
    --resource-group <RESOURCE_GROUP> \
    --revision-weight <REVISION_1>=50 <REVISION_2>=50

<> 内のプレースホルダーの値は、実際の値に置き換えてください。

このコマンドは、リビジョン <LABEL_1> のトラフィックの重みを 80% に設定し、リビジョン <LABEL_2> を 20% に設定します。

az containerapp ingress traffic set \
    --name <APP_NAME> \
    --resource-group <RESOURCE_GROUP> \
    --label-weight <LABEL_1>=80 <LABEL_2>=20

  1. Azure portal でコンテナー アプリに移動します。
  2. 左側のメニューから [リビジョン管理] を選択します。
  3. リビジョン モードが 単一 の場合は、モードを 複数 に設定します。
    1. [リビジョン モード] を選択します。
    2. [複数: 同時に複数のリビジョンをアクティブにする] を選択します。
    3. [適用] を選択します。
    4. リビジョンモード複数 に更新されるまで待ちます。 Screenshot of the revision management revision mode setting.
  4. [非アクティブなリビジョンを表示する] を選択します。
  5. 複数のリビジョンがない場合は、新しいリビジョンを作成できます。
    1. [新しいリビジョンの作成] を選択します。
    2. 既定の設定を使用することも、リビジョンをカスタマイズすることもできます。
    3. リビジョンの 名前/サフィックス を入力します。
    4. [作成] を選択します。 Screenshot of Create and deploy new revision.
    5. リビジョンがデプロイされるまで待ちます。
  6. トラフィックをルーティングするリビジョンに対して [アクティブ] を選択します。
  7. [トラフィック] 列に、各リビジョンにルーティングするトラフィックの割合を入力します。 すべてのトラフィックの合計パーセンテージは100%である必要があります。
  8. [保存] を選択します。 Screenshot of traffic splitting in Revision management.

コンテナー アプリ テンプレートの ingress セクションに configuration.ingress.traffic プロパティを追加して、トラフィックの分割を有効にします。 リビジョンは、 revisionName プロパティを使用して名前で指定することも、label プロパティを使用してリビジョン ラベルで指定することもできます。

次の例では、トラフィックの 100% をデプロイされた最新のリビジョンに設定します。

{
  ...
  "configuration": {
    "ingress": {
      "external": true,
      "targetPort": 80,
      "allowInsecure": false,
      "traffic": [
        {
          "latestRevision": true,
          "weight": 100
        }
      ]
    },
  },

次の例は、名前によって 2 つのリビジョン間でトラフィックを分割する方法を示しています。

{
  ...
  "configuration": {
    "ingress": {
      "external": true,
      "targetPort": 80,
      "allowInsecure": false,
      "traffic": [
          {
              "revisionName": "my-example-app--5g3ty20",
              "weight": 50
          },
          {
              "revisionName": "my-example-app--qcfkbsv",
              "weight": 50
            }
        ],
    },
  },

次の例は、ラベルによって 2 つのリビジョン間でトラフィックを分割する方法を示しています。

{
  ...
  "configuration": {
    "ingress": {
      "external": true,
      "targetPort": 80,
      "allowInsecure": false,
      "traffic": [
          {
              "weight": 50,
              "label": "v-2"
          },
          {
              "weight": 50,
              "label": "v-1"
          }
        ],
    },
  },

ユース ケース

以下のシナリオでは、一般的なユース ケースの構成設定について説明します。 例は JSON 形式で示されていますが、Azure portal または Azure CLI を使用してトラフィック分割を構成することもできます。

迅速な繰り返し

コンテナー アプリの開発を頻繁に繰り返している状況では、デプロイされた最新のリビジョンにすべてのトラフィックを常にシフトするように、トラフィック ルールを設定できます。

次のテンプレート例では、すべてのトラフィックをデプロイされた最新のリビジョンにルーティングします。

"ingress": { 
  "traffic": [
    {
      "latestRevision": true,
      "weight": 100
    }
  ]
}

最新のリビジョンに問題がなければ、ingress の設定を次のように更新することで、トラフィックをそのリビジョンにロックできます。

"ingress": { 
  "traffic": [
    {
      "latestRevision": false, // optional
      "revisionName": "myapp--knowngoodrevision",
      "weight": 100
    }
  ]
}

既存のリビジョンを更新する

トラフィックに対しサービスを 100% 提供している既知の優れたリビジョンがあるが、アプリに更新プログラムを発行したい状況があるとします。 アプリを提供するメイン リビジョンに影響を与えることなく、直接エンドポイントを使って新しいリビジョンをデプロイおよびテストできます。

更新されたリビジョンに問題がなければ、トラフィックの一部を新しいリビジョンに移行して、テストと検証を行うことができます。

次のテンプレートは、トラフィックの 20% を更新されたリビジョンに移動します。

"ingress": {
  "traffic": [
    {
      "revisionName": "myapp--knowngoodrevision",
      "weight": 80
    },
    {
      "revisionName": "myapp--newerrevision",
      "weight": 20
    }
  ]
}

マイクロサービスのステージング

マイクロサービスを構築する場合は、同じアプリに対して運用エンドポイントとステージング エンドポイントを維持することができます。 トラフィックが異なるリビジョンの間で切り替わらないようにするには、ラベルを使います。

次のテンプレート例では、異なるリビジョンにラベルを適用する方法を示します。

"ingress": { 
  "traffic": [
    {
      "revisionName": "myapp--knowngoodrevision",
      "weight": 100
    },
    {
      "revisionName": "myapp--98fdgt",
      "weight": 0,
      "label": "staging"
    }
  ]
}

次のステップ