GitHub Actions 워크플로우를 사용해 함수 코드를 자동으로 빌드하고 AzureAzure/functions-action에 배포할 수 있습니다.
GitHub Actions를 사용해 배포하려면 다음 세 가지 핵심 단계를 완료하세요:
- Azure에서 사용자 지정 관리 신원을 생성하고, 연합 자격 증명이 있어 GitHub 저장소를 신뢰하며, 함수 앱에서 웹사이트 기여자 역할을 할당하세요.
- GitHub에 신원의 클라이언트 ID, 테넌트 ID, 구독 ID를 저장소 비밀로 추가하세요.
- OpenID Connect(OIDC)와 함께 인증하는 워크플로우 YAML 파일을 저장소에
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 내 사용자 지정 관리 신원 간에 신뢰 관계를 만듭니다. 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가 처음이라면 '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로 인증할 수 있습니다.
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
이 세 가지 값은 나중에 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에서 컨테이너를 배포하는 경우, 관리 신원에도 역할도 할당 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에 자격 증명 추가하기
관리 신원을 만들 때 복사한 값을 사용하세요.
GitHub 리포지토리로 이동합니다.
설정>:비밀과 변수,>액션으로 가세요.
비밀 탭에서 새 저장소 비밀을 선택하세요.
다음 비밀 각각을 만드세요:
| Name |
Value |
AZURE_CLIENT_ID |
clientId 관리 신원의 |
AZURE_TENANT_ID |
tenantId 관리 신원의 |
AZURE_SUBSCRIPTION_ID |
기능 앱이 포함된 구독 ID |
프라이빗 레지스트리에서 컨테이너 배포를 할 때는 레지스트리별 비밀도 필요합니다. 자세한 내용은 도커 로그인 작업을 참조하세요.
템플릿에서 워크플로 만들기
워크플로 구성을 수동으로 만드는 가장 좋은 방법은 공식적으로 지원되는 템플릿에서 시작하는 것입니다.
Windows 또는 Linux 중 하나를 선택하여 올바른 운영 체제에 대한 템플릿을 가져오는지 확인합니다.
Windows에 runs-on: windows-latest을(를) 사용하여 배포합니다. 컨테이너화된 배포는 리눅스가 필요합니다.
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'
Windows Python 함수는 지원되지 않습니다. 대신 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 파일을 사용하기 전에 다음 단계를 완료하세요:
- 컨테이너 레지스트리를 기준으로 , ,
REGISTRYNAMESPACEIMAGE , , 의 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과 일치하는지 확인하세요.
리포지토리의 /.github/workflows/ 경로에 이 새 YAML 파일을 추가합니다.
포털에서 워크플로 구성을 만들기
포털을 사용해 GitHub Actions를 활성화하면, Functions가 모든 설정을 자동으로 처리합니다. 수동으로 관리 신원을 만들거나, 자격 증명을 설정하거나, 워크플로우 파일을 작성할 필요가 없습니다. 기능들은 다음과 같은 작업을 대신 수행합니다:
Azure 구독 내에서:
- 사용자 지정 관리 신원을 생성하고 기능 앱에서 웹사이트 기여자 역할을 할당합니다.
- GitHub OIDC 인증을 위한 관리 신원에 연합 자격 증명을 추가합니다.
GitHub 저장소에서:
- 클라이언트 ID, 구독 ID, 테넌트 ID 값을 GitHub Actions 비밀로 추가합니다.
- 애플리케이션 스택을 기반으로 워크플로우 파일을 생성하고 에 커밋합니다.
.github/workflows
함수 앱을 만드는 동안
Azure Portal에서 함수를 만들 때 배포 탭을 통해 GitHub Actions 빠르게 시작할 수 있습니다. 새 함수 앱을 만들 때 GitHub Actions 워크플로를 추가하려면 다음을 수행합니다.
Azure 포털의 Create Function App 흐름에서 배포를 선택합니다.
각 코드 업데이트가 Azure Portal에 대한 코드 푸시를 트리거하도록 하려면 연속 배포를 사용하도록 설정합니다.
GitHub 설정에서 GitHub 계정 연결을 위해 승인을 선택하세요. 저장소에 쓰기 권한이 있는 GitHub 계정으로 로그인하세요.
GitHub 조직, 리포지토리 및 분기를 입력합니다.
선택적으로, Preview 파일을 선택하여 워크플로우 파일이 생성되어 저장소에 추가되기 전 어떻게 보이는지 확인할 수 있습니다.
함수 앱 구성을 완료합니다. 이제 GitHub 리포지토리에 /.github/workflows/ 새 워크플로 파일이 포함됩니다.
기존 함수 앱의 경우
기존 함수 앱에 GitHub Actions 워크플로를 추가하려면 다음을 수행합니다.
Azure 포털에서 함수 앱으로 가서 Deployment>Deployment Center를 선택하세요.
지속적 배포(CI/CD)를 선택하세요.
원본의 경우 GitHub를 선택합니다. 기본 메시지가 보이지 않으면 'Createwith GitHub Actions'를 선택하고, GitHub Actions를 선택한 후 확인(OK)을 선택하세요.
아직 GitHub 접근 권한을 부여하지 않았다면, 권한 부여를 선택하세요. GitHub 자격 증명을 제공하고 사인 선택합니다. 다른 GitHub 계정에 권한을 부여하려면 계정 변경을 선택하고 다른 계정으로 로그인합니다.
GitHub Organization, Repository 및 Branch 선택합니다. GitHub Actions를 사용해 배포하려면 이 저장소에 쓰기 권한이 있어야 합니다.
워크플로우 옵션에서 워크플로우 추가를 선택하세요. 이 옵션은 .에 /.github/workflows/새로운 워크플로우 파일을 생성합니다. 기존 워크플로우를 사용하려면 사용 가능한 워크플로우를 선택하고 워크플로우 파일을 선택하세요.
인증 설정에서 OpenID Connect(OIDC)를 사용하려면 사용자 지정 신원을 선택하세요. 이는 GitHub에 비밀을 저장할 필요가 없기 때문에 권장됩니다. 구독과 (새로운) 추천된 신원 이름을 선택하세요. 새로운 사용자 지정 관리 신원이 생성되어 웹사이트 기여자 역할에 대한 접근 권한이 부여됩니다. 기존 신원을 사용할 경우, 먼저 웹사이트 기여자 역할 권한을 부여해야 합니다.
중요
기본 인증을 선택하면 공유 비밀이 포함된 게시 프로필이 GitHub Secrets에 저장됩니다. 또한 SCM 기본 인증을 활성화해야 하는데, 이로 인해 앱의 보안이 떨어집니다.
Preview 파일을 선택하여 .github/workflows/ GitHub 리포지토리에 추가되는 워크플로 파일을 확인합니다.
저장을 선택하여 리포지토리에 워크플로 파일을 추가합니다. 현재 및 이전 배포 상태를 확인하려면 로그 탭을 선택하세요.
워크플로 구성 파일 만들기
GitHub 리포지토리에서 직접 Azure Functions 템플릿에서 GitHub Actions 워크플로 구성 파일을 만들 수 있습니다.
GitHub 리포지토리로 이동합니다.
작업 및 새 워크플로를 선택합니다.
함수를 검색합니다.
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/ 으로 저장되었는지 확인하고 '커밋 변경'을 선택하세요.
Azure Functions 작업
Azure Functions 작업(Azure/functions-action)은 코드가 Azure 기존 함수 앱 또는 앱의 특정 슬롯에 게시되는 방법을 정의합니다.
매개 변수
다음 표는 다음 Azure/functions-action입력 매개변수를 설명합니다:
| 매개 변수 |
Description |
|
app-name |
(필수) Azure에서 당신의 함수 앱 이름입니다. |
|
패키지 |
(필수) 프로젝트가 출판되는 길. 기본값: . (저장소 내 모든 파일). |
|
원격 구축 |
Flex Consumption 앱에 배포할 때 Kudu에서 빌드 액션을 활성화하도록 설정 true 하세요. 오릭스 빌드는 항상 수행됩니다; 배포 중에 scm-do-build나enable-oryx-build도 설정하지 마세요. 기본값: false. |
|
SCM-DO-빌드 도중 배포 |
Kudu 사이트가 원격 빌드와 같은 사전 배포 작업을 수행할 수 있도록 허용하세요. 배포 중에 Kudu가 프로젝트를 빌드하도록 설정 true 하세요. 기본값: false. 자세한 내용은 SCM_DO_BUILD_DURING_DEPLOYMENT를 참조하세요. |
|
enable-oryx-build |
Kudu가 Oryx를 사용해 프로젝트 의존성을 해결할 수 있도록 허용하세요. 이 작업과 scm-do-build-during-deploymenttrue 둘 다 워크플로우 대신 Oryx를 사용하도록 설정하세요. 기본값: false. Linux 전용입니다. |
|
slot-name |
배치 슬롯 . 기본값: 생산 슬롯. |
|
publish-profile |
게시 프로필을 포함하는 GitHub 비밀의 이름입니다. 권장 OIDC 인증 시 필요하지 않습니다. |
|
sku |
Flex Consumption 요금제에서 flexconsumption로 인증할 때 로 설정하세요. OIDC 인증이나 다른 호스팅 플랜에서는 필요하지 않습니다. |
|
리펙트-폼-XML |
(Java 전용) 배치 true 아티팩트를 pom.xml에서 파생하도록 설정됨. 일 때 true, 패키지 를 로 설정하세요 .. 기본값: false. |
|
존중-함수 무시하기 |
.funcignore 파일을 존중하고 나열된 경로를 제외하도록 설정 true 하세요. 기본값: false. |
다음 표는 각 호스팅 계획에서 지원되는 매개변수를 보여줍니다:
| 매개 변수 |
Flex 사용량 |
탄성 프리미엄 |
Dedicated |
소비 |
|
app-name |
필수 |
필수 |
필수 |
필수 |
|
패키지 |
필수 |
필수 |
필수 |
필수 |
|
원격 구축 |
Optional |
— |
— |
— |
|
SCM-DO-빌드 도중 배포 |
— |
Optional |
Optional |
Optional |
|
enable-oryx-build |
— |
선택 사항(리눅스) |
선택 사항(리눅스) |
선택 사항(리눅스) |
|
slot-name |
지원되지 않음 |
Optional |
Optional |
Optional |
|
publish-profile |
권장되지 않음 |
권장되지 않음 |
권장되지 않음 |
권장되지 않음 |
|
sku |
게시 프로필만 |
— |
— |
— |
|
리펙트-폼-XML |
선택적 (Java) |
선택적 (Java) |
선택적 (Java) |
선택적 (Java) |
|
존중-함수 무시하기 |
Optional |
Optional |
Optional |
Optional |
배포 방법
GitHub Actions를 사용할 때, 배포 방식은 호스팅 계획에 따라 달라집니다:
* 사용량 계획에서 Linux에서 앱을 실행하는 기능은 종료될 예정입니다. 자세한 내용은 Azure Functions 소비 계획 호스팅 참조하세요.
자세한 내용은 Azure Functions의 배포 기술을 참조하세요.
다음 단계