본문 바로가기

일::개발

Python-Flask 앱을 Github 통해 Azure Functions에 deploy 하기

Visual Studio Code 에서 아주 간단하게 Azure Functions에 현재 코드를 deploy 할 수 있지만, 간단하게 되는 만큼 실제 서비스에 deploy 되는 코드의 버전 관리가 체계적으로 되지 않는 일이 생긴다.

 

Github 에서 특정 branch 를 지정해서 항상 서비스 환경에 자동 deploy 되도록 한다거나, default branch에 PR이 머지되면 deploy 되도록 하면 편할 것 같다.

 

이미 Github 나 MS에서 다 지원해주고 있어서 정말 간단하게 이런 환경을 만들 수 있다.

 

Github에 repository가 있고, Azure 에 function도 있다고 가정하면, 

 

1. 인증을 위해 Azure에서 publish profile 을 다운받는다.

출처: MS Azure 문서(https://learn.microsoft.com/en-us/azure/azure-functions/functions-how-to-github-actions)

 

2. publish profile을 Github에 등록한다.

 

<Github repository - Settings - Secrets and variables - Actions>

 

AZURE_FUNCTIONAPP_PUBLISH_PROFILE 이라는 이름으로 1번에서 다운로드한 publish profile 파일의 내용을 붙여넣는다.

 

3. workflow 생성

Github repository의 Actions 탭에서 New Workflow 버튼을 눌러서 새 workflow 를 생성한다.

 

 

Azure로 검색해서 "Deploy Python app to Azure Functions App" 를 Configure 하면 

.github/workflows/azure-functions-app-python.yml 파일을 만들 수 있다.

 

# This workflow will build a Python app and deploy it to an Azure Functions App on Linux when a commit is pushed to your default branch.
#
# This workflow assumes you have already created the target Azure Functions app.
# For instructions see https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-vs-code-python?pivots=python-mode-configuration
#
# To configure this workflow:
# 1. Set up the following secrets in your repository:
#   - AZURE_FUNCTIONAPP_PUBLISH_PROFILE
# 2. Change env variables for your configuration.
#
# For more information on:
#   - GitHub Actions for Azure: https://github.com/Azure/Actions
#   - Azure Functions Action: https://github.com/Azure/functions-action
#   - Publish Profile: https://github.com/Azure/functions-action#using-publish-profile-as-deployment-credential-recommended
#   - Azure Service Principal for RBAC: https://github.com/Azure/functions-action#using-azure-service-principal-for-rbac-as-deployment-credential
#
# For more samples to get started with GitHub Action workflows to deploy to Azure: https://github.com/Azure/actions-workflow-samples/tree/master/FunctionApp

name: Deploy Python project to Azure Function App

on:
  push:
    branches:
    - ["main"]

env:
  AZURE_FUNCTIONAPP_NAME: 'your-app-name'   # set this to your function app name on Azure
  AZURE_FUNCTIONAPP_PACKAGE_PATH: '.'       # set this to the path to your function app project, defaults to the repository root
  PYTHON_VERSION: '3.9'                     # set this to the python version to use (e.g. '3.6', '3.7', '3.8')

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    environment: dev
    steps:
    - name: 'Checkout GitHub Action'
      uses: actions/checkout@v3

    # If you want to use Azure RBAC instead of Publish Profile, then uncomment the task below
    # - name: 'Login via Azure CLI'
    #   uses: azure/login@v1
    #   with:
    #     creds: ${{ secrets.AZURE_RBAC_CREDENTIALS }} # set up AZURE_RBAC_CREDENTIALS secrets in your repository

    - name: Setup Python ${{ env.PYTHON_VERSION }} Environment
      uses: actions/setup-python@v4
      with:
        python-version: ${{ env.PYTHON_VERSION }}

    - name: 'Resolve Project Dependencies Using Pip'
      shell: bash
      run: |
        pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}'
        python -m pip install --upgrade pip
        pip install -r requirements.txt --target=".python_packages/lib/site-packages"
        popd
    - name: 'Run Azure Functions Action'
      uses: Azure/functions-action@v1
      id: fa
      with:
        app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
        package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
        publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }} # Remove publish-profile to use Azure RBAC
        scm-do-build-during-deployment: true
        enable-oryx-build: true

 

기본적으로 생성되는 샘플은 main branch에 push가 들어오면 azure function에 deploy 하도록 되어 있다.

 

   "- [main]" 부분만 "- main" 으로 변경하고, AZURE_FUNCTIONAPP_NAME 에 만들어둔 function 이름을 넣어주면 끝.

 

이렇게 하고 main branch 에 수정된 코드를 push 하면 바로 azure에 반영된다. 

 

deploy 조건을 변경하고 싶다면 https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions 참조해서 on 부분을 수정해주면 된다.