はじめに
エキサイト株式会社 バックエンドエンジニアの山縣です。
私たちのチームでは、Azure Container Appsを使用して、バックエンドサーバーを構築しています。 Azure Container Appsでは、主にリソース使用量によって課金されます。 そのため、開発環境やステージ環境など、常時稼働しないようなコンテナアプリでは、 使用しない深夜帯や休日に稼働を停止して、リソースを使用しないようにするのが望ましいです。
本記事では、GitHub Actionsを使用したリビジョンのアクティブ化 / 非アクティブ化について紹介します。
概要
Azure Container Appsのリビジョンは、レプリカ数が0だったり、非アクティブな状態だったりすれば、課金されることはありません。 そのため、Azure Container Appsを使用しない時間は、課金されないようにしたいです。 これを、azコマンドとGitHub Actionsのワークフローで実現します。
非アクティブなリビジョンには課金されません。 最大 100 個のリビジョンを持つことができ、その後は、最も古いリビジョンが消去されます。
注意点
本記事では、リビジョンモードを「単一リビジョンモード」に設定して、動作させています。 「複数リビジョン モード」では、うまく動かないことが想定されるため、注意してください。
定期実行
GitHub Actionsのschedule
イベントを使用して、定期実行のワークフローを作成ました。
深夜帯に課金されないために、21時に非アクティブ化、9時にアクティブ化をしています。
また、ワークフローを実際に作成するときには、以下の2点に注意してください。
- 指定した時間ピッタリには実行されない
- USTで時間指定する
アクティブ化のワークフロー
--all
と--query '[?properties.trafficWeight == 100].[name]'
オプションを指定して実行すると、
「重みが100のリビジョン名」を取得することができます。
これにより、「最後にアクティブ状態であったリビジョンをアクティブ化する」ことができるようになります。
アクティブ化のワークフローを次に示します。
コンテナアプリ名とリソースグループは、実際の値に置換してください。
また、Azureの認証で使用しているsecrets.AZURE_CREDENTIALS
については、次の記事を参考にしてください。
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