Bicep 매개 변수를 사용하여 환경 간의 차이점 처리

완료됨

Bicep 매개 변수에 대한 정보를 이미 배웠습니다. Bicep 파일 배포 간에 변경될 수 있는 값을 지정하는 데 도움이 됩니다.

매개 변수는 일반적으로 환경 간의 차이점을 지원하는 데 사용됩니다. 예를 들어 비프로덕션 환경에서 저렴한 Azure 리소스 SKU를 배포하려는 경우가 있습니다. 프로덕션 환경에서는 더 나은 실적을 가진 SKU를 배포하려고 합니다. 각 환경에서 리소스에 대해 다른 이름을 사용하는 것이 좋습니다.

Bicep 파일을 배포하는 경우 각 매개 변수에 대한 값을 제공합니다. 파이프라인에서 각 매개 변수의 값을 지정 하는 방법 및 각 환경에 대해 별도의 값을 지정하는 방법에 대한 몇 가지 옵션이 있습니다. 본 단원에서는 배포 파이프라인에서 Bicep 매개 변수 값을 지정하는 방법에 대해 알아봅니다.

매개 변수 파일

매개 변수 파일은 각 환경에 사용할 매개 변수 값을 나열하는 JSON 형식의 파일입니다. 배포를 제출할 때 Azure Resource Manager에 매개 변수 파일을 제출합니다.

다음은 매개 변수 파일의 예시입니다.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "reviewApiUrl": {
      "value": "https://sandbox.contoso.com/reviews"
    }
  }
}

Bicep 파일을 함께 Git 리포지토리에 매개 변수 파일을 커밋할 수 있습니다. 그런 다음 배포를 실행하는 파이프라인 템플릿에서 매개 변수 파일을 참조할 수 있습니다.

매개 변수 파일에 대해 일관된 환경 이름 지정 전략을 설정하는 것이 좋습니다. 예를 들어 매개 변수 파일의 이름을 매개 변수의 이름을 ‘parameters.환경_이름.json’(예: parameters.Production.json)으로 지정할 수 있습니다. 그런 다음 파이프라인 템플릿 매개 변수를 사용하여 올바른 매개 변수 파일을 자동으로 선택할 수 있습니다.

parameters: 
- name: environmentType
  type: string
- name: serviceConnectionName
  type: string
- name: resourceGroupName
  type: string

- stage: Deploy
  jobs:
  - deployment: DeployWebsite
    displayName: Deploy Website
    environment: Website
    strategy:
      runOnce:
        deploy:
          steps:
            - checkout: self
            - task: AzureCLI@2
              name: DeployBicepFile
              displayName: Deploy Bicep file
              inputs:
                azureSubscription: ${{parameters.serviceConnectionName}}
                scriptType: 'bash'
                scriptLocation: 'inlineScript'
                inlineScript: |
                  az deployment group create \
                    --resource-group ${{parameters.resourceGroupName}} \
                    --template-file deploy/main.bicep \
                    --parameters deploy/azuredeploy.parameters.${{parameters.environmentType}}.json

매개 변수 파일을 사용하는 경우 파이프라인 YAML 파일은 배포 스테이지에 개별적으로 전달해야 하는 매개 변수 목록을 포함할 필요가 없습니다. 이는 매개 변수 수가 많은 경우에 유용합니다.

매개 변수 파일은 단일 JSON 파일에서 매개 변수 값을 함께 유지합니다. 매개 변수 파일은 Git 리포지토리의 일부 이기도 하므로 다른 모든 코드와 동일한 방식으로 버전 관리를 수행할 수 있습니다.

중요

보안 값에는 매개 변수 파일을 사용할 수 없습니다. 매개 변수 파일의 암호 값을 보호할 수 있는 방법은 없으며 Git 리포지토리에 암호를 커밋하지 말아야 합니다.

파이프라인 변수

Azure Pipelines를 사용하면 환경 간에 다를 수 있는 값에 유용한 ‘파이프라인 변수’를 저장할 수 있습니다. 한 번만 정의한 다음 파이프라인 전체에서 재사용하려는 값에도 유용합니다. Azure Pipelines는 변수를 정의하는 여러 가지 방법을 지원합니다.

YAML 파일에 정의된 변수

변수를 정의하고 YAML 파일 내에서 해당 값을 설정할 수 있습니다. 이는 동일한 값을 여러 번 재사용해야 하는 경우에 유용합니다. 그러나 Bicep 매개 변수 파일과 마찬가지로 YAML 파일은 암호에 적합하지 않습니다.

웹 인터페이스에 정의된 변수

Azure DevOps 웹 인터페이스를 사용하여 변수를 정의할 수 있습니다. 변수 값은 언제든지 변경할 수 있으며, 파이프라인은 다음에 실행될 때 업데이트된 값을 읽습니다.

