GitHub Actions를 사용하여 Azure Functions에 배포하기

GitHub Actions 워크플로우를 사용해 함수 코드를 자동으로 빌드하고 AzureAzure/functions-action에 배포할 수 있습니다.

GitHub Actions를 사용해 배포하려면 다음 세 가지 핵심 단계를 완료하세요:

  1. Azure에서 사용자 지정 관리 신원을 생성하고, 연합 자격 증명이 있어 GitHub 저장소를 신뢰하며, 함수 앱에서 웹사이트 기여자 역할을 할당하세요.
  2. GitHub에 신원의 클라이언트 ID, 테넌트 ID, 구독 ID를 저장소 비밀로 추가하세요.
  3. 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로 인증할 수 있습니다.

  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
    

    이 세 가지 값은 나중에 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에서 컨테이너를 배포하는 경우, 관리 신원에도 역할도 할당 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에 자격 증명 추가하기

관리 신원을 만들 때 복사한 값을 사용하세요.

  1. GitHub 리포지토리로 이동합니다.

  2. 설정>:비밀과 변수,>액션으로 가세요.

  3. 비밀 탭에서 새 저장소 비밀을 선택하세요.

  4. 다음 비밀 각각을 만드세요:

    Name Value
    AZURE_CLIENT_ID clientId 관리 신원의
    AZURE_TENANT_ID tenantId 관리 신원의
    AZURE_SUBSCRIPTION_ID 기능 앱이 포함된 구독 ID

프라이빗 레지스트리에서 컨테이너 배포를 할 때는 레지스트리별 비밀도 필요합니다. 자세한 내용은 도커 로그인 작업을 참조하세요.

템플릿에서 워크플로 만들기

워크플로 구성을 수동으로 만드는 가장 좋은 방법은 공식적으로 지원되는 템플릿에서 시작하는 것입니다.

  1. Windows 또는 Linux 중 하나를 선택하여 올바른 운영 체제에 대한 템플릿을 가져오는지 확인합니다.

    Windows에 runs-on: windows-latest을(를) 사용하여 배포합니다. 컨테이너화된 배포는 리눅스가 필요합니다.

  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_ID, secrets.AZURE_TENANT_ID 참조가 secrets.AZURE_SUBSCRIPTION_ID과 일치하는지 확인하세요.

  5. 리포지토리의 /.github/workflows/ 경로에 이 새 YAML 파일을 추가합니다.

포털에서 워크플로 구성을 만들기

포털을 사용해 GitHub Actions를 활성화하면, Functions가 모든 설정을 자동으로 처리합니다. 수동으로 관리 신원을 만들거나, 자격 증명을 설정하거나, 워크플로우 파일을 작성할 필요가 없습니다. 기능들은 다음과 같은 작업을 대신 수행합니다:

Azure 구독 내에서:

  • 사용자 지정 관리 신원을 생성하고 기능 앱에서 웹사이트 기여자 역할을 할당합니다.
  • GitHub OIDC 인증을 위한 관리 신원에 연합 자격 증명을 추가합니다.

GitHub 저장소에서:

  • 클라이언트 ID, 구독 ID, 테넌트 ID 값을 GitHub Actions 비밀로 추가합니다.
  • 애플리케이션 스택을 기반으로 워크플로우 파일을 생성하고 에 커밋합니다..github/workflows

함수 앱을 만드는 동안

Azure Portal에서 함수를 만들 때 배포 탭을 통해 GitHub Actions 빠르게 시작할 수 있습니다. 새 함수 앱을 만들 때 GitHub Actions 워크플로를 추가하려면 다음을 수행합니다.

  1. Azure 포털Create Function App 흐름에서 배포를 선택합니다.

  2. 각 코드 업데이트가 Azure Portal에 대한 코드 푸시를 트리거하도록 하려면 연속 배포를 사용하도록 설정합니다.

  3. GitHub 설정에서 GitHub 계정 연결을 위해 승인을 선택하세요. 저장소에 쓰기 권한이 있는 GitHub 계정으로 로그인하세요.

  4. GitHub 조직, 리포지토리 및 분기를 입력합니다.

  5. 선택적으로, Preview 파일을 선택하여 워크플로우 파일이 생성되어 저장소에 추가되기 전 어떻게 보이는지 확인할 수 있습니다.

  6. 함수 앱 구성을 완료합니다. 이제 GitHub 리포지토리에 /.github/workflows/ 새 워크플로 파일이 포함됩니다.

