Terraform 및 GitHub Actions를 사용하여 Azure 인프라 프로비저닝
테라폼이란?
Terraform은 HashiCorp에서 만든 IaC(Infrastructure as a Code) 도구입니다. 전체 클라우드 인프라를 코드로 작성할 수 있으며 클라우드 서비스 공급자의 콘솔과 상호 작용할 필요가 없습니다. 모든 것이 자동화될 수 있습니다.
왜 GitHub Actions입니까?
우리는 인프라를 코드로 정의한다는 것을 알고 있습니다. 따라서 DevOps 및 운영 팀 구성원은 해당 코드에 액세스할 수 있어야 하며 코드를 업데이트할 때 인프라를 자동으로 업데이트하는 방법이 필요합니다. 그것이 GitHub Actions가 들어오는 곳입니다.
GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 GitHub의 지속적 통합 및 지속적 배포(CI/CD) 플랫폼입니다.
따라서 우리의 계획은 Azure 인프라 코드를 GitHub 리포지토리에 넣고 GitHub Actions를 사용하여 Terraform을 트리거하고 누군가 코드를 변경할 때 인프라를 업데이트하는 것입니다.
전제 조건:
팔로우 😉
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 리포지토리 설정으로 이동한 다음 비밀 섹션으로 이동합니다. 이제 다음 리포지토리 비밀을 추가합니다(첫 번째 단계에서 얻은 값 사용).
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"폴더에 추가해야 합니다. 따라서 폴더 구조는 다음과 같아야 합니다.
이제 모든 것이 완벽하게 구성되었으며 모든 커밋을 리포지토리에 푸시할 수 있습니다. 파이프라인 상태를 보려면 리포지토리 작업 섹션을 방문하십시오.
읽어주셔서 감사하고 잘못된 부분이 있으면 알려주세요. 🫡
Reference
이 문제에 관하여(Terraform 및 GitHub Actions를 사용하여 Azure 인프라 프로비저닝), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/krishanshamod/provision-azure-infrastructure-using-terraform-and-github-actions-j0o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)