웹 인터페이스를 통해 정의된 변수는 암호로 표시될 수 있으며, 이는 Azure Pipelines에 파이프라인 로그에서 변수의 값을 숨길 것을 지시합니다. 즉, Bicep 파일이 @secure() 데코레이터를 통해 매개 변수로 허용하는 값을 저장할 수 있습니다.

경고

기본적으로 Azure Pipelines는 파이프라인 로그에서 비밀 변수 값을 난독 처리하지만, 사용자도 모범 사례를 따라야 합니다. 파이프라인 단계는 비밀을 포함하여 모든 변수 값에 액세스할 수 있습니다. 비밀 변수를 안전하게 처리하지 않는 단계가 파이프라인에 포함된 경우 비밀 변수가 파이프라인 로그에 표시될 가능성이 있습니다.

변수 그룹

변수 집합에 해당하는 ‘변수 그룹’을 정의할 수도 있습니다. 변수와 마찬가지로 Azure DevOps 웹 인터페이스를 사용하여 이러한 그룹을 정의합니다. 변수 그룹을 사용하여 암호를 안전하게 저장할 수도 있습니다. 변수 그룹은 동일한 Azure DevOps 프로젝트의 여러 파이프라인에서도 재사용할 수 있습니다.

다른 변수와 달리 다음과 같이 group 섹션에서 variables 키워드를 사용하여 변수 그룹을 파이프라인으로 명시적으로 가져와야 합니다.

variables:
- group: MyVariableGroup

파이프라인 템플릿으로 작업하는 경우 템플릿 매개 변수를 사용하여 쉽게 로드할 수 있도록 변수 그룹의 이름을 지정할 수 있습니다. 예를 들어 파이프라인이 두 환경에 배포되 고 각 환경에 대한 변수 집합을 정의해야 한다고 가정해 보겠습니다. 다음과 같이 포함된 환경 이름으로 변수 그룹의 이름을 지정할 수 있습니다.

환경 이름 변수 그룹 이름
테스트 ToyWebsiteTest
프로덕션 ToyWebsiteProduction

이러한 각 변수 그룹에서 이름은 같지만 각 환경에 대한 값은 다른 변수를 추가합니다.

파이프라인 템플릿 파일은 {{ parameters.PARAMETER_NAME }} 매크로를 사용하여 가져올 올바른 변수 그룹을 선택합니다.

parameters: 
- name: environmentType
  type: string
  default: 'Test'

variables: 
- group: ToyWebsite${{ parameters.environmentType }}

Key Vault 변수 그룹

변수 그룹을 Azure Key Vault에 연결할 수 있습니다. 키 자격 증명 모음의 암호는 변수 그룹에서 변수로 사용할 수 있습니다. 암호는 일반적인 변수인 것처럼 파이프라인에서 사용할 수 있습니다.

Key Vault를 사용하면 암호를 보다 안전하게 관리할 수 있습니다. 또한 이러한 값을 보안 팀에서 관리하도록 지원하고 파이프라인에 대한 액세스를 사용하는 암호와 분리할 수 있습니다.

변수 그룹을 키 자격 증명 모음에 연결하려면 추가적인 단계가 필요합니다. 이러한 단계에는 키 자격 증명 모음에서 암호를 읽을 수 있는 권한이 있는 서비스 연결 만들기가 포함됩니다. 요약 단원에서는 Key Vault 변수 그룹을 구성하는 방법에 대한 자세한 내용의 링크를 제공합니다.

파이프라인에서 변수 사용

변수를 정의하는 방법에 관계없이 $(VariableName) 구문을 사용하여 파이프라인에서 해당 값에 액세스합니다. 예를 들어 Bicep 배포를 실행할 때 변수를 사용하여 매개 변수의 값을 지정할 수 있습니다.

- stage: Deploy
  jobs:
  - deployment: DeployWebsite
    displayName: Deploy Website
    environment: Website
    strategy:
      runOnce:
        deploy:
          steps:
            - checkout: self
            - task: AzureCLI@2
              name: DeployBicepFile
              displayName: Deploy Bicep file
              inputs:
                azureSubscription: MyServiceConnection
                scriptType: 'bash'
                scriptLocation: 'inlineScript'
                inlineScript: |
                  az deployment group create \
                    --resource-group $(ResourceGroupName) \
                    --template-file deploy/main.bicep \
                    --parameters environmentType=$(EnvironmentType)

가장 좋은 방법은 무엇인가요?

Bicep 파일이 배포에 필요로 하는 매개 변수를 처리하는 여러 가지 방법을 알아보았습니다. 어떤 방식을 사용할 지 이해하는 것이 좋습니다.

불필요한 매개 변수 방지

매개 변수를 통해 Bicep 파일을 재사용할 수 있지만 너무 많은 매개 변수를 쉽게 정의할 수 있습니다. Bicep 파일을 배포하는 경우 모든 매개 변수에 값을 제공해야 합니다. 여러 환경에 대한 복잡한 배포에서는 많은 개별 매개 변수 값을 관리하기가 어렵습니다.

