GitHub Actionsワークフローを使って、Azure/functions-actionを使って関数コードを自動的に構築・デプロイAzureできます。
GitHub Actionsを使ってデプロイするには、以下の3つの重要なステップを完了してください。
- Azureでユーザー割り当てのマネージデンティティを作成し、フェデレーテッド認証情報でGitHubリポジトリを信頼し、関数アプリでWebsite Contributorの役割を割り当てます。
- GitHubでクライアントID、テナントID、サブスクリプションIDをリポジトリシークレットとして追加してください。
- リポジトリにワークフローの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 CLI(ローカルで開発する場合)。 Azure Cloud ShellでAzure CLIを使用することもできます。
GitHub Actions展開のためのマネージドアイデンティティを作成する
OpenID Connect(OIDC)は、GitHub ActionsをAzure Functionsにデプロイするための推奨認証方法です。 OIDCでは、Azureでユーザー割り当てのマネージドアイデンティティを設定し、GitHubリポジトリとの信頼関係を作成します。 ワークフローは認証情報を秘密として保存せずにAzureで認証できます。
az identity create コマンドを使用して、ユーザー割り当てマネージド ID を作成します。
az identity create --name myGitHubDeployIdentity --resource-group <RESOURCE_GROUP> \
--query "{clientId: clientId, tenantId: tenantId}" -o table
<RESOURCE_GROUP>をリソース グループの名前に置き換えます。
出力から clientId 値と tenantId 値に注目してください。 また、サブスクリプションIDも取得してください:
az account show --query "{subId: id}" -o table
この3つの値は後でGitHubに認証情報を追加する際に必要になります。
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>をそれぞれアプリ名とリソースグループ名に置き換えます。
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> を独自の値で置き換えます。 対象はワークフローを引き起こす枝と一致しなければなりません。
(任意)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を作成する際にコピーした値を使いましょう。
GitHubで、リポジトリに移動します。
設定>>へ行ってください。
シークレットタブで「新しいリポジトリシークレット」を選択してください。
以下の秘密をそれぞれ作成してください:
| 氏名 |
価値 |
AZURE_CLIENT_ID |
マネージド・アイデンティティのclientId |
AZURE_TENANT_ID |
マネージド・アイデンティティのtenantId |
AZURE_SUBSCRIPTION_ID |
機能アプリを含むサブスクリプションIDです |
プライベートレジストリからのコンテナ展開には、レジストリ固有のシークレットも必要です。 詳細は Dockerログインアクションをご覧ください。
テンプレートからワークフローを作成する
ワークフロー構成を手動で作成する最善の方法は、公式にサポートされているテンプレートから開始することです。
Windows または Linux を選択して、適切なオペレーティング システム用のテンプレートを確実に取得します。
Windowsへのデプロイでは、runs-on: windows-latest を使用します。 コンテナ化デプロイメントにはLinuxが必要です。
Linux へのデプロイには runs-on: ubuntu-latest を使用します。 コンテナ化デプロイにはLinuxを使いましょう。
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'
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: ubuntu-latest # Assumes your target function app is Linux-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: ubuntu-latest # Assumes your target function app is Linux-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'
name: Build and deploy Java 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. Ensure that `functionAppName` in your pom.xml file matches.
POM_XML_DIRECTORY: '.' # set this to the directory which contains the pom.xml file. The deploy action will package the contents of this path.
JAVA_VERSION: '21' # set this to the Java 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 to fetch an OIDC token to authenticate with the job
contents: read # Required for actions/checkout
defaults:
run:
shell: bash
working-directory: ${{ env.POM_XML_DIRECTORY }}
steps:
- name: 'Checkout repository'
uses: actions/checkout@v6
- name: 'Set up Java version: ${{ env.JAVA_VERSION }}'
uses: actions/setup-java@v4
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'microsoft'
- name: 'Build project with Maven'
run: mvn clean package -DfunctionAppName=${{ env.AZURE_FUNCTIONAPP_NAME }}
# Perform additional steps such as running tests, if needed
- name: 'Upload artifact for the deployment job'
uses: actions/upload-artifact@v7
with:
name: ${{ env.BUILD_ARTIFACT_NAME }}
path: ${{ env.POM_XML_DIRECTORY }}/target/azure-functions/${{ env.AZURE_FUNCTIONAPP_NAME }}
deploy:
runs-on: windows-latest # Assumes your target function app is Windows-based
needs: build
permissions:
id-token: write # Required to fetch an OIDC token to authenticate with the job
steps:
- name: 'Download artifact from build job'
uses: actions/download-artifact@v8
with:
name: ${{ env.BUILD_ARTIFACT_NAME }}
path: '${{ env.POM_XML_DIRECTORY }}/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.POM_XML_DIRECTORY }}/downloaded-artifact'
respect-pom-xml: false # Set to `true` if the build artifact path is ${{ env.POM_XML_DIRECTORY }}
name: Build and deploy Java 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. Ensure that `functionAppName` in your pom.xml file matches.
POM_XML_DIRECTORY: '.' # set this to the directory which contains the pom.xml file. The deploy action will package the contents of this path.
JAVA_VERSION: '21' # set this to the Java version of your project
BUILD_ARTIFACT_NAME: 'released-package' # Set this according to your team's naming convention
jobs:
build:
runs-on: ubuntu-latest # Assumes your target function app is Linux-based
permissions:
id-token: write # Required to fetch an OIDC token to authenticate with the job
contents: read # Required for actions/checkout
defaults:
run:
shell: bash
working-directory: ${{ env.POM_XML_DIRECTORY }}
steps:
- name: 'Checkout repository'
uses: actions/checkout@v6
- name: 'Set up Java version: ${{ env.JAVA_VERSION }}'
uses: actions/setup-java@v4
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'microsoft'
- name: 'Build project with Maven'
run: mvn clean package -DfunctionAppName=${{ env.AZURE_FUNCTIONAPP_NAME }}
# Perform additional steps such as running tests, if needed
- name: 'Upload artifact for the deployment job'
uses: actions/upload-artifact@v7
with:
name: ${{ env.BUILD_ARTIFACT_NAME }}
path: ${{ env.POM_XML_DIRECTORY }}/target/azure-functions/${{ env.AZURE_FUNCTIONAPP_NAME }}
deploy:
runs-on: ubuntu-latest # Assumes your target function app is Linux-based
needs: build
permissions:
id-token: write # Required to fetch an OIDC token to authenticate with the job
steps:
- name: 'Download artifact from build job'
uses: actions/download-artifact@v8
with:
name: ${{ env.BUILD_ARTIFACT_NAME }}
path: '${{ env.POM_XML_DIRECTORY }}/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.POM_XML_DIRECTORY }}/downloaded-artifact'
respect-pom-xml: false # Set to `true` if the build artifact path is ${{ env.POM_XML_DIRECTORY }}
name: Build and deploy Node.js 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.
NODE_VERSION: '22' # Set this to the Node 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 Node version: ${{ env.NODE_VERSION }}'
uses: actions/setup-node@v6
with:
node-version: ${{ env.NODE_VERSION }}
- name: 'Install project dependencies'
run: npm install # Use `npm ci` if you have a package-lock.json file and want to ensure a clean install
- name: 'Build project'
run: npm run build --if-present
- name: 'Run tests'
run: npm run test --if-present
- name: 'Prune development dependencies'
run: npm prune --production
- name: 'Upload artifact for the deployment job'
uses: actions/upload-artifact@v7
with:
name: ${{ env.BUILD_ARTIFACT_NAME }}
path: ${{ env.AZURE_FUNCTIONAPP_PROJECT_PATH }}
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'
name: Build and deploy Node.js 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.
NODE_VERSION: '22' # Set this to the Node version of your project
BUILD_ARTIFACT_NAME: 'released-package' # Set this according to your team's naming convention
jobs:
build:
runs-on: ubuntu-latest # Assumes your target function app is Linux-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 Node version: ${{ env.NODE_VERSION }}'
uses: actions/setup-node@v6
with:
node-version: ${{ env.NODE_VERSION }}
- name: 'Install project dependencies'
run: npm install # Use `npm ci` if you have a package-lock.json file and want to ensure a clean install
- name: 'Build project'
run: npm run build --if-present
- name: 'Run tests'
run: npm run test --if-present
- name: 'Prune development dependencies'
run: npm prune --production
- name: 'Upload artifact for the deployment job'
uses: actions/upload-artifact@v7
with:
name: ${{ env.BUILD_ARTIFACT_NAME }}
path: ${{ env.AZURE_FUNCTIONAPP_PROJECT_PATH }}
deploy:
runs-on: ubuntu-latest # Assumes your target function app is Linux-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'
Python関数は、Windowsではサポートされていません。 代わりに [Linux] を選択してください。
name: Build and deploy Python 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.
PYTHON_VERSION: '3.13.x' # Set this to the Python version of your project
BUILD_ARTIFACT_NAME: 'released-package' # Set this according to your team's naming convention
jobs:
build:
runs-on: ubuntu-latest # Python function apps are Linux-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 Python version: ${{ env.PYTHON_VERSION }}'
uses: actions/setup-python@v6
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: 'Install project dependencies'
run: pip install -r requirements.txt --target ".python_packages/lib/site-packages" # Ensure requirements.txt contains all dependencies
# Perform additional steps such as running tests, if needed
- name: 'Upload artifact for the deployment job'
uses: actions/upload-artifact@v7
with:
name: ${{ env.BUILD_ARTIFACT_NAME }}
path: ${{ env.AZURE_FUNCTIONAPP_PROJECT_PATH }}
deploy:
runs-on: ubuntu-latest # Python function apps are Linux-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'
name: Deploy PowerShell 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.
jobs:
# PowerShell projects do not require a build step
deploy:
runs-on: windows-latest # For PowerShell projects, the OS of the runner does not affect deployment. You may use either ubuntu-latest or windows-latest.
permissions:
id-token: write # Required for OIDC
contents: read # Required for actions/checkout
steps:
- name: 'Checkout repository'
uses: actions/checkout@v6
# Perform additional steps such as running tests, if needed
- 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 }}
PowerShell機能はLinuxではサポートされていません。 代わりにWindowsを選んでください。
コンテナ展開はWindowsではサポートされていません。 代わりに [Linux] を選択してください。
# Action Requires
# 1. Setup the AZURE_CREDENTIALS secrets in your GitHub Repository
name: Linux_Container_Workflow
on:
push:
branches:
- master
jobs:
build-and-deploy:
runs-on: ubuntu-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: 'Login via Azure CLI'
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: 'Docker Login'
uses: azure/docker-login@v1
with:
login-server: contoso.azurecr.io
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: 'Compose Customized Docker Image'
shell: bash
run: |
# If your function app project is not located in your repository's root
# Please change the path to your directory for docker build
docker build . -t REGISTRY/NAMESPACE/IMAGE:TAG
docker push REGISTRY/NAMESPACE/IMAGE:TAG
- name: 'Run Azure Functions Container Action'
uses: Azure/functions-container-action@v1
id: fa
with:
app-name: PLEASE_REPLACE_THIS_WITH_YOUR_FUNCTION_APP_NAME
image: REGISTRY/NAMESPACE/IMAGE:TAG
#- name: 'use the published functionapp url in upcoming steps'
# run: |
# echo "${{ steps.fa.outputs.app-url }}"
- name: Azure logout
run: |
az logout
重要
新しいコンテナベースの関数型アプリケーションのデプロイでは、ネイティブのAzure Container Appsホスティングモデルを使いましょう。
GitHub ActionsでAzure Container Appsにデプロイする方法を参照してください。 ここに示されているこのAzure/functions-container-actionは、既存の関数アプリリソースにコンテナイメージを展開するものですAzure。
このYAMLファイルを使用する前に、以下の手順を踏み入れてください:
- コンテナレジストリに基づいて
REGISTRY、 NAMESPACE、 IMAGE、 TAG の値を更新してください。
-
docker/login-actionアクションでコンテナリポジトリの認証情報を更新してください。
テンプレート内で、プロジェクトの env: 変数を更新してください。 すべてのテンプレートには AZURE_FUNCTIONAPP_NAMEが必要です。 他の変数は言語によって異なります:
| 変数 |
必須 |
Description |
AZURE_FUNCTIONAPP_NAME |
はい |
Your function app name in Azure |
DOTNET_VERSION |
はい |
プロジェクトの.NETバージョン(例えば、10.0.x) |
AZURE_FUNCTIONAPP_PROJECT_PATH |
いいえ |
プロジェクトフォルダへのパス。 デフォルト: . (リポジトリルート) |
| 変数 |
必須 |
Description |
AZURE_FUNCTIONAPP_NAME |
はい |
AzureのYour function app名。 pom.xmlで functionAppName と一致しなければなりません。 |
JAVA_VERSION |
はい |
プロジェクトのJavaバージョン(例えば、21) |
POM_XML_DIRECTORY |
いいえ |
pom.xmlを含むディレクトリへのパス。 デフォルト: . (リポジトリルート) |
| 変数 |
必須 |
Description |
AZURE_FUNCTIONAPP_NAME |
はい |
Your function app name in Azure |
NODE_VERSION |
はい |
プロジェクトの Node.js バージョン(例えば 22) |
AZURE_FUNCTIONAPP_PROJECT_PATH |
いいえ |
プロジェクトフォルダへのパス。 デフォルト: . (リポジトリルート) |
| 変数 |
必須 |
Description |
AZURE_FUNCTIONAPP_NAME |
はい |
Your function app name in Azure |
PYTHON_VERSION |
はい |
プロジェクトのPythonバージョン(例えば、3.13.x) |
AZURE_FUNCTIONAPP_PROJECT_PATH |
いいえ |
プロジェクトフォルダへのパス。 デフォルト: . (リポジトリルート) |
| 変数 |
必須 |
Description |
AZURE_FUNCTIONAPP_NAME |
はい |
Your function app name in Azure |
AZURE_FUNCTIONAPP_PROJECT_PATH |
いいえ |
プロジェクトフォルダへのパス。 デフォルト: . (リポジトリルート) |
| 変数 |
必須 |
Description |
AZURE_FUNCTIONAPP_NAME |
はい |
Your function app name in Azure |
REGISTRY |
はい |
あなたのコンテナレジストリログインサーバー(例: contoso.azurecr.io) |
NAMESPACE |
はい |
レジストリ内の名前空間/リポジトリ |
IMAGE |
はい |
コンテナ画像の名前 |
TAG |
はい |
画像タグ(例: ${{ github.sha }}) |
OIDCテンプレートにはすでにOIDC認証付きの azure/login ステップが含まれています。
secrets.AZURE_CLIENT_ID、secrets.AZURE_TENANT_ID、secrets.AZURE_SUBSCRIPTION_ID参照が作成したリポジトリの秘密と一致しているか確認してください。
この新しい YAML ファイルをリポジトリの /.github/workflows/ パスに追加します。
ポータルでワークフロー構成を作成する
ポータルを使ってGitHub Actionsを有効にすると、Functionsがすべてのセットアップを自動的に処理します。 管理IDの作成、認証情報の設定、ワークフローファイルの書き込みは手動で行う必要はありません。 Functionsは以下の作業を行います:
Azureサブスクリプションでは:
あなたのGitHubリポジトリでは:
- クライアントID、サブスクリプションID、テナントIDの値をGitHub Actionsの秘密として追加します。
- アプリケーションスタックに基づいてワークフローファイルを作成し、
.github/workflowsにコミットします。
関数アプリの作成時
Azure ポータルで関数を作成する場合は、[デプロイ] タブを使用してGitHub Actionsをすばやく開始できます。 新しい関数アプリを作成するときにGitHub Actionsワークフローを追加するには:
Azure portal で、Create Function App フローで Deployment を選択します。
Continuous Deployment を有効にします。各コードの更新でAzureポータルへのコード プッシュをトリガーする場合は、
GitHub設定で「Authorize」を選択してGitHubアカウントを接続してください。 リポジトリに書き込み権限を持つGitHubアカウントでサインインしてください。
GitHub組織、リポジトリ、ブランチを入力します。
オプションとして、プレビュー ファイル を選択して、ワークフローファイルが生成されてリポジトリに追加される前の見た目を確認できます。
関数アプリの構成を完了します。 GitHub リポジトリに、/.github/workflows/ に新しいワークフロー ファイルが含まれるようになりました。
既存の関数アプリの場合
既存の関数アプリにGitHub Actions ワークフローを追加するには:
Azureポータルの関数アプリにアクセスし、「デプロイメント>デプロイメントセンター」を選択してください。
継続的展開(CI/CD)を選択してください。
[ソース] で、GitHub を選択します。 デフォルトのメッセージ「Building with GitHub Actions」が見当たらない場合は、「Change provider」を選択し、「GitHub Actions」を選択し、「OK」を選択してください。
まだGitHubアクセスを承認していなければ、「Authorize」を選択してください。 GitHub資格情報を入力し、Sign in を選択します。 別のGitHub アカウントを承認するには、Change Account を選択し、別のアカウントでサインインします。
GitHub Organization、Repository、および Branch を選択します。 GitHub Actionsを使ってデプロイするには、このリポジトリへの書き込みアクセスが必要です。
ワークフローオプションでは、ワークフローを追加を選択します。 このオプションは /.github/workflows/で新しいワークフローファイルを作成します。 既存のワークフローを使用するには、「 利用可能なワークフロー」 を選び、ワークフローファイルを選択してください。
認証設定でOpenID Connect(OIDC)を使うためにユーザー割り当てIDを選択してください。これはGitHubに秘密を保存する必要がないため推奨されています。 購読と (新しい) 提案されたID名を選択してください。 新たにユーザー割り当てのマネージドアイデンティティが作成され、 ウェブサイト貢献 者の役割へのアクセスが付与されます。 既存のアイデンティティを使用する場合は、まずウェブサイト 貢献 者の役割へのアクセスを許可しなければなりません。
重要
Basic authenticationを選択すると、共有シークレットを含む公開プロファイルがGitHub Secretsに保存されます。 また、 SCMの基本認証を有効にする必要があり、これによりアプリの安全性が低下します。
Preview ファイル を選択して、.github/workflows/ のGitHub リポジトリに追加されるワークフロー ファイルを表示します。
[保存] を選択して、ワークフロー ファイルをリポジトリに追加します。 現在および過去の展開状況を見るには「 ログ」 タブを選択してください。
ワークフロー構成ファイルを作成する
GitHub リポジトリから直接、Azure Functions テンプレートからGitHub Actionsワークフロー構成ファイルを作成できます。
GitHubで、リポジトリに移動します。
[Actions] および [New workflow] を選択します。
"functions" を検索します。
Microsoft Azureによって作成された表示関数アプリ ワークフローで、コード言語に一致するものを見つけて、Configure を選択します。
新しく作成した YAML ファイルで、env.AZURE_FUNCTIONAPP_NAME パラメーターを、Azureの関数アプリ リソースの名前で更新します。 また、C#のDOTNET_VERSIONやPythonアプリのPYTHON_VERSIONなど、アプリで使う言語バージョンを設定するパラメータも更新する必要があるかもしれません。
デフォルトのテンプレートでは推奨されるOIDCの代わりに公開プロファイル認証が使われているかもしれません。 OIDCに切り替えてポータルの動作に合わせるために、以下の変更を加えてください:
publish-profile、scm-do-build-during-deployment、enable-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
新しいワークフローファイルが適切な名前で保存されているか /.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 Deployment や enable-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を使う場合、デプロイ方法はホスティングプランによって異なります:
* 従量課金プランで Linux 上でアプリを実行する機能は、廃止される予定です。 詳細については、「Azure Functions 従量課金プランのホスティング」を参照してください。
詳細については、「deployment technologies in Azure Functions」を参照してください。
次のステップ