GitHub Actions を使って Azure Functions にデプロイ

GitHub Actionsワークフローを使って、Azure/functions-actionを使って関数コードを自動的に構築・デプロイAzureできます。

GitHub Actionsを使ってデプロイするには、以下の3つの重要なステップを完了してください。

  1. Azureでユーザー割り当てのマネージデンティティを作成し、フェデレーテッド認証情報でGitHubリポジトリを信頼し、関数アプリでWebsite Contributorの役割を割り当てます。
  2. GitHubでクライアントID、テナントID、サブスクリプションIDをリポジトリシークレットとして追加してください。
  3. リポジトリにワークフローのYAMLファイルを追加し、OpenID Connect(OIDC)で認証 azure/login 、その後 Azure/functions-action 呼び出してデプロイします。

Azureポータルを使ってGitHub Actionsを有効にすると、FunctionsはAzureサブスクリプションとGitHubリポジトリの両方で自動的にこれらのタスクを実行します。

Create a workflow configuration for Azure Functions

リポジトリの /.github/workflows/ パスでワークフロー構成を定義するYAMLファイル(.yml)を管理します。 この定義には、関数の開発言語に固有であるワークフローを構成するアクションとパラメーターが含まれます。

記事上部のセレクターを使ってワークフローファイルを作成する方法を選択してください:

Method 最適な用途 OIDCサポート
ワークフローテンプレート 完全なコントロール:OIDC対応のテンプレートをコピーしてカスタマイズしてください 構成が必要
Azure Portal 最も簡単な設定:ポータルがあなたのためにアイデンティティ、認証情報、ワークフローファイルを作成できます あなたのために設定しました
GitHubマーケットプレイス GitHub-first:GitHubの組み込みマーケットプレイステンプレートから始めましょう 設定およびテンプレートの変更が必要です

認証の概要

GitHub ActionsはコードをデプロイするためにAzureで認証しなければなりません。 この記事は推奨される認証方法であるOpenID Connect(OIDC)を使用しています。 OIDCはフェデレーテッド認証情報を用いて、GitHubリポジトリとMicrosoft Entraのユーザー割り当て管理IDとの間に信頼関係を作成します。 GitHubには秘密情報は保存されません。

OIDC認証の例

以下のインライン例は、すべてのワークフローテンプレートで使用されるOIDC認証および展開のコアパターンを示しています:

permissions:
  id-token: write
  contents: read

steps:
  - name: 'Login via OIDC'
    uses: azure/login@v3
    with:
      client-id: ${{ secrets.AZURE_CLIENT_ID }}
      tenant-id: ${{ secrets.AZURE_TENANT_ID }}
      subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

  - name: 'Deploy to Azure Functions'
    uses: Azure/functions-action@v1
    with:
      app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
      package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}

GitHub Actions OIDC認証の考慮事項

  • OIDCは ワークロードアイデンティティフェデレーション を使用し、ユーザー割り当てのマネージドアイデンティティのみをサポートします。
  • AzureポータルでGitHub Actionsベースのデプロイメントを有効にすると、デフォルトでOIDC認証が使われます。
  • OIDCでは、管理されたアイデンティティのクライアントID、テナントID、サブスクリプションIDがGitHubリポジトリの秘密として保存されます。
  • Azureの役割ベースのアクセス制御(Azure RBAC)を使って、デプロイに必要なAzureリソースのみへのアクセスを制限してください。

前提条件

  • アクティブなサブスクリプションを持つAzure アカウント。 無料でアカウントを作成できます

  • GitHub アカウント。 お持ちでない場合は、無料でサインアップしてください。

  • GitHubリポジトリにProjectソースコードを保存します。

  • GitHub Actionsワークフローの基本的な理解。 GitHub Actionsが初めての方は、「Understanding GitHub Actions」をご覧ください。

  • Azure上でホストされる動作関数アプリ(コードのみまたはコンテナベース)。

  • (コンテナ展開のみ)既存のコンテナレジストリ、例えばAzure Container Registry

  • Azure CLI(ローカルで開発する場合)。 Azure Cloud ShellでAzure CLIを使用することもできます。

GitHub Actions展開のためのマネージドアイデンティティを作成する

