연습 - GitHub Actions를 사용하여 CI/CD 작업의 일부로 ARM 템플릿 배포

완료됨

여기서는 GitHub Actions 워크플로에서 ARM(Azure Resource Manager) 템플릿을 배포합니다.

Important

Microsoft Learn 환경 외부에서 연습을 수행합니다. 연습을 수행하려면 자체 Azure 구독이 있어야 하며 요금이 발생할 수 있습니다. 이 구독은 샌드박스 구독에서 지원되지 ‘않는’ 서비스 주체를 만들어야 하기 때문에 필요합니다. Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

GitHub 계정 및 리포지토리 만들기

먼저, GitHub 계정이 없으면 지금 GitHub 계정 만들기 페이지에서 계정을 만듭니다. 무료입니다.

GitHub 계정 만들기 페이지를 보여 주는 스크린샷

계정을 만든 후에는 로그인하고 템플릿을 IaC(Infrastructure as Code) 모델의 일부로 유지할 수 있는 새 리포지토리를 만듭니다. 리포지토리(업계에서는 일반적으로 repo라고 함)를 만들려면 다음 단계를 따릅니다.

  1. GitHub 사이트에서 페이지의 오른쪽 위에 있는 + 드롭다운 메뉴를 사용하고 +를 선택합니다. 또는 녹색 리포지토리 만들기 단추를 선택합니다(있는 경우).

    GitHub 리포지토리를 만들기 위한 선택 항목을 보여 주는 스크린샷

  2. 짧고 기억하기 쉬운 리포지토리 이름을 입력합니다. 예를 들어 Deploy-ARM-Template을 사용합니다. 필요에 따라 리포지토리에 관한 설명을 추가합니다. 예를 들어 GitHub Actions를 사용하여 내 첫 번째 ARM 템플릿 배포를 사용합니다.

  3. 리포지토리 표시 유형 설정을 선택합니다. 퍼블릭 리포지토리는 인터넷의 모든 사용자가 액세스할 수 있습니다. 프라이빗 리포지토리는 액세스 권한을 명시적으로 공유하는 사용자만 액세스할 수 있습니다. 이 연습에서는 둘 다 작동합니다.

  4. 다음을 사용하여 이 리포지토리 초기화:에서 추가 정보 파일 추가를 선택합니다.

  5. 리포지토리 만들기를 선택합니다.

    새 리포지토리 세부 정보 만들기를 보여 주는 스크린샷

리포지토리를 만들고 추가 정보 파일을 사용하여 초기화했습니다. 템플릿과 템플릿 매개 변수 파일을 리포지토리로 커밋해야 합니다.

참고

추가 정보 파일에서는 프로젝트를 보다 자세히 설명하거나 프로젝트를 설치 또는 사용하는 방법과 같은 몇 가지 설명서를 추가할 수 있습니다. 추가 정보 파일의 콘텐츠는 리포지토리의 앞 페이지에 자동으로 표시됩니다.

ARM 템플릿 파일을 리포지토리에 커밋

  1. GitHub에서 리포지토리의 기본 페이지로 이동합니다.

  2. 파일 목록 위의 파일 추가 드롭다운 목록에서 새 파일 만들기를 선택합니다.

    리포지토리에 템플릿을 추가하기 위한 선택 항목을 보여 주는 스크린샷

  3. 파일 이름 필드에 템플릿의 이름 및 확장명을 입력합니다. 이 연습에서는 이름 azuredeploy.json을 사용합니다. 다음 템플릿을 복사하고 새 GitHub 파일에 붙여넣습니다.

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
            "VnetName": {
                "type": "string",
                "defaultValue": "VNet-001",
                "metadata": {
                    "description": "Virtual Network Name"
                }
            },
            "CostCenterIO": {
                "type": "string",
                "defaultValue": "12345",
                "metadata": {
                    "description": "Cost Center IO number for cross billing"
                }
            },
            "OwnerName": {
                "type": "string",
                "defaultValue": "John Smith",
                "metadata": {
                    "description": "Name of the stakeholder responsible for this resource"
                }
            }
        },
        "variables": {},
        "resources": [
            {
                "apiVersion": "2018-10-01",
                "type": "Microsoft.Network/virtualNetworks",
                "name": "[parameters('VnetName')]",
                "location": "[resourceGroup().location]",
                "tags": {
                    "CostCenter": "[parameters('CostCenterIO')]",
                    "Owner": "[parameters('OwnerName')]"
                },
                "properties": {
                    "addressSpace": {
                        "addressPrefixes": [
                            "10.0.0.0/16"
                        ]
                    },
                    "enableVmProtection": false,
                    "enableDdosProtection": false,
                    "subnets": [
                        {
                            "name": "subnet001",
                            "properties": {
                                "addressPrefix": "10.0.0.0/24"
                            }
                        },
                        {
                            "name": "subnet002",
                            "properties": {
                                "addressPrefix": "10.0.1.0/24"
                            }
                        }
                    ]
                }
            }
        ]
    }
    
  4. 새 파일 커밋 섹션에 설명을 추가하고 새 파일 커밋을 선택하여 리포지토리에 저장합니다.

    리포지토리에 새 템플릿을 저장하는 방법을 보여 주는 스크린샷

