Azure PowerShell을 사용하여 Azure Cloud Shell에서 Terraform 구성

Terraform은 클라우드 인프라의 정의, 미리 보기 및 배포를 사용합니다. Terraform을 사용하는 경우 HCL 구문를 사용하여 구성 파일을 만듭니다. HCL 구문을 사용하면 클라우드 공급자(예: Azure) 그리고 클라우드 인프라를 구성하는 요소를 지정할 수 있습니다. 구성 파일을 만든 후 배포되기 전에 인프라 변경을 미리 볼 수 있는 실행 계획를 만듭니다. 변경 내용을 확인 한 후에는 실행 계획을 적용하여 인프라를 배포합니다.

이 문서에서는 Cloud Shell 및 PowerShell을 사용하여 Azure 에서 Terraform을 시작하는 방법을 보여줍니다.

이 문서에서는 다음 방법을 설명합니다.

  • Cloud Shell 구성
  • 일반적인 Terraform 및 Azure 인증 시나리오 이해
  • Cloud Shell에서 Microsoft 계정을 통해 인증(Bash 또는 PowerShell 사용)
  • Windows에서 Microsoft 계정을 통해 인증(Bash 또는 PowerShell 사용)
  • Azure CLI를 사용하여 서비스 주체 만들기
  • Azure PowerShell을 사용하여 서비스 사용자 만들기
  • 환경 변수에서 서비스 주체 자격 증명 지정
  • Terraform 공급자 블록에서 서비스 주체 자격 증명 지정

1. 환경 구성

  • Azure 구독: Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

2. Cloud Shell 열기

  1. Cloud Shell 세션이 이미 열려 있는 경우 다음 섹션으로 건너뛸 수 있습니다.

  2. Azure Portal로 이동합니다.

  3. 필요한 경우 Azure 구독에 로그인하고 Azure 디렉터리를 변경합니다.

  4. Cloud Shell을 엽니다.

    Open Cloud Shell from the top menu in the Azure portal.

  5. 이전에 Cloud Shell을 사용하지 않은 경우 환경 및 스토리지 설정을 구성합니다.

  6. 명령줄 환경을 선택합니다.

    Select the CLI you want to use in Cloud Shell.

3. Azure Cloud Shell에 최신 버전의 Terraform 설치

Cloud Shell은 최신 버전의 Terraform으로 자동으로 업데이트됩니다. 그러나 업데이트는 릴리스 후 2주 이내에 제공됩니다. 이 문서에서는 현재 버전의 Terraform을 다운로드하고 설치하는 방법을 보여줍니다.

  1. Cloud Shell에서 사용되는 Terraform의 버전을 확인합니다.

    terraform version
    
  2. Cloud Shell에 설치된 Terraform 버전이 최신 버전이 아닌 경우 Terraform 버전이 최신 버전이 아님을 나타내는 메시지가 표시됩니다.

  3. 표시된 버전으로 잘 작업하려면 다음 섹션으로 건너뜁니다. 그렇지 않으면 다음 단계를 계속합니다.

  4. Terraform 다운로드 페이지찾습니다.

  5. Linux 다운로드 링크로 스크롤합니다.

  6. 마우스를 64비 트 링크 위로 이동합니다. 이 링크는 Cloud Shell에 적합한 최신 64비트 Linux AMD 버전용입니다.

  7. URL을 복사합니다.

  8. curl을 실행하여 자리 표시자를 이전 단계의 URL로 바꿉니다.

    curl -O <terraform_download_url>
    
  9. 파일의 압축을 풉니다.

    unzip <zip_file_downloaded_in_previous_step>
    
  10. 디렉터리가 없으면 라는 bin디렉터리를 만듭니다.

    mkdir bin
    
  11. terraform 파일을 디렉터리로 bin 이동합니다.

    mv terraform bin/    
    
  12. Cloud Shell을 닫고 다시 시작합니다.

  13. 다운로드한 Terraform 버전이 경로의 첫 번째 버전인지 확인합니다.

    terraform version
    

4. 기본 Azure 구독 확인

Microsoft 계정으로 Azure Portal에 로그인하면 해당 계정에 대한 기본 Azure 구독이 사용됩니다.

Terraform은 기본 Azure 구독의 정보를 사용하여 자동으로 인증합니다.

az account show를 실행하여 현재 Microsoft 계정 및 Azure 구독을 확인합니다.

az account show