OpenID Connect(OIDC)は、GitHub ActionsをAzure Functionsにデプロイするための推奨認証方法です。 OIDCでは、Azureでユーザー割り当てのマネージドアイデンティティを設定し、GitHubリポジトリとの信頼関係を作成します。 ワークフローは認証情報を秘密として保存せずにAzureで認証できます。

  1. az identity create コマンドを使用して、ユーザー割り当てマネージド ID を作成します。

    az identity create --name myGitHubDeployIdentity --resource-group <RESOURCE_GROUP> \
    --query "{clientId: clientId, tenantId: tenantId}" -o table
    

    <RESOURCE_GROUP>をリソース グループの名前に置き換えます。

  2. 出力から clientId 値と tenantId 値に注目してください。 また、サブスクリプションIDも取得してください:

    az account show --query "{subId: id}" -o table
    

    この3つの値は後でGitHubに認証情報を追加する際に必要になります。

  3. az role assignment create コマンドを使って、Website Contributor ロールを管理されたアイデンティティに割り当て、関数アプリにスコープ付けします:

    IDENTITY_PRINCIPAL=$(az identity show --name myGitHubDeployIdentity --resource-group <RESOURCE_GROUP> --query 'principalId' -o tsv)
    FUNCTION_APP_ID=$(az functionapp show --name <APP_NAME> --resource-group <RESOURCE_GROUP> --query 'id' -o tsv)
    az role assignment create --assignee $IDENTITY_PRINCIPAL --role "Website Contributor" --scope $FUNCTION_APP_ID
    

    <APP_NAME><RESOURCE_GROUP>をそれぞれアプリ名とリソースグループ名に置き換えます。

  4. az identity federated-credential create コマンドを使って、GitHub リポジトリのトークンを信頼するフェデレーテッド認証情報を作成してください:

    az identity federated-credential create \
        --identity-name myGitHubDeployIdentity \
        --resource-group <RESOURCE_GROUP> \
        --name github-deploy-credential \
        --issuer https://token.actions.githubusercontent.com \
        --subject repo:<GITHUB_ORG>/<REPO_NAME>:ref:refs/heads/<BRANCH_NAME> \
        --audiences api://AzureADTokenExchange
    

    <RESOURCE_GROUP><GITHUB_ORG><REPO_NAME><BRANCH_NAME> を独自の値で置き換えます。 対象はワークフローを引き起こす枝と一致しなければなりません。

  5. (任意)Azure Container Registryからコンテナを展開する場合は、マネージドIDにもacrpullロールを割り当ててください。

    IDENTITY_PRINCIPAL=$(az identity show --name myGitHubDeployIdentity --resource-group <RESOURCE_GROUP> --query 'principalId' -o tsv)
    az role assignment create --assignee $IDENTITY_PRINCIPAL --role acrpull \
        --scope /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.ContainerRegistry/registries/<REGISTRY_NAME>
    

    <SUBSCRIPTION_ID><RESOURCE_GROUP><REGISTRY_NAME> を独自の値で置き換えます。

GitHubに認証情報を追加してください

管理IDを作成する際にコピーした値を使いましょう。

  1. GitHubで、リポジトリに移動します。

  2. 設定>>へ行ってください。

  3. シークレットタブで「新しいリポジトリシークレット」を選択してください。

  4. 以下の秘密をそれぞれ作成してください:

    氏名 価値
    AZURE_CLIENT_ID マネージド・アイデンティティのclientId
    AZURE_TENANT_ID マネージド・アイデンティティのtenantId
    AZURE_SUBSCRIPTION_ID 機能アプリを含むサブスクリプションIDです

プライベートレジストリからのコンテナ展開には、レジストリ固有のシークレットも必要です。 詳細は Dockerログインアクションをご覧ください。

テンプレートからワークフローを作成する

