Terraform 및 GitHub Actions를 사용하여 Azure 인프라 프로비저닝

이 기사에서는 Terraform 및 GitHub Actions를 사용하여 Azure 인프라를 프로비저닝하는 방법을 설명합니다. 더 진행하기 전에 Terraform 및 GitHub Actions가 무엇인지 논의해 보겠습니다.

테라폼이란?



Terraform은 HashiCorp에서 만든 IaC(Infrastructure as a Code) 도구입니다. 전체 클라우드 인프라를 코드로 작성할 수 있으며 클라우드 서비스 공급자의 콘솔과 상호 작용할 필요가 없습니다. 모든 것이 자동화될 수 있습니다.



왜 GitHub Actions입니까?



우리는 인프라를 코드로 정의한다는 것을 알고 있습니다. 따라서 DevOps 및 운영 팀 구성원은 해당 코드에 액세스할 수 있어야 하며 코드를 업데이트할 때 인프라를 자동으로 업데이트하는 방법이 필요합니다. 그것이 GitHub Actions가 들어오는 곳입니다.

GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 GitHub의 지속적 통합 및 지속적 배포(CI/CD) 플랫폼입니다.



따라서 우리의 계획은 Azure 인프라 코드를 GitHub 리포지토리에 넣고 GitHub Actions를 사용하여 Terraform을 트리거하고 누군가 코드를 변경할 때 인프라를 업데이트하는 것입니다.

전제 조건:


  • 로컬 컴퓨터에서 Azure CLI를 구성해야 합니다.
  • 유효한 Azure 구독이 있어야 합니다.

  • 팔로우 😉



    1. 아래 명령을 사용하여 서비스 주체를 생성하고 나중에 사용할 수 있도록 출력을 저장합니다. (ServicePrincipalName을 의미 있는 이름으로 바꾸고 SubscriptionID를 Azure 구독 ID로 바꿉니다.)

    az ad sp create-for-rbac --name ServicePrincipalName --role Contributor --scopes /subscriptions/SubscriptionID
    



    2. Terraform 상태를 저장할 Azure 저장소 계정 컨테이너를 만듭니다.

    # Create Resource Group
    az group create -n tfstates -l eastus2
    
    # Create Storage Account
    az storage account create -n kstfstateaccount -g tfstates -l eastus2 --sku Standard_LRS
    
    # Create Storage Account Container
    az storage container create -n tfstate --account-name kstfstateaccount
    



    3. GitHub 리포지토리를 생성하고 Terraform 구성 파일을 커밋합니다. 예를 들어 다음 Terraform 구성을 사용하여 리소스 그룹과 컨테이너 레지스트리를 프로비저닝합니다.

    "main.tf"👇의 코드는 다음과 같습니다.

    provider "azurerm" {
      features {}
    }
    
    resource "azurerm_resource_group" "default" {
      name     = "container-registry-rg"
      location = "East US 2"
    
      tags = {
        environment = "Production"
      }
    }
    
    resource "azurerm_container_registry" "acr" {
      name                = "kspcontainerregistry"
      resource_group_name = azurerm_resource_group.default.name
      location            = "East US 2"
      sku                 = "Standard"
      admin_enabled       = true
    }
    
    output "acr_login_server" {
      value = azurerm_container_registry.acr.login_server
    }
    
    output "acr_admin_username" {
      value     = azurerm_container_registry.acr.admin_username
      sensitive = true
    }
    
    output "acr_admin_password" {
      value     = azurerm_container_registry.acr.admin_password
      sensitive = true
    }
    


    GitHub Actions와 팀 구성원이 동일한 인프라와 상호 작용할 때 모든 사람이 동일한 terraform 상태 파일에 액세스해야 합니다. 따라서 Terraform 백엔드를 초기화하고 이전에 만든 Azure 저장소 계정 컨테이너에 상태 파일을 저장합니다.

    "backend.tf"👇의 코드는 다음과 같습니다.

    terraform {
      backend "azurerm" {
        resource_group_name  = "tfstates"
        storage_account_name = "kstfstateaccount"
        container_name       = "tfstate"
        key                  = "terraform.tfstate"
      }
    }
    


    이제 Terraform 구성 파일을 GitHub 리포지토리로 푸시할 수 있습니다.


    4. 서비스 주체 자격 증명을 GitHub 리포지토리 비밀로 추가합니다.

    GitHub 리포지토리 설정으로 이동한 다음 비밀 섹션으로 이동합니다. 이제 다음 리포지토리 비밀을 추가합니다(첫 번째 단계에서 얻은 값 사용).
  • AZURE_AD_CLIENT_ID — 서비스 주체 앱/클라이언트 ID
  • AZURE_AD_CLIENT_SECRET - 서비스 주체 암호/클라이언트 암호
  • AZURE_AD_TENANT_ID - 서비스 주체 테넌트 ID
  • AZURE_SUBSCRIPTION_ID — 구독 ID




  • 5.마지막으로 GitHub Actions 구성 파일을 GitHub 리포지토리에 추가합니다.

    다음은 GitHub Actions 구성 파일 "actions.yml"입니다. 👇

    name: 'Terraform'
    
    on:
      push:
        branches:
        - main
      pull_request:
    
    jobs:
      terraform:
        name: 'Terraform'
        env:
          ARM_CLIENT_ID: ${{ secrets.AZURE_AD_CLIENT_ID }}
          ARM_CLIENT_SECRET: ${{ secrets.AZURE_AD_CLIENT_SECRET }}
          ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
          ARM_TENANT_ID: ${{ secrets.AZURE_AD_TENANT_ID }}
    
        runs-on: ubuntu-latest
        environment: production
    
        # Use the Bash shell regardless whether the GitHub Actions runner is ubuntu-latest, macos-latest, or windows-latest
        defaults:
          run:
            shell: bash
    
        steps:
        # Checkout the repository to the GitHub Actions runner
        - name: Checkout
          uses: actions/checkout@v2
    
        - name: 'Terraform Format'
          uses: hashicorp/terraform-github-actions@master
          with:
            tf_actions_version: 0.14.8
            tf_actions_subcommand: 'fmt'
            tf_actions_working_dir: "./terraform"
    
        - name: 'Terraform Init'
          uses: hashicorp/terraform-github-actions@master
          with:
            tf_actions_version: 0.14.8
            tf_actions_subcommand: 'init'
            tf_actions_working_dir: "./terraform"
    
        - name: 'Terraform Validate'
          uses: hashicorp/terraform-github-actions@master
          with:
            tf_actions_version: 0.14.8
            tf_actions_subcommand: 'validate'
            tf_actions_working_dir: "./terraform"
    
        - name: 'Terraform Plan'
          uses: hashicorp/terraform-github-actions@master
          with:
            tf_actions_version: 0.14.8
            tf_actions_subcommand: 'plan'
            tf_actions_working_dir: "./terraform"
    
        - name: Terraform Apply
          if: github.ref == 'refs/heads/main'
          uses: hashicorp/terraform-github-actions@master
          with:
            tf_actions_version: 0.14.8
            tf_actions_subcommand: 'apply'
            tf_actions_working_dir: "./terraform"
    


    이 구성 파일을 ".github/workflows"폴더에 추가해야 합니다. 따라서 폴더 구조는 다음과 같아야 합니다.



    이제 모든 것이 완벽하게 구성되었으며 모든 커밋을 리포지토리에 푸시할 수 있습니다. 파이프라인 상태를 보려면 리포지토리 작업 섹션을 방문하십시오.



    읽어주셔서 감사하고 잘못된 부분이 있으면 알려주세요. 🫡

    좋은 웹페이지 즐겨찾기