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

완료됨

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

중요합니다

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

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

먼저 GitHub 계정이 없는 경우 이제 GitHub 계정 만들기 페이지에서 계정을 만듭니다. (무료입니다.)

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

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

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

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

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

  3. 리포지토리 표시 유형 설정을 선택합니다. 퍼블릭 리포지토리는 인터넷의 모든 사용자가 액세스할 수 있습니다. 프라이빗 리포지토리는 사용자와 명시적으로 액세스를 공유하는 사용자에게만 액세스할 수 있습니다. (이 연습에서는 어느 쪽이든 가능합니다.)

  4. 다음을 사용하여 이 리포지토리를 초기화합니다.README 파일을 추가하세요를 선택하세요.

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

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

리포지토리를 생성하고 README 파일로 초기화했습니다. 템플릿 및 템플릿 매개 변수 파일을 리포지토리에 커밋해야 합니다.

비고

추가 정보 파일은 프로젝트를 더 자세히 설명하거나 프로젝트를 설치하거나 사용하는 방법과 같은 몇 가지 설명서를 추가할 수 있는 좋은 장소입니다. README 파일의 내용은 리포지토리의 첫 페이지에 자동으로 표시됩니다.

리포지토리에 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라는 작업은 하나만 호출됩니다. 이 작업에는 세 단계가 있습니다.

      1. 소스 코드를 확인하십시오.
      2. Azure에 로그인합니다.
      3. ARM 템플릿을 배포합니다.

    중요합니다

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

    비고

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

  4. 선택커밋 시작. 필요한 경우 코멘트와 설명을 추가합니다.

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

    메인 브랜치에 워크플로를 커밋하는 것을 보여주는 스크린샷

    워크플로 파일이 만들어지고 리포지토리의 주 분기에 커밋되면 워크플로의 트리거가 주 분기에 대한 커밋/푸시이기 때문에 워크플로가 자동으로 시작됩니다.

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

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

배포 확인

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

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

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