GitHub Actions を使用して Azure Container Apps にデプロイする

Azure Container Apps を使用すると GitHub Actions を使用して、コンテナー アプリにリビジョンを発行できます。 コミットが GitHub リポジトリにプッシュされると、コンテナー レジストリ内のコンテナー イメージを更新するワークフローがトリガーされます。 Azure Container Apps によって、更新されたコンテナー イメージに基づいて新しいリビジョンが作成されます。

GitHub リポジトリを変更すると、新しいリビジョンを作成するためのアクションがトリガーされます。

GitHub Actions ワークフローは、リポジトリ内の特定のブランチへのコミットによってトリガーされます。 ワークフローを作成するときに、どのブランチがワークフローをトリガーするかを決定します。

この記事では、完全にカスタマイズ可能なワークフローを作成する方法について説明します。 Azure CLI を使用してスターター GitHub Actions ワークフローを生成するには、「Azure CLI を使用して GitHub Actions ワークフローを生成する」を参照してください。

Azure Container Apps GitHub アクション

コンテナー アプリをビルドしてデプロイするには、azure/container-apps-deploy-action アクションを GitHub Actions ワークフローに追加します。

このアクションでは次のシナリオをサポートします。

  • Dockerfile からビルドし、Container Apps にデプロイします
  • Dockerfile を使用せずにソース コードからビルドし、Container Apps にデプロイする。 サポートされる言語には、.NET、Java、Node.js、PHP、Python が含まれる
  • 既存のコンテナー イメージを Container Apps にデプロイする

使用例

アクションを使用するための一般的なシナリオを以下に示します。 詳細については、アクションの GitHub Marketplace ページを参照してください。

Container Apps をビルドしてデプロイする

次のスニペットは、コンテナー イメージをソース コードからビルドし、Container Apps にデプロイする方法を示しています。

steps:

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

  - name: Build and deploy Container App
    uses: azure/container-apps-deploy-action@v1
    with:
      appSourcePath: ${{ github.workspace }}/src
      acrName: myregistry
      containerAppName: my-container-app
      resourceGroup: my-rg

アクションでは、appSourcePath の Dockerfile を使用してコンテナー イメージをビルドします。 Dockerfile が見つからない場合、アクションは appSourcePath のソース コードからコンテナー イメージをビルドしようとします。

既存のコンテナー イメージを Container Apps にデプロイする

次のスニペットは、既存のコンテナー イメージを Container Apps にデプロイする方法を示しています。

steps:

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

  - name: Build and deploy Container App
    uses: azure/container-apps-deploy-action@v1
    with:
      acrName: myregistry
      containerAppName: my-container-app
      resourceGroup: my-rg
      imageToDeploy: myregistry.azurecr.io/app:${{ github.sha }}

重要

別の手順でコンテナー イメージを構築する場合は、latest のような安定したタグではなく、コミット SHA などの一意のタグを使用してください。 詳細については、「イメージ タグのベスト プラクティス」を参照してください。

Azure Container Registry での認証

コンテナー イメージをプッシュするには、Azure Container Apps アクションを Azure Container Registry で認証する必要があります。 コンテナー イメージをプッシュするには、コンテナー アプリケーションを Container Registry で認証する必要もあります。

イメージをプッシュするには、azure/login アクションに指定された資格情報を使用して、acrName で指定されたコンテナー レジストリでアクションが自動的に認証されます。

イメージをプルするために、Azure Container Apps はマネージド ID (推奨) または管理者資格情報を使用して、Azure Container Registry で認証を行います。 マネージド ID を使用するには、アクションによってデプロイされるコンテナー アプリがマネージド ID を使用するように構成されている必要があります。 レジストリの管理者資格情報で認証するには、アクション acrUsernameacrPassword 入力を設定します。

構成

Azure Container Apps にデプロイするように GitHub Actions ワークフローを構成するには、次の手順を実行します。

  • アプリの GitHub リポジトリを作成する
  • マネージド ID が有効になっているコンテナー アプリを作成する
  • コンテナー アプリのマネージド ID に Azure Container Registry の AcrPull ロールを割り当てる
  • GitHub リポジトリにシークレットを構成する
  • GitHub Actions ワークフローを作成する

前提条件

要件 手順
Azure アカウント お持ちでない場合は、無料のアカウントを作成してください。 続行するには、Azure サブスクリプションの "共同作成者" または "所有者" のアクセス許可が必要です。 詳細については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。
GitHub アカウント 無料試用版にサインアップします。
Azure CLI Azure CLI をインストールします。

GitHub リポジトリを作成し、ソース コードをクローンする

ワークフローを作成する前に、アプリのソース コードが GitHub リポジトリに存在する必要があります。

  1. Azure CLI を使用して Azure にサインインします。

    az login
    
  2. 次に、CLI 用の最新の Azure Container Apps 拡張機能をインストールします。

    az extension add --name containerapp --upgrade
    
  3. 独自の GitHub リポジトリがない場合は、サンプルから作成します。

    1. 次の場所に移動して、新しいリポジトリを作成します。
    2. リポジトリに my-container-app という名前を付けます。
  4. ローカル コンピューターにリポジトリを複製します。

    git clone https://github.com/<YOUR_GITHUB_ACCOUNT_NAME>/my-container-app.git
    