Terraform을 통해 변경한 내용은 표시된 Azure 구독에 있습니다. 원하는 경우 이 문서의 나머지 부분을 건너뜁니다.

5. Azure에 Terraform 인증

Terraform 및 Azure 인증 시나리오

Terraform은 Azure CLI를 통한 Azure 인증만 지원합니다. Azure PowerShell을 사용한 인증은 지원되지 않습니다. 따라서 Terraform 작업을 수행할 때 Azure PowerShell 모듈을 사용할 수 있지만 먼저 Azure CLI를 사용하여 Azure에 인증해야 합니다.

이 문서에서는 다음 시나리오에 대해 Azure에 Terraform을 인증하는 방법을 설명합니다. Azure에 Terraform을 인증하는 옵션에 대한 자세한 내용은 Azure CLI를 사용하여 인증을 참조하세요.

Microsoft 계정을 통해 Azure에 인증

Microsoft 계정은 Azure와 같은 Microsoft 서비스에 로그인하는 데 사용되는 사용자 이름(이메일 및 해당 자격 증명과 연결)입니다. Microsoft 계정은 하나 이상의 Azure 구독과 연결할 수 있으며 해당 구독 중 하나가 기본값입니다.

다음 단계에서는 방법을 보여줍니다.

  • Microsoft 계정을 사용하여 대화형으로 Azure에 로그인
  • 계정과 연결된 Azure 구독 나열(기본값 포함)
  • 현재 구독을 설정합니다.
  1. Azure CLI에 대한 액세스 권한이 있는 명령줄을 엽니다.

  2. 매개 변수 없이 az login을 실행하고 지침에 따라 Azure에 로그인합니다.

    az login
    

    주요 정보:

    • 로그인에 성공하면 az login은 기본 구독을 포함하여 로그인 Microsoft 계정에 연결된 Azure 구독 목록을 표시합니다.
  3. 현재 Azure 구독을 확인하려면 az account show를 실행 합니다.

    az account show
    
  4. 특정 Microsoft 계정에 대한 모든 Azure 구독 이름 및 ID를 보려면 az account list를 실행합니다.

    az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
    

    주요 정보:

    • <microsoft_account_email> 자리 표시자를 나열하려는 Azure 구독의 Microsoft 계정 전자 메일 주소로 바꿉니다.
    • hotmail 또는 outlook과 같은 라이브 계정을 사용하면 정규화된 이메일 주소를 지정해야 할 수 있습니다. 예를 들어 이메일 주소가 admin@hotmail.com인 경우 자리 표시자를 live.com#admin@hotmail.com으로 바꾸어야 할 수 있습니다.
  5. 특정 Azure 구독을 사용하려면 az account set를 실행 합니다.

    az account set --subscription "<subscription_id_or_subscription_name>"
    

    주요 정보:

    • <subscription_id_or_subscription_name> 자리 표시자를 사용하려는 구독의 ID 또는 이름으로 바꿉니다.
    • 호출 az account set 은 지정된 Azure 구독으로 전환한 결과를 표시하지 않습니다. 그러나 현재 Azure 구독이 변경되었는지 확인하는 데 사용할 az account show 수 있습니다.
    • 이전 단계에서 az account list 명령을 실행하면 기본 Azure 구독이 az account set으로 지정한 구독으로 변경된 것을 알 수 있습니다.

서비스 주체 만들기

Terraform과 같은 Azure 서비스를 배포하거나 사용하는 자동화된 도구에는 항상 제한된 권한이 있어야 합니다. 애플리케이션이 완전한 권한이 있는 사용자로 로그인하는 대신 Azure는 서비스 주체를 제공합니다.