GitHub Actions와 Azure 구독 간 인증 구성

GitHub Actions를 사용하여 Azure에 리소스를 배포하려면 Azure 서비스 주체를 만들고 템플릿에 정의된 리소스를 만들 권한을 부여해야 합니다. 구독에 로그인한 후 Azure Portal의 Azure Cloud Shell 섹션에서 해당 단계를 수행합니다.

서비스 주체 만들기

Azure 리소스를 배포하는 GitHub Actions 워크플로 주체의 경우 해당 작업에는 적합한 기본 제공 기여자가 필요합니다.

다음 Azure CLI 스크립트는 Azure 리소스 그룹에 대한 기여자 권한을 사용하여 Azure 서비스 주체를 생성하는 방법을 보여 줍니다. 이 리소스 그룹은 워크플로가 ARM 템플릿에 정의된 리소스를 배포하는 위치입니다.

projectName="GitHubActionExercise"
location="eastus"
resourceGroupName="${projectName}-rg"
appName="http://${projectName}"

# Create the resource group
az group create --name $resourceGroupName --location $location

# Store the resource group ID in a variable
scope=$(az group list --query "[?contains(name, '$resourceGroupName')].id" -o tsv)

# Create the service principal with contributor rights to the resource group we just created
az ad sp create-for-rbac --name $appName --role Contributor --scopes $scope --sdk-auth

포털에서 구독에 로그인하는 동안 Cloud Shell 아이콘을 선택하여 페이지 아래쪽에서 셸을 엽니다.

Cloud Shell 열기를 보여 주는 애니메이션

셸에서 앞의 코드를 사용하여 서비스 주체를 만듭니다. 다음과 같은 결과를 가져옵니다. GitHub에서 비밀을 구성할 때 필요하므로 결과의 JSON 부분(다음 스크린샷에서 빨간색 상자의 콘텐츠)을 복사합니다.

Azure에서 서비스 주체 만들기의 결과를 보여 주는 스크린샷

GitHub에서 다음 단계를 수행하여 JSON 출력을 복사하고 GitHub 리포지토리 내에 GitHub 비밀로 저장합니다. GitHub 리포지토리에서 설정 탭을 선택합니다. 왼쪽 메뉴에서 비밀 드롭다운을 선택한 다음 Codespaces를 선택합니다.

다음 값을 입력한 다음, 비밀 추가를 선택합니다.

  • 이름: AZURE_CREDENTIALS를 입력합니다.
  • 비밀: 이전에 복사한 JSON 출력을 붙여넣습니다.

GitHub 비밀에 새 서비스 주체 비밀 정보를 추가하는 방법을 보여 주는 스크린샷

워크플로에서 인증을 지정하려면 이 정보가 필요합니다.

워크플로 만들기

워크플로 파일은 리포지토리의 루트에 있는 .github/workflows 폴더에 저장해야 합니다. 워크플로 파일 확장명은 .yml 또는 .yaml일 수 있습니다.