ワークフロー構成を手動で作成する最善の方法は、公式にサポートされているテンプレートから開始することです。

  1. Windows または Linux を選択して、適切なオペレーティング システム用のテンプレートを確実に取得します。

    Windowsへのデプロイでは、runs-on: windows-latest を使用します。 コンテナ化デプロイメントにはLinuxが必要です。

  2. Azure Functionsのアクションリポジトリにある言語固有のOIDCワークフローテンプレートを使用してください。 リポジトリ内の新しいファイル名の .github/workflows/deploy-function-app.yml にファイルの全内容をコピーしてください:

    name: Build and deploy .NET project to Azure Function App using OIDC
    
    on:
      push:
        branches: [ main ]
      workflow_dispatch:
    
    env:
      AZURE_FUNCTIONAPP_NAME: 'APP_NAME'         # Set this to your function app name on Azure 
      AZURE_FUNCTIONAPP_PROJECT_PATH: '.'        # Set this to the path to your function app project, defaults to the repository root. The deploy action will package the contents of this path.
      DOTNET_VERSION: '10.0.x'                   # Set this to the .NET version of your project
      BUILD_ARTIFACT_NAME: 'released-package'    # Set this according to your team's naming convention
      
    jobs:
      build:
        runs-on: windows-latest # Assumes your target function app is Windows-based
        permissions:
          id-token: write  # Required for OIDC
          contents: read   # Required for actions/checkout
        defaults:
          run:
            shell: bash
            working-directory: ${{ env.AZURE_FUNCTIONAPP_PROJECT_PATH }}
        steps:
          - name: 'Checkout repository'
            uses: actions/checkout@v6
    
          - name: 'Set up .NET version: ${{ env.DOTNET_VERSION }}'
            uses: actions/setup-dotnet@v5
            with:
              dotnet-version: ${{ env.DOTNET_VERSION }}
    
          # Perform additional steps such as running tests, if needed
    
          - name: 'Build and prepare .NET project for deployment'
            run: dotnet publish --configuration Release --output ./output
    
          - name: Upload artifact for the deployment job
            uses: actions/upload-artifact@v7
            with:
              name: ${{ env.BUILD_ARTIFACT_NAME }}
              path: ${{ env.AZURE_FUNCTIONAPP_PROJECT_PATH }}/output
              include-hidden-files: true  # Required for .NET projects
      
      deploy:
        runs-on: windows-latest # Assumes your target function app is Windows-based
        needs: build
        permissions:
          id-token: write  # Required for OIDC
        steps:
          - name: 'Download artifact from build job'
            uses: actions/download-artifact@v8
            with:
              name: ${{ env.BUILD_ARTIFACT_NAME }}
              path: '${{ env.AZURE_FUNCTIONAPP_PROJECT_PATH }}/downloaded-artifact'
         
          - name: 'Log in to Azure with AZ CLI'
            uses: azure/login@v3
            with:
              client-id: ${{ vars.AZURE_CLIENT_ID }}
              tenant-id: ${{ vars.AZURE_TENANT_ID }}
              subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}
            
          - name: 'Run the Azure Functions action'
            uses: Azure/functions-action@v1
            id: deploy-to-function-app
            with:
              app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
              package: '${{ env.AZURE_FUNCTIONAPP_PROJECT_PATH }}/downloaded-artifact'
    
  3. テンプレート内で、プロジェクトの env: 変数を更新してください。 すべてのテンプレートには AZURE_FUNCTIONAPP_NAMEが必要です。 他の変数は言語によって異なります:

    変数 必須 Description
    AZURE_FUNCTIONAPP_NAME はい Your function app name in Azure
    DOTNET_VERSION はい プロジェクトの.NETバージョン(例えば、10.0.x)
    AZURE_FUNCTIONAPP_PROJECT_PATH いいえ プロジェクトフォルダへのパス。 デフォルト: . (リポジトリルート)
  4. OIDCテンプレートにはすでにOIDC認証付きの azure/login ステップが含まれています。 secrets.AZURE_CLIENT_IDsecrets.AZURE_TENANT_IDsecrets.AZURE_SUBSCRIPTION_ID参照が作成したリポジトリの秘密と一致しているか確認してください。

  5. この新しい YAML ファイルをリポジトリの /.github/workflows/ パスに追加します。

ポータルでワークフロー構成を作成する

ポータルを使ってGitHub Actionsを有効にすると、Functionsがすべてのセットアップを自動的に処理します。 管理IDの作成、認証情報の設定、ワークフローファイルの書き込みは手動で行う必要はありません。 Functionsは以下の作業を行います:

Azureサブスクリプションでは:

  • ユーザー割り当てのマネージデンティティIDを作成し、関数アプリで Website Contributorの役割 を割り当てます。
  • GitHub OIDC認証のためにマネージドIDにフェデレーテッド認証を追加します。