가장 일반적인 패턴은 Azure에 대화형으로 로그인하고, 서비스 주체를 만들고, 서비스 주체를 테스트한 다음, 향후 인증을 위해 해당 서비스 주체를 사용하는 것입니다(대화형 또는 스크립트에서).

  1. 서비스 주체를 만들려면 Azure에 로그인합니다. Microsoft 계정을 통해 Azure에 인증한 후 여기로 돌아갑니다.

  2. Git Bash에서 서비스 주체를 만드는 경우 환경 변수를 MSYS_NO_PATHCONV 설정합니다. (Cloud Shell을 사용하는 경우에는 이 단계가 필요하지 않습니다.)

    export MSYS_NO_PATHCONV=1    
    

    주요 정보:

    • 환경 변수를 MSYS_NO_PATHCONV 전역적으로(모든 터미널 세션에 대해) 또는 로컬로 설정할 수 있습니다(현재 세션에만 해당). 서비스 주체를 만드는 것은 자주 있는 일이 아니기 때문에 샘플은 현재 세션의 값을 설정합니다. 이 환경 변수를 전역적으로 설정하려면 파일에 설정을 추가합니다 ~/.bashrc .
  3. 서비스 주체를 만들려면 az ad sp create-for-rbac를 실행합니다.

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    주요 정보:

    • 사용자 환경의 <service-principal-name> 사용자 지정 이름으로 바꾸거나 매개 변수를 완전히 생략할 수 있습니다. 매개 변수를 생략하면 현재 날짜 및 시간을 기반으로 서비스 사용자 이름이 생성됩니다.
    • 성공적으로 완료되면 az ad sp create-for-rbac에서 여러 값을 표시합니다. appId, passwordtenant 값은 다음 단계에서 사용됩니다.
    • 분실한 암호는 복구할 수 없습니다. 따라서 암호를 안전한 장소에 저장해야 합니다. 암호를 잊어버린 경우 서비스 주체 자격 증명을 다시 설정할 수 있습니다.
    • 이 문서에서는 기여자 역할이 있는 서비스 주체를 사용하고 있습니다. RBAC(역할 기반 액세스 제어) 역할에 대한 자세한 내용은 RBAC: 기본 제공 역할을 참조하세요.
    • 서비스 주체를 만드는 출력에는 중요한 자격 증명이 포함됩니다. 이러한 자격 증명을 코드에 포함하거나 소스 제어에 자격 증명을 검사 않습니다.
    • Azure CLI를 사용하여 서비스 주체를 만들 때 옵션에 대한 자세한 내용은 Azure CLI로 Azure 서비스 주체 만들기 문서를 참조하세요.

환경 변수에서 서비스 주체 자격 증명 지정

서비스 주체를 만든 후에는 환경 변수를 통해 Terraform에 대한 자격 증명을 지정할 수 있습니다.

  1. ~/.bashrc 다음 환경 변수를 추가하여 파일을 편집합니다.

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. ~/.bashrc 스크립트를 실행하려면 source ~/.bashrc(또는 이에 상응하는 약어 . ~/.bashrc)를 실행합니다. 스크립트가 자동으로 실행되도록 Cloud Shell을 종료하고 다시 열 수도 있습니다.

    . ~/.bashrc
    
  3. 환경 변수가 설정되면 다음과 같이 해당 값을 확인할 수 있습니다.

    printenv | grep ^ARM*
    

주요 정보:

  • 환경 변수와 마찬가지로 Terraform 스크립트 내에서 Azure 구독 값에 액세스하려면 다음 구문을 ${env.<environment_variable>}사용합니다. 예를 들어 값에 액세스하려면 . ARM_SUBSCRIPTION_ID 를 지정합니다 ${env.ARM_SUBSCRIPTION_ID}.
  • Terraform 실행 계획을 만들고 적용하면 서비스 주체와 연결된 Azure 구독이 변경됩니다. 한 Azure 구독에 로그인하고 환경 변수가 두 번째 Azure 구독을 가리키는 경우 이 사실은 혼동될 수 있습니다. 설명을 위해 다음 예제를 살펴보겠습니다. SubA 및 SubB라는 두 개의 Azure 구독이 있다고 가정해 보겠습니다. 환경 변수가 SubB를 가리키는 동안 현재 Azure 구독이 SubA(결정 az account show됨)인 경우 Terraform에서 변경한 내용은 SubB에 있습니다. 따라서 변경 내용을 보려면 Azure CLI 명령 또는 Azure PowerShell 명령을 실행하려면 SubB 구독에 로그인해야 합니다.

Terraform 공급자 블록에서 서비스 주체 자격 증명 지정

Azure 공급자 블록은 Azure 구독의 인증 정보를 지정할 수 있는 구문을 정의합니다.

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

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

주의

Terraform 구성 파일에서 Azure 구독 자격 증명을 지정하는 기능은 특히 테스트할 때 편리할 수 있습니다. 그러나 신뢰할 수 없는 사용자가 볼 수 있는 일반 텍스트 파일에는 자격 증명을 저장하지 않는 것이 좋습니다.

Azure의 Terraform 문제 해결

Azure에서 Terraform을 사용할 때 일반적인 문제 해결

다음 단계