워크플로 파일을 만든 다음, 파일을 리포지토리로 푸시/업로드할 수 있습니다. 또는 다음 절차를 사용하여 GitHub 인터페이스에서 파일을 만들 수 있습니다.

  1. GitHub 리포지토리의 위쪽 메뉴에서 작업을 선택하고 워크플로 직접 설정을 선택합니다.

    워크플로를 설정하기 위한 선택 항목을 보여 주는 스크린샷

  2. main.yml 대신 다른 이름을 사용하려면 워크플로 파일의 이름을 바꿉니다. 예를 들어 deployARMTemplate.yml을 사용합니다.

  3. .yml 파일의 콘텐츠를 다음 코드로 바꿉니다.

    참고

    GitHub Marketplace에는 ARM 템플릿을 배포하는 데 사용할 수 있는 몇 가지 사용자 지정 빌드 작업이 있습니다. 이 모듈에서는 ARM(Azure Resource Manager) 템플릿 배포라는 마켓플레이스 공급자를 사용합니다.

    name: Deploy ARM Template
    
    on:
      push:
        branches:
          - main
    env:
      AZURE_SUBSCRIPTION_ID: << Subscription Id >>   # set this to your Azure Subscription Id
      AZURE_RESOURCE_GROUP: GitHubActionExercise-rg   # set this to your target resource group
    
    jobs:
      deploy-virtual-network-template:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout source code
            uses: actions/checkout@main
    
          - name: Login to Azure
            uses: azure/login@v1
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
    
          - name: Deploy ARM Template
            uses: azure/arm-deploy@v1
            with:
              scope: resourcegroup
              subscriptionId: ${{ env.AZURE_SUBSCRIPTION_ID }}
              resourceGroupName: ${{ env.AZURE_RESOURCE_GROUP }}
              template: ./azuredeploy.json
    

    워크플로 파일에는 세 개의 섹션이 있습니다.

    • name: 워크플로의 이름입니다.

    • on: 워크플로를 트리거하는 GitHub 이벤트의 이름입니다. 푸시 이벤트가 기본 분기에서 두 개 이상의 파일을 수정하는 경우 워크플로가 트리거됩니다.

    • jobs: 워크플로 실행은 하나 이상의 작업으로 구성됩니다. 하나의 작업만 deploy-virtual-network-template이라고 합니다. 이 작업은 3단계로 구성됩니다.

      1. 원본 코드를 체크 아웃합니다.
      2. Azure에 로그인합니다.
      3. ARM 템플릿을 배포합니다.

    중요

    creds: ${{ secrets.AZURE_CREDENTIALS }} 식의 비밀 이름이 리포지토리 설정에 저장한 비밀의 이름과 일치하는지 확인합니다. Deploy ARM Template 단계 template: $GITHUB_WORKSPACE/azuredeploy.json의 ARM 템플릿 이름이 이전 리포지토리에 저장한 이름과 일치하는지 확인합니다.

    참고

    배포 자격 증명을 구성할 때 앞의 Azure CLI 코드를 사용한 경우 리소스 그룹 이름은 GitHubActionExercise-rg이어야 합니다. 생성된 리소스 그룹 이름은 rg가 추가된 프로젝트 이름입니다.

  4. 커밋 시작을 선택합니다. 필요한 경우 주석 및 설명을 추가합니다.

  5. 기본 분기에 직접 커밋이 선택되어 있는지 확인한 다음, 새 파일 커밋(또는 변경 내용 커밋)을 선택합니다.

    기본 분기에 워크플로를 커밋하는 방법을 보여 주는 스크린샷.

    워크플로 파일이 생성되고 리포지토리의 기본 분기로 커밋된 후에는 워크플로의 트리거가 기본 분기에 대한 커밋/푸시이므로 워크플로가 자동으로 시작됩니다.

    on:
      push:
        branches:
          - main
    
  6. 리포지토리로 이동하고 워크플로의 상태를 확인합니다.

    워크플로 상태를 보여 주는 스크린샷

배포 확인

워크플로가 완료되면 Azure Portal로 이동하여 배포 상태를 확인합니다.

왼쪽 창에서 리소스 그룹>GitHubActionExercise-rg를 선택합니다. 배포 창에서 배포에 성공했는지 확인합니다.

배포 상태를 보여 주는 스크린샷