【Azure Container Apps】リビジョンのアクティブ化 / 非アクティブ化を自動化した

はじめに

エキサイト株式会社 バックエンドエンジニアの山縣です。

私たちのチームでは、Azure Container Appsを使用して、バックエンドサーバーを構築しています。 Azure Container Appsでは、主にリソース使用量によって課金されます。 そのため、開発環境やステージ環境など、常時稼働しないようなコンテナアプリでは、 使用しない深夜帯や休日に稼働を停止して、リソースを使用しないようにするのが望ましいです。

本記事では、GitHub Actionsを使用したリビジョンのアクティブ化 / 非アクティブ化について紹介します。

概要

Azure Container Appsのリビジョンは、レプリカ数が0だったり、非アクティブな状態だったりすれば、課金されることはありません。 そのため、Azure Container Appsを使用しない時間は、課金されないようにしたいです。 これを、azコマンドとGitHub Actionsのワークフローで実現します。

非アクティブなリビジョンには課金されません。 最大 100 個のリビジョンを持つことができ、その後は、最も古いリビジョンが消去されます。

docs.microsoft.com

注意点

本記事では、リビジョンモードを「単一リビジョンモード」に設定して、動作させています。 「複数リビジョン モード」では、うまく動かないことが想定されるため、注意してください。

定期実行

GitHub Actionsのscheduleイベントを使用して、定期実行のワークフローを作成ました。 深夜帯に課金されないために、21時に非アクティブ化、9時にアクティブ化をしています。

また、ワークフローを実際に作成するときには、以下の2点に注意してください。

  1. 指定した時間ピッタリには実行されない
  2. USTで時間指定する

docs.github.com

アクティブ化のワークフロー

--all--query '[?properties.trafficWeight == 100].[name]'オプションを指定して実行すると、 「重みが100のリビジョン名」を取得することができます。 これにより、「最後にアクティブ状態であったリビジョンをアクティブ化する」ことができるようになります。

アクティブ化のワークフローを次に示します。 コンテナアプリ名とリソースグループは、実際の値に置換してください。 また、Azureの認証で使用しているsecrets.AZURE_CREDENTIALSについては、次の記事を参考にしてください。

docs.microsoft.com

name: Activate

on:
  schedule:
    - cron: '0 0 * * 1-5'

jobs:
  activate:
    runs-on: ubuntu-latest
    env:
      AZURE_CONTAINER_APPS_NAME: sample-api
      AZURE_CONTAINER_APPS_RESOURCE_GROUP: sample

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Azure Login
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - name: Activate
        uses: Azure/cli@v1
        with:
          inlineScript: |
            az extension add --name containerapp --upgrade

            REVISION=$(az containerapp revision list \
                --name ${{ env.AZURE_CONTAINER_APPS_NAME }} \
                --resource-group ${{ env.AZURE_CONTAINER_APPS_RESOURCE_GROUP }} \
                --all \
                --output tsv \
                --query '[?properties.trafficWeight == `100`].[name]')

            az containerapp revision activate \
                --resource-group ${{ env.AZURE_CONTAINER_APPS_RESOURCE_GROUP }} \
                --revision ${REVISION}

非アクティブ化のワークフロー

--query '[].[name]オプションを指定して実行すると、「現在アクティブ状態のリビジョン名」を取得することができます。 これを使用して、非アクティブ化が行われています。

コンテナアプリ名とリソースグループは、実際の値に置換してください。

name: Deactivate

on:
  schedule:
    - cron: '0 12 * * 1-5'

jobs:
  deactivate:
    runs-on: ubuntu-latest
    env:
      AZURE_CONTAINER_APPS_NAME: sample-api
      AZURE_CONTAINER_APPS_RESOURCE_GROUP: sample

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Azure Login
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - name: Deactivate
        uses: Azure/cli@v1
        with:
          inlineScript: |
            az extension add --name containerapp --upgrade

            REVISION=$(az containerapp revision list \
                --name ${{ env.AZURE_CONTAINER_APPS_NAME }} \
                --resource-group ${{ env.AZURE_CONTAINER_APPS_RESOURCE_GROUP }} \
                --output tsv \
                --query '[].[name]')

            az containerapp revision deactivate \
                --resource-group ${{ env.AZURE_CONTAINER_APPS_RESOURCE_GROUP }} \
                --revision ${REVISION}

おわりに

本記事では、GitHub Actionsを使用したリビジョンのアクティブ化 / 非アクティブ化について紹介しました。 Azure Container Appsの導入事例は少ないため、公式ドキュメントを読み込んで、手を動かして試す日々が続いていました。 本記事で取り上げた手法がお役に立てれば幸いです。

採用アナウンス

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しています。 また、長期インターンも歓迎しています。

カジュアル面談からもOKです。少しでもご興味がございましたら、お気軽にご連絡頂ければ幸いです。

▼ 募集職種一覧 ▼ www.wantedly.com