あなたのGitHubリポジトリでは:

  • クライアントID、サブスクリプションID、テナントIDの値をGitHub Actionsの秘密として追加します。
  • アプリケーションスタックに基づいてワークフローファイルを作成し、 .github/workflowsにコミットします。

関数アプリの作成時

Azure ポータルで関数を作成する場合は、[デプロイ] タブを使用してGitHub Actionsをすばやく開始できます。 新しい関数アプリを作成するときにGitHub Actionsワークフローを追加するには:

  1. Azure portal で、Create Function App フローで Deployment を選択します。

  2. Continuous Deployment を有効にします。各コードの更新でAzureポータルへのコード プッシュをトリガーする場合は、

  3. GitHub設定で「Authorize」を選択してGitHubアカウントを接続してください。 リポジトリに書き込み権限を持つGitHubアカウントでサインインしてください。

  4. GitHub組織、リポジトリ、ブランチを入力します。

  5. オプションとして、プレビュー ファイル を選択して、ワークフローファイルが生成されてリポジトリに追加される前の見た目を確認できます。

  6. 関数アプリの構成を完了します。 GitHub リポジトリに、/.github/workflows/ に新しいワークフロー ファイルが含まれるようになりました。

既存の関数アプリの場合

既存の関数アプリにGitHub Actions ワークフローを追加するには:

  1. Azureポータルの関数アプリにアクセスし、「デプロイメント>デプロイメントセンター」を選択してください。

  2. 継続的展開(CI/CD)を選択してください。 [ソース] で、GitHub を選択します。 デフォルトのメッセージ「Building with GitHub Actions」が見当たらない場合は、「Change provider」を選択し、「GitHub Actions」を選択し、「OK」を選択してください。

  3. まだGitHubアクセスを承認していなければ、「Authorize」を選択してください。 GitHub資格情報を入力し、Sign in を選択します。 別のGitHub アカウントを承認するには、Change Account を選択し、別のアカウントでサインインします。

  4. GitHub OrganizationRepository、および Branch を選択します。 GitHub Actionsを使ってデプロイするには、このリポジトリへの書き込みアクセスが必要です。

  5. ワークフローオプションでは、ワークフローを追加を選択します。 このオプションは /.github/workflows/で新しいワークフローファイルを作成します。 既存のワークフローを使用するには、「 利用可能なワークフロー」 を選び、ワークフローファイルを選択してください。

  6. 認証設定でOpenID Connect(OIDC)を使うためにユーザー割り当てIDを選択してください。これはGitHubに秘密を保存する必要がないため推奨されています。 購読と (新しい) 提案されたID名を選択してください。 新たにユーザー割り当てのマネージドアイデンティティが作成され、 ウェブサイト貢献 者の役割へのアクセスが付与されます。 既存のアイデンティティを使用する場合は、まずウェブサイト 貢献 者の役割へのアクセスを許可しなければなりません。

    重要

    Basic authenticationを選択すると、共有シークレットを含む公開プロファイルがGitHub Secretsに保存されます。 また、 SCMの基本認証を有効にする必要があり、これによりアプリの安全性が低下します。

  7. Preview ファイル を選択して、.github/workflows/ のGitHub リポジトリに追加されるワークフロー ファイルを表示します。

  8. [保存] を選択して、ワークフロー ファイルをリポジトリに追加します。 現在および過去の展開状況を見るには「 ログ」 タブを選択してください。

ワークフロー構成ファイルを作成する