기존 함수 앱의 경우

기존 함수 앱에 GitHub Actions 워크플로를 추가하려면 다음을 수행합니다.

  1. Azure 포털에서 함수 앱으로 가서 Deployment>Deployment Center를 선택하세요.

  2. 지속적 배포(CI/CD)를 선택하세요. 원본의 경우 GitHub를 선택합니다. 기본 메시지가 보이지 않으면 'Createwith GitHub Actions'를 선택하고, GitHub Actions를 선택한 후 확인(OK)을 선택하세요.

  3. 아직 GitHub 접근 권한을 부여하지 않았다면, 권한 부여를 선택하세요. GitHub 자격 증명을 제공하고 사인 선택합니다. 다른 GitHub 계정에 권한을 부여하려면 계정 변경을 선택하고 다른 계정으로 로그인합니다.

  4. GitHub Organization, RepositoryBranch 선택합니다. GitHub Actions를 사용해 배포하려면 이 저장소에 쓰기 권한이 있어야 합니다.

  5. 워크플로우 옵션에서 워크플로우 추가를 선택하세요. 이 옵션은 .에 /.github/workflows/새로운 워크플로우 파일을 생성합니다. 기존 워크플로우를 사용하려면 사용 가능한 워크플로우를 선택하고 워크플로우 파일을 선택하세요.

  6. 인증 설정에서 OpenID Connect(OIDC)를 사용하려면 사용자 지정 신원을 선택하세요. 이는 GitHub에 비밀을 저장할 필요가 없기 때문에 권장됩니다. 구독과 (새로운) 추천된 신원 이름을 선택하세요. 새로운 사용자 지정 관리 신원이 생성되어 웹사이트 기여자 역할에 대한 접근 권한이 부여됩니다. 기존 신원을 사용할 경우, 먼저 웹사이트 기여자 역할 권한을 부여해야 합니다.

    중요

    기본 인증을 선택하면 공유 비밀이 포함된 게시 프로필이 GitHub Secrets에 저장됩니다. 또한 SCM 기본 인증을 활성화해야 하는데, 이로 인해 앱의 보안이 떨어집니다.

  7. Preview 파일을 선택하여 .github/workflows/ GitHub 리포지토리에 추가되는 워크플로 파일을 확인합니다.

  8. 저장을 선택하여 리포지토리에 워크플로 파일을 추가합니다. 현재 및 이전 배포 상태를 확인하려면 로그 탭을 선택하세요.

워크플로 구성 파일 만들기

GitHub 리포지토리에서 직접 Azure Functions 템플릿에서 GitHub Actions 워크플로 구성 파일을 만들 수 있습니다.

  1. GitHub 리포지토리로 이동합니다.

  2. 작업새 워크플로를 선택합니다.

  3. 함수를 검색합니다.

    GitHub Actions 함수 템플릿 검색 스크린샷입니다.

  4. Microsoft Azure 작성한 표시된 함수 앱 워크플로에서 코드 언어와 일치하는 함수를 찾고 Configure 선택합니다.

  5. 새로 만든 YAML 파일에서 env.AZURE_FUNCTIONAPP_NAME 매개 변수를 Azure 함수 앱 리소스의 이름으로 업데이트합니다. 또한 C#이나 DOTNET_VERSION Python 앱처럼 앱 PYTHON_VERSION 에서 사용하는 언어 버전을 설정하는 매개변수도 업데이트해야 할 수 있습니다.

  6. 기본 템플릿은 권장되는 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
      
  7. 새 워크플로우 파일이 적절한 이름 /.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를 사용할 때, 배포 방식은 호스팅 계획에 따라 달라집니다:

호스팅 계획 배포 방법
Flex 사용량 단일 배포
탄성 프리미엄 Zip 배포
전용(App Service) Zip 배포
소비 Windows: Zip 배포
Linux: 외부 패키지 URL*

* 사용량 계획에서 Linux에서 앱을 실행하는 기능은 종료될 예정입니다. 자세한 내용은 Azure Functions 소비 계획 호스팅 참조하세요.

자세한 내용은 Azure Functions의 배포 기술을 참조하세요.

다음 단계