マネージド ID が有効になっているコンテナー アプリを作成する

次の手順の az containerapp up コマンドを使用して、コンテナー アプリを作成します。 このコマンドは、Azure リソースの作成、コンテナー イメージのビルド、レジストリへのイメージの格納、コンテナー アプリへのデプロイを行います。

アプリを作成したら、アプリにマネージド ID を追加し、ID に AcrPull ロールを割り当てて、ID がレジストリからイメージをプルできるようにします。

  1. クローンされたレポジトリの src フォルダーに移動します。

    cd my-container-app
    cd src
    
  2. Azure リソースを作成し、az containerapp up コマンドを使用してコンテナー アプリをデプロイします。

    az containerapp up \
      --name my-container-app \
      --source . \
      --ingress external 
    
  3. コマンド出力に示されている Azure Container Registry の名前をメモします。

  4. コンテナー レジストリの完全なリソース ID を取得します。

    az acr show --name <ACR_NAME> --query id --output tsv
    

    <ACR_NAME> は自分のレジストリの名前に置き換えます。

  5. コンテナー アプリのマネージド ID を有効にします。

    az containerapp identity assign \
      --name my-container-app \
      --resource-group my-container-app-rg \
      --system-assigned \
      --output tsv
    

    コマンド出力に示されているマネージド ID のプリンシパル ID をメモします。

  6. Azure Container Registry の AcrPull ロールをコンテナー アプリのマネージド ID に割り当てます。

    az role assignment create \
      --assignee <MANAGED_IDENTITY_PRINCIPAL_ID> \
      --role AcrPull \
      --scope <ACR_RESOURCE_ID>
    

    <MANAGED_IDENTITY_PRINCIPAL_ID> をマネージド ID のプリンシパル ID に置き換え、<ACR_RESOURCE_ID> を Azure Container Registry のリソース ID に置き換えます。

  7. マネージド ID を使用してイメージを Azure Container Registry からプルするようにコンテナー アプリを構成します。

    az containerapp registry set \
      --name my-container-app \
      --resource-group my-container-app-rg \
      --server <ACR_NAME>.azurecr.io \
      --identity system
    

    <ACR_NAME> を Azure Container Registry の名前に置き換えます。

GitHub リポジトリにシークレットを構成する

GitHub ワークフローでは、Azure で認証を行うために AZURE_CREDENTIALS という名前のシークレットが必要です。 シークレットには、コンテナー アプリとコンテナー レジストリを含むリソース グループに対する共同作成者ロールを持つサービス プリンシパルの認証情報が含まれています。

  1. コンテナー アプリとコンテナー レジストリを含むリソース グループに対する共同作成者ロールを持つサービス プリンシパルを作成します。

    az ad sp create-for-rbac \
      --name my-app-credentials \
      --role contributor \
      --scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/my-container-app-rg \
      --json-auth \
      --output json
    

    <SUBSCRIPTION_ID> を Azure サブスクリプション ID に置き換えます。 コンテナー レジストリが別のリソース グループにある場合は、--scopes パラメーターに両方のリソース グループを指定します。

  2. コマンドからの JSON 出力をコピーします。

  3. GitHub リポジトリで、[設定]>[シークレット]>[アクション] に移動し、[新しいリポジトリ シークレット] を選択します。

  4. 名前として「AZURE_CREDENTIALS」と入力し、JSON 出力のコンテンツを値として貼り付けます。

  5. [Add secret](シークレットの追加) を選択します。

GitHub Actions ワークフローを作成する

  1. GitHub リポジトリで、[アクション] に移動し、[新しいワークフロー] を選択します。

  2. [Set up a workflow yourself]\(ワークフローを自分でセットアップする\) を選択します。

  3. エディターに次の YAML を貼り付けます。

    name: Azure Container Apps Deploy
    
    on:
      push:
        branches:
          - main
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v3
    
          - name: Log in to Azure
            uses: azure/login@v1
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
    
          - name: Build and deploy Container App
            uses: azure/container-apps-deploy-action@v1
            with:
              appSourcePath: ${{ github.workspace }}/src
              acrName: <ACR_NAME>
              containerAppName: my-container-app
              resourceGroup: my-container-app-rg
    

    <ACR_NAME> を Azure Container Registry の名前に置き換えます。 branches の下のブランチ名と、appSourcePathcontainerAppName、および resourceGroup の値が、リポジトリと Azure リソースの値と一致していることを確認してください。

  4. メイン ブランチへの変更をコミットします。

GitHub Actions ワークフローの実行は、コンテナー アプリのビルドとデプロイを開始する必要があります。 進行状況を確認するには、[アクション] に移動します。

アプリの新しいリビジョンをデプロイするには、新しいコミットを メイン ブランチにプッシュします。