Terraform Quick Start 리포지토리 빌드 1부 - Azure 원격 상태 부트스트래핑

15438 단어 devopsterraformazure
우리는 종종 들어와서 고객을 위해 클라우드 서비스를 배포하고 나가게 됩니다. 일부 고객은 팀과 프로세스를 구축했고 다른 고객은 미개척 분야를 확보하여 올바른 일을 수행하기 위해 우리에게 의존합니다. 투자 수준에 관계없이 고객은 우리가 모범 사례를 고수하고 고객을 위해 약간의 클라우드 인프라를 생성할 뿐만 아니라 올바른 작업을 수행하고 인프라를 최대한 체계화하기를 기대합니다. 기본적으로 이를 위해 Terraform을 사용합니다.

보관 상태



인프라를 관리하고 변경 사항을 감지할 수 있으려면 Terraform이 현재 업무state를 저장할 장소가 필요합니다. 가장 쉬운 솔루션은 상태 파일locally을 저장하는 것이지만 이는 CI/CD 파이프라인에 대한 옵션이 아닙니다. 운 좋게도 선택할 수 있는 bunch of backends이 있습니다.

그러나 이것은 상태 파일을 보관할 수 있는 스토리지 백엔드에 액세스하지 않고는 Terraform을 사용하여 스토리지 백엔드를 배포할 수 없는 닭과 달걀 상황으로 이어집니다.

이두근



지금까지 우리는 주로 Azure를 다루었으므로 필요한 리소스를 생성하기 위해 빠른Bicep 스니펫을 준비하는 것이 합리적이었습니다. 명심해야 할 한 가지는 Bicep이 기본적으로 리소스를 resourceGroup 범위에 배포한다는 사실입니다. 이는 우리가 원하는 것과 정확히 일치하지 않는 리소스 그룹을 이미 생성했음을 의미합니다. 이를 전환하려면 subscription 수준(어쨌든 우리에게 일반적으로 제공되는 것임)에서 시작하고 리소스 그룹을 만들고 그 다음에 원하는 다른 것이 있어야 합니다. 권장되는 방법은 RG에 대한 기본 템플릿을 선언하고 다른 모든 좋은 항목으로 모듈을 참조하는 것입니다.

targetScope = 'subscription' // switching scopes here


// declaring some parameters so we can easier manage the pipeline later
@maxLength(13)
@minLength(2)
param prefix string
param tfstate_rg_name string = '${prefix}-terraformstate-rg'
@allowed([
  'australiaeast'
])
param location string

// creating resource group
resource rg 'Microsoft.Resources/resourceGroups@2021-01-01' = {
  name: tfstate_rg_name
  location: location
}

// Deploying storage account via module reference
module stg './tfstate-storage.bicep' = {
  name: 'storageDeployment'
  scope: resourceGroup(rg.name)
  params: {
    storageAccountName: '${prefix}statetf${take(uniqueString(prefix),4)}'
    location: location
  }
}


여기서 모듈 코드가 중요합니다.

param storageAccountName string
param location string
param containerName string = 'tfstate' 

output storageAccountName string = storageAccountName
output containerName string = containerName

resource storageAccount_resource 'Microsoft.Storage/storageAccounts@2021-06-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    allowBlobPublicAccess: true
    networkAcls: {
      bypass: 'AzureServices'
      virtualNetworkRules: []
      ipRules: []
      defaultAction: 'Allow'
    }
    supportsHttpsTrafficOnly: true
    encryption: {
      services: {
        blob: {
          keyType: 'Account'
          enabled: true
        }
      }
      keySource: 'Microsoft.Storage'
    }
    accessTier: 'Hot'
  }
}

resource blobService_resource 'Microsoft.Storage/storageAccounts/blobServices@2021-06-01' = {
  parent: storageAccount_resource
  name: 'default'
  properties: {
    cors: {
      corsRules: []
    }
    deleteRetentionPolicy: {
      enabled: false
    }
  }
}

resource storageContainer_resource 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-06-01' = {
  parent: blobService_resource
  name: containerName
  properties: {
    immutableStorageWithVersioning: {
      enabled: false
    }
    defaultEncryptionScope: '$account-encryption-key'
    denyEncryptionScopeOverride: false
    publicAccess: 'None'
  }
}



모든 자산을 리포지토리에 집어넣고 거기에서 구동하기를 원한다고 가정하면 간단한 ADO 배포 파이프라인도 작성하는 것이 좋습니다. 이전에 we’d have to opt for AzureCLI 작업을 수행하고 다음과 같이 합니다.

- task: AzureCLI@2
  inputs:
    azureSubscription: $(azureServiceConnection)
    scriptType: bash
    scriptLocation: inlineScript
    inlineScript: |
      # steps to create RG
      az deployment group create --resource-group $(resourceGroupName) --template-file bicep/main.bicep


운 좋게도 작업이 완료되었으며 agent version 3.199 , AzureResourceManagerTemplateDeployment 로 시작하여 기본적으로 Bicep 배포를 지원합니다! 불행하게도 ADO 호스트 에이전트를 테스트할 당시에는 여전히 버전 3.198이었기 때문에 수동으로 Bicep을 ARM으로 속이고 컴파일해야 했습니다. 그러나 최종 파이프라인은 다음과 같습니다.

trigger: none # intended to run manually

name: Deploy TF state backend via Bicep

pool:
  vmImage: 'ubuntu-latest'

variables:
  - group: "bootstrap-state-variable-grp" # define variable groups to point to correct subscription

steps:
- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Subscription'
    azureResourceManagerConnection: $(azureServiceConnection)
    subscriptionId: $(targetSubscriptionId)
    location: $(location)
    templateLocation: 'Linked Artifact'
    csmFile: '$(System.DefaultWorkingDirectory)/bicep/main.bicep' # on dev machine, compile into ARM (az bicep build --file .\bicep\main.bicep) and use that instead until agent gets update to 3.199.x
    deploymentMode: 'Incremental'
    deploymentOutputs: 'storageAccountParameters'
    overrideParameters: '-prefix $(prefix) -location $(location)'


ADO를 통해 실행하면 새로운 리소스 그룹 내에서 사용 가능한 저장소 계정이 생성됩니다.




여기에서 어디로



기반을 처리한 후에는 이 단계의 출력을 캡처하고(주로 저장소 계정 이름에 약간의 임의성이 있으므로 관심이 있음) Terraform 백엔드 공급자에게 제공할 수 있어야 합니다. 이 시리즈의 다음 부분에서 다룰 것입니다.

결론



이 공간의 기존 솔루션은 지금까지 작업을 수행하기 위해 PowerShell 또는 az cli에 의존했습니다. 여전히 가능하지만 특히 출력을 쿼리하려는 경우 부피가 커질 수 있습니다. 이제 Bicep 지원이 AzureResourceManagerTemplateDeploymentV3에 직접 도달하므로 이 as a recommended approach을 볼 수 있습니다.

좋은 웹페이지 즐겨찾기