GitHub リポジトリから直接、Azure Functions テンプレートからGitHub Actionsワークフロー構成ファイルを作成できます。

  1. GitHubで、リポジトリに移動します。

  2. [Actions] および [New workflow] を選択します。

  3. "functions" を検索します。

    GitHub Actions関数テンプレートの検索のスクリーンショット。

  4. Microsoft Azureによって作成された表示関数アプリ ワークフローで、コード言語に一致するものを見つけて、Configure を選択します。

  5. 新しく作成した YAML ファイルで、env.AZURE_FUNCTIONAPP_NAME パラメーターを、Azureの関数アプリ リソースの名前で更新します。 また、C#のDOTNET_VERSIONやPythonアプリのPYTHON_VERSIONなど、アプリで使う言語バージョンを設定するパラメータも更新する必要があるかもしれません。

  6. デフォルトのテンプレートでは推奨されるOIDCの代わりに公開プロファイル認証が使われているかもしれません。 OIDCに切り替えてポータルの動作に合わせるために、以下の変更を加えてください:

    • publish-profilescm-do-build-during-deploymentenable-oryx-buildパラメータをAzure/functions-actionから削除してください。

    • ジョブから environment 設定(存在する場合は)を削除してください。フェデレーテッド認証の主体はブランチトリガーと一致しなければなりません。

    • azure/loginステップの前にAzure/functions-actionステップを追加してください:

      - name: 'Login via OIDC'
        uses: azure/login@v3
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      
      - name: 'Run Azure Functions Action'
        uses: Azure/functions-action@v1
        with:
          app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
          package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
      
    • ジョブに以下の権限を追加してください:

      permissions:
        id-token: write
        contents: read
      
  7. 新しいワークフローファイルが適切な名前で保存されているか /.github/workflows/ 確認し、「 Commit changes」を選択します。

Azure Functions アクション

Azure Functions アクション (Azure/functions-action) は、コードをAzureの既存の関数アプリまたはアプリ内の特定のスロットに発行する方法を定義します。

パラメーター

以下の表は、 Azure/functions-actionがサポートする入力パラメータを示しています。

パラメーター Description
app-name (必須)Azureの関数アプリの名前です。
package (必須)あなたのプロジェクトが出版されるまでの道筋。 デフォルト: . (リポジトリ内のすべてのファイル)。
リモートビルド Flex Consumptionアプリにデプロイする際にKuduのビルドアクションを有効にするために true に設定してください。 オリックスビルドは常に実行されます。また、 SCM-do-build-during Deploymentenable-oryx-buildも設定しないでください。 既定値: false
SCM-DO-ビルド-デプロイメント中 Kuduサイトが リモートビルドなどの事前展開操作を行えるようにしましょう。 Kuduがデプロイ時にプロジェクトをビルドできるように true に設定してください。 既定値: false。 詳細については、SCM_DO_BUILD_DURING_DEPLOYMENTを参照してください。
enable-oryx-build Oryxを使ってKuduがプロジェクトの依存関係を解決できるようにしましょう。 このツールと scm-do-build-during-deployment の両方をワークフローではなくOryxを使うように true 設定してください。 既定値: false。 Linux のみ。
slot-name 展開先の 展開スロット 。 デフォルト:生産スロット。
publish-profile 発行プロファイルを含むGitHub シークレットの名前。 推奨されるOIDC認証を使う場合は不要です。
sku Flex Consumptionプランでflexconsumptionで認証する際はに設定してください。 OIDC認証や他のホスティングプランでは不要です。
リスペクト-POM-XML (Javaのみ)展開アーティファクトを pom.xmlから導出するためにtrueに設定。 trueしたら、パッケージ.に設定してください。 既定値: false
リスペクト-ファンクイノア .funcignoreファイルを尊重し、リストされたパスを除外するために true に設定してください。 既定値: false

以下の表は、各ホスティングプランでサポートされているパラメータを示しています:

パラメーター Flex 従量課金 エラスティックプレミアム Dedicated 従量課金
app-name 必須 必須 必須 必須
package 必須 必須 必須 必須
リモートビルド Optional
SCM-DO-ビルド-デプロイメント中 Optional Optional Optional
enable-oryx-build オプション(Linux) オプション(Linux) オプション(Linux)
slot-name サポートしていません Optional Optional Optional
publish-profile お勧めしません お勧めしません お勧めしません お勧めしません
sku 公開プロファイルのみ
リスペクト-POM-XML オプション(Java) オプション(Java) オプション(Java) オプション(Java)
リスペクト-ファンクイノア Optional Optional Optional Optional

配置方法

GitHub Actionsを使う場合、デプロイ方法はホスティングプランによって異なります:

ホスティング プラン デプロイ方法
フレックス消費 OneDeploy
エラスティックプレミアム Zip デプロイ
専用 (App Service) プラン Zip デプロイ
消費 Windows: ZIP デプロイ
Linux: 外部パッケージの URL*

* 従量課金プランで Linux 上でアプリを実行する機能は、廃止される予定です。 詳細については、「Azure Functions 従量課金プランのホスティング」を参照してください。

詳細については、「deployment technologies in Azure Functions」を参照してください。

次のステップ