Azure Container Apps でサイドカーコンテナー構成を展開 (Bicep)

# 本記事について

Azure Container App では、ひとつのコンテナーアプリの中で各レプリカ内に複数のコンテナーを動かすことができます。


(多くの場合、組み込みの Dapr を使うか、ひとつの Container Apps 環境上に複数のコンテナーアプリ (各コンテナーアプリ内でひとつの種類のコンテナーを起動) する構成のほうが一般的ではあります。)

この構成は主に、サイドカーコンテナーを使いたいシナリオで使うことになりますが、実際に使うには ARM テンプレートや Bicep を利用することになります。

本記事では、Bicep を使ってサイドカーコンテナーを動かす例を見てみます。下記の図のような構成を作りたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/fa008bc0-0f51-f958-712b-6da5db3ec009.png)


# Bicep によるコンテナーアプリの展開

Bicep を使ってコンテナーアプリを作る方法を見ていきます。

## Container Apps 環境

Container Apps 環境は、Bicep で作成することは Must ではありませんが、下記のようなスクリプトで構築が可能です。

```env.bicep
targetScope = 'resourceGroup'

param envName string  = '<Container Apps 環境の名前>'
param location string = resourceGroup().location

// Container Apps 環境
resource env 'Microsoft.App/managedEnvironments@2024-03-01' = {
  name: envName
  location: location
  properties: {
    workloadProfiles: [
      {
        name: 'Consumption'
        workloadProfileType: 'Consumption'
      }
    ]
    appLogsConfiguration: {
      destination: 'azure-monitor'
    }
  }
}

```

## イメージの準備

メインのコンテナー、サイドカーコンテナーのそれぞれのイメージを、特定の Azure Container Registry にプッシュしておきます。

それぞれイメージの作成時に、メインのコンテナーはイングレスから受信するポートで受けるように、サイドカーコンテナーはそれ以外のポートで受信するようにそれぞれセットしておきます。

## コンテナーアプリ

簡単なサンプルですが、下記のようなスクリプトで作成します。

```app.bicep
targetScope = 'resourceGroup'

param location string = resourceGroup().location
param environmentId string = '<Container Apps 環境のリソースID>'

param containerAppName = '<コンテナーアプリの名前>'
param container1Name = '<コンテナー1の名前>'
param container2Name = '<コンテナー2の名前>'
param container1Image = '<コンテナー1のイメージのパス>'
param container2Image = '<コンテナー2のイメージのパス>'

param acrServer string = '<ACRのサーバー名>'
param acrUsername string = '<ACRのユーザー名>'
param acrPasswordName string = 'acr-password'
param acrPasswordValue string = '<ACRのパスワード>'

resource app 'Microsoft.App/containerApps@2024-03-01' = {
  name: containerAppName
  location: location
  properties: {
    managedEnvironmentId: environmentId
    configuration: {
      ingress: {
        external: true
        targetPort: 80
      }
      secrets: [
        {
          name: acrPasswordName
          value: acrPasswordValue
        }
      ]
      registries: [
        {
          passwordSecretRef: acrPasswordName
          server: acrServer
          username: acrUsername
        }
      ]
    }
    workloadProfileName: 'Consumption'
    template: {
      containers: [
        {
          image: container1Image
          name: container1Name
          resources: {
            cpu: json('0.25')
            memory: '0.5Gi'
          }
        }
        {
          image: container2Image
          name: container2Name
          resources: {
            cpu: json('0.25')
            memory: '0.5Gi'
          }
        }
      ]
      scale: {
        minReplicas: 0
        maxReplicas: 1
      }
    }
  }
}
```

こちらの例だと、Ingress は ポート80 に渡すようにしているので、メインのコンテナーのほうを 80番で受信するように構成しておきます。

# 実行結果

このようなスクリプトを実行すると、ひとつのコンテナーアプリで、レプリカ内に複数のコンテナーを起動させることができます。実行されているコンテナーは Azure Portal の各レプリカの欄で確認可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/46c0491e-f901-4669-8809-28920e7c4cb7.png)

こちらの例では、サイドカーコンテナー側を Port 81 をオープンにしたので、メインのコンテナーに入り、curl を実行してみます。

```:sh
curl "http://localhost:81"
```

すると、81で受信して応答するようにしていたサイドカーコンテナーからのレスポンスを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/b3fa72f7-5a01-8cd2-362f-f1ef360f9921.png)


# 最後に

ARM テンプレート or Bicep のスクリプトを準備する必要はありますが、Container Apps で簡単にサイドカーコンテナー構成が取れることを確認できました。本稿が Container Apps 利用に際しての一助となれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。