가능한 경우 매개 변수를 선택 사항으로 만들고 대부분의 환경에 적용되는 기본값을 사용하는 것이 좋습니다. 그러면 파이프라인이 매개 변수에 대한 값을 전달할 필요가 없도록 할 수 있습니다.

또한 리소스가 다른 리소스에 연결해야 하는 경우 매개 변수가 Bicep에서 사용되는 경우가 많습니다. 예를 들어 스토리지 계정에 연결해야 하는 웹 사이트가 있는 경우 스토리지 계정 이름과 액세스 키를 제공해야 합니다. 키는 보안 값입니다. 그러나 이러한 리소스 조합을 배포할 때는 다음과 같은 다른 방식을 고려해 보십시오.

  • 웹 사이트의 관리 ID를 사용하여 스토리지 계정에 액세스합니다. 관리 ID를 만드는 경우 Azure는 자격 증명을 자동으로 생성하고 관리합니다. 이 방법은 연결 설정을 간소화합니다. 또한 암호를 전혀 처리할 필요가 없으므로 가장 안전한 옵션입니다.
  • 스토리지 계정과 웹 사이트를 동일한 Bicep 템플릿에 함께 배포합니다. Bicep 모듈을 사용하여 웹 사이트와 스토리지 리소스를 함께 유지합니다. 그런 다음 매개 변수로 전달하는 대신 Bicep 코드 내에서 스토리지 계정 이름 및 키에 대한 값을 자동으로 조회할 수 있습니다.
  • 스토리지 계정의 세부 정보를 키 자격 증명 모음에 암호로 추가합니다. 그러면 웹 사이트 코드는 자격 증명 모음에서 직접 액세스 키를 로드합니다. 이러한 방식을 통해 파이프라인에서 키를 관리할 필요가 없습니다.

적은 수의 매개 변수에 변수 그룹 사용

Bicep 파일에 대한 매개 변수 수가 적은 경우 변수 그룹을 사용하는 것이 좋습니다. 암호 값과 암호가 아닌 값을 모두 변수 그룹에 저장할 수 있습니다.

많은 매개 변수에 매개 변수 파일 사용

Bicep 파일에 대한 매개 변수가 많은 경우 매개 변수 파일을 사용하여 각 환경에 대해 비보안 값을 함께 유지하는 것이 좋습니다. 그러면 값을 변경해야 할 때마다 매개 변수 파일을 업데이트하고 변경 내용을 커밋할 수 있습니다.

이 방식은 모든 매개 변수에 대한 값을 명시적으로 설정할 필요가 없으므로 파이프라인 단계를 더 간단하게 유지합니다.

안전하게 암호 저장

암호를 저장하고 처리하는 데 적절한 프로세스를 사용합니다. 관리할 암호 수가 적은 경우 Azure Pipelines 변수 및 변수 그룹이 원활하게 작동하는 경우가 많습니다. 하지만 많은 수의 암호, 여러 환경 또는 액세스 제어 제한과 같은 더 복잡한 요구 사항이 있을 수 있습니다. 이러한 경우 각 환경의 암호를 별도의 키 자격 증명 모음에 저장하는 것이 좋습니다. 변수 그룹을 사용하여 자격 증명 모음을 파이프라인에 연결합니다.

보안 매개 변수의 경우 각 매개 변수를 배포 단계에 명시적으로 전달해야 합니다.

방식 조합

매개 변수를 처리하는 여러 방식을 조합하는 것이 일반적입니다. 예를 들어 대다수 매개 변수 값을 매개 변수 파일에 저장한 다음, 다양한 그룹을 사용하여 보안 값을 설정할 수 있습니다. 다음 예제에서는 이러한 조합을 보여줍니다.

variables:
- group: MyVariableGroup # This group imports a parameter named MySecureParameter.

stages:

- stage: Deploy
  jobs:
  - deployment: DeployWebsite
    displayName: Deploy Website
    environment: Website
    strategy:
      runOnce:
        deploy:
          steps:
            - checkout: self
            - task: AzureCLI@2
              name: DeployBicepFile
              displayName: Deploy Bicep file
              inputs:
                azureSubscription: MyServiceConnection
                scriptType: 'bash'
                scriptLocation: 'inlineScript'
                inlineScript: |
                  az deployment group create \
                    --resource-group ${{parameters.resourceGroupName}} \
                    --template-file deploy/main.bicep \
                    --parameters deploy/azuredeploy.parameters.${{parameters.environmentName}}.json \
                                 mySecureParameter=$(MySecureParameter)

서비스 연결 이름을 지정하는 방법에 대한 특별한 규칙이 있습니다. 이러한 규칙은 여러 환경에 배포되는 파이프라인에서 이름을 사용하는 방법에 영향을 줄 수 있습니다. 예를 들어 변수 그룹 내에 정의된 변수를 사용하여 서비스 연결 이름을 지정할 수 없습니다. 파이프라인 템플릿 매개 변수를 사용하여 사용할 서비스 연결의 이름을 지정할 수 있습니다.