상세 컨텐츠

본문 제목

Azure Terraform(feat. azure)

Ops/Cloud

by 크리두 2024. 11. 8. 12:49

본문

반응형

azure를 기준으로 terraform 기본 인프라 구성 방법 정리 이 글에서는 opentofu를 이용해서 사용하지만 terraform 문법과 거의 비슷하다.

먼저 기본적인 인프라 설정이 필요하다. aws에서는 iam, vpc, subnet 등의 기본적 설정이 필요한 것처럼 azure에도 resource group, virtual network, subnet 등이 있다. 직접 관리하지 않는다면 이미 설정이 되어 있는데 terraform을 사용하기 위해서는 기존의 인프라를 import하여 설정을 추가해야한다.

Azure terraform 인증

terraform에서 azure 리소스들을 만들기 위해서는 인증이 필요하다. 민감한 정보라 git 등에는 Push 하지 않고 local만 다루도록 처리한다.

Azure login & 구독 확인

$ az login
$ az account show
{
  "environmentName": "AzureCloud",
  "homeTenantId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "isDefault": true,
  "managedByTenants": [],
  "name": "xxxxxxxxxxxxxxxx",
  "state": "Enabled",
  "tenantDefaultDomain": "azgmkt.onmicrosoft.com",
  "tenantDisplayName": "xxxxxxxxxx",
  "tenantId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "user": {
    "name": "xxxxxxxxxx@azgmkt.onmicrosoft.com",
    "type": "user"
  }
}

위 구독 정보를 확인하고 id 값을 이용하여 다음의 Service Principal 생성에 사용한다.

Servie Principal 생성

$ az account list --query "[?user.name=='xxxxxxxxx@azgmkt.onmicrosoft.com'].{Name:name, ID:id, Default:isDefault}" --output Table
Name                 ID                                    Default
-------------------  ------------------------------------  ---------
xxxxxxxxxxxxxxxxxxx  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  True
xxxxxxxxxxxxxx       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  False

명령어에서 xxxxx 부분의 계정 명을 넣어 구독 ID를 Table 형태로 받아오는 명령어이다. 출력된 결과에서 ID 부분을 이용하여 생성한다.

# Bash script
let "randomIdentifier=$RANDOM*$RANDOM"
servicePrincipalName="msdocs-sp-$randomIdentifier"
roleName="azureRoleName"
subscriptionID=$(az account show --query id --output tsv)
# Verify the ID of the active subscription
echo "Using subscription ID $subscriptionID"
resourceGroup="myResourceGroupName"

echo "Creating SP for RBAC with name $servicePrincipalName, with role $roleName and in scopes /subscriptions/$subscriptionID/resourceGroups/$resourceGroup"
az ad sp create-for-rbac --name $servicePrincipalName --role $roleName --scopes /subscriptions/$subscriptionID/resourceGroups/$resourceGroup

생성 한후의 결과값을 환경변수에 지정해서 사용하면 편하다.

{
  "appId": "a4f34577-8cdb-4d98-9444-5bc0cbf882a8",
  "displayName": "azgmkttfdev",
  "password": "????????????????????????????????????",
  "tenant": "d3fb846c-8bfe-48a0-9334-21dc756b97d0"
}
  • appID : ARM_CLIENT_ID
  • password : ARM_CLIENT_SECRET
  • tenant : ARM_TENANT_ID
  • subscriptionID : ARM_SUBSCRIPTION_ID
export ARM_SUBSCRIPTION_ID=$SUB_ID
export ARM_TENANT_ID=$TENANT_ID
export ARM_CLIENT_ID=$APP_ID
export ARM_CLIENT_SECRET=$PASSWORD

terraform init

terraform 기본적인 문법을 설정하고 나면 init 명령어를 통해 초기화 작업을 해줘야한다. 기본적인 환경 설정을 위한 provider.tf 파일을 생성하여 설정한다.

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~>3.0"
    }
  }
}

provider "azurerm" {
  features {}
  subscription_id   = data.external.env.result["ARM_SUBSCRIPTION_ID"]
  tenant_id         = data.external.env.result["ARM_TENANT_ID"]
  client_id         = data.external.env.result["ARM_CLIENT_ID"]
  client_secret     = data.external.env.result["ARM_CLIENT_SECRET"]
}

다음은 script를 통해 service principal을 통해 인증 정보를 이용

data "external" "env" {
  program = ["./env.sh"]
}
 
output "env" {
  value = data.external.env.result
}
#!/bin/sh
 
# 로컬 환경 변수를 Terraform 구성에 주입
 
cat <<EOF
{
  "ARM_SUBSCRIPTION_ID": "$ARM_SUBSCRIPTION_ID",
  "ARM_TENANT_ID": "$ARM_TENANT_ID",
  "ARM_CLIENT_ID": "$ARM_CLIENT_ID",
  "ARM_CLIENT_SECRET": "$ARM_CLIENT_SECRET"
}
EOF

bash script를 통해 환경변수를 읽어와서 provider.tf의 provider.azurerm 안의 환경 변수에 값을 넣어주는 방식이다.

terraform import

https://developer.hashicorp.com/terraform/cli/commands/import

인프라 설정에 있어서 미리 만들어진 리소스에 대해서는 import 작업이 필요하다. 보통은 리소스 생성을 하면서 진행하지만 이미 만들어진 경우도 있다.

$ terraform import [options] ADDRESS ID

주로 import 그 다음 리소스 이름, 주소나 ID 값을 넣어서 사용한다. 예를 들어 azure resource group이 있다면 다음과 같이 import한다.

resource "azurerm_resource_group" "cnative" {
  name     = var.resource_group_name
  location = var.resource_group_location
}

위와 같이 resource group을 정의해 놓은 tf 파일이 있다고 하면 azurerm_resource_group.cnative 한 후 뒤에 주소나 ID를 이용 여기서는 다음의 명령어와 같이 subscriptions_id의 주소를 이용한다.

$ tofu import azurerm_resource_group.cnative /subscriptions/[subscriptions_id]/resourceGroups/[subscriptions_name]
  • [subscriptions_id] : 구독 ID
  • [subscriptions_name] : 기존에 생성되어 있는 subscriptions_name

terraform plan

terraform apply

반응형

'Ops > Cloud' 카테고리의 다른 글

AKS Best Practice - Pod 보안  (0) 2024.02.22
AWS Subnet 생성 및 라우팅 퍼블릭 설정  (0) 2020.08.15
AWS CLI 설치 및 VPC/Subnet 생성  (0) 2020.08.15
AWS EC2 ssh root 접속하기  (0) 2019.12.04

관련글 더보기

댓글 영역