모듈을 사용하여 관련 리소스 그룹화

완료됨

최근 일부 제품 출시에 Bicep 템플릿을 사용하기 시작했는데 결과는 성공적이었습니다. 템플릿 파일에서 리소스를 선언했으므로 Azure Portal에서 수동으로 리소스를 구성하지 않고도 새 장난감 출시를 위한 리소스를 빠르게 배포할 수 있습니다.

IT 관리자는 Bicep 코드가 점점 더 복잡해지고 정의되는 리소스 수가 늘어나는 것을 보고 코드를 보다 모듈화할 수 있는지 물었습니다. 배포의 여러 부분에 대해 모듈이라는 개별 Bicep 파일을 만들 수 있습니다. 주 Bicep 템플릿이 이러한 모듈을 참조할 수 있습니다. 내부적으로 모듈은 배포를 위해 단일 JSON 템플릿으로 트랜스파일됩니다.

모듈은 Bicep 코드의 재사용을 높이는 방법이기도 합니다. 단일 Bicep 모듈을 많은 다른 Bicep 템플릿이 사용할 수 있습니다.

또한 Bicep 모듈과 템플릿에서 출력을 내보내야 하는 경우도 많습니다. 출력은 Bicep 코드에서 배포를 시작한 사용자 또는 도구로 데이터를 반환하는 한 방법입니다. 먼저 출력을 살펴보겠습니다.

참고

이 단원의 명령은 개념을 설명하기 위해 표시된 것입니다. 명령을 아직 실행하지 마세요. 여기에서 학습하는 내용을 곧 연습할 예정입니다.

Outputs

사람이 Bicep 템플릿을 수동으로 배포할 수도 있고, 일종의 자동화된 릴리스 프로세스를 통해 배포할 수도 있습니다. 어떤 경우든 템플릿에는 템플릿 배포를 실행하는 사용자 또는 도구로 반환해야 하는 데이터가 포함되는 것이 일반적입니다.

템플릿 배포에서 정보를 가져와야 하는 몇 가지 예제 시나리오는 다음과 같습니다.

  • 가상 머신을 배포하는 Bicep 템플릿을 만들고 컴퓨터에 SSH를 사용할 수 있도록 공용 IP 주소를 가져와야 합니다.
  • 환경 이름 및 애플리케이션 이름과 같은 매개 변수 집합을 허용하는 Bicep 템플릿을 만듭니다. 템플릿은 식을 사용하여 배포하는 Azure App Service 앱의 이름을 지정합니다. 배포 파이프라인 내에서 애플리케이션 이진 파일을 게시하는 데 사용할 수 있도록 템플릿이 배포한 앱 이름을 출력해야 합니다.

이러한 시나리오에서 출력을 사용할 수 있습니다. Bicep 템플릿에서 출력을 정의하려면 다음과 같이 output 키워드를 사용합니다.

output appServiceAppName string = appServiceAppName

출력 정의에는 몇 가지 주요 부분이 포함됩니다.

  • output 키워드는 Bicep에게 출력을 정의한다는 것을 알려줍니다.
  • appServiceAppName은 출력 이름입니다. 출력 값에는 템플릿을 성공적으로 배포한 사용자가 필요한 값에 액세스할 수 있도록 지정한 이름이 포함됩니다.
  • string은 출력 형식입니다. Bicep 출력은 매개 변수와 동일한 형식을 지원합니다.
  • 각 출력에 대해 값을 지정해야 합니다. 매개 변수와 달리 출력에는 항상 값이 있어야 합니다. 출력 값은 식, 매개 변수 또는 변수에 대한 참조 또는 파일 내에 배포되는 리소스의 속성일 수 있습니다.

출력은 변수 및 매개 변수와 동일한 이름을 사용할 수 있습니다. 이 규칙은 템플릿의 리소스에서 사용할 변수 내에 복잡한 식을 구성하고 변수 값을 출력으로 노출해야 하는 경우에 유용할 수 있습니다.

다음은 출력의 또 다른 예입니다. 이 출력의 값은 공용 IP 주소 리소스의 FQDN(정규화된 도메인 이름)으로 설정됩니다.

output ipFqdn string = publicIPAddress.properties.dnsSettings.fqdn

리소스 동작 방식에 대한 가정을 하는 대신 리소스 속성을 출력으로 사용합니다. 예를 들어, App Service 앱의 URL에 대한 출력이 필요한 경우 URL에 대한 문자열을 직접 만드는 대신 앱의 defaultHostName 속성을 사용합니다. 경우에 따라 이러한 가정이 다른 환경에서는 유효하지 않거나 리소스의 작동 방식이 변경되기 때문에 리소스가 자체 속성을 알려주는 것이 더 안전합니다.

주의

연결 문자열 또는 키와 같은 비밀 값에 대한 출력은 만들지 마세요. 리소스 그룹에 대한 액세스 권한이 있는 사용자는 템플릿에서 출력을 읽을 수 있습니다. 비밀 리소스 속성에 액세스하는 데 사용할 수 있는 다른 방법이 있습니다. 이에 대해서는 이후 모듈에서 다룹니다.

모듈 정의

Bicep 모듈을 사용하면 템플릿으로 구성할 수 있는 더 작은 단위를 만들어 Bicep 코드를 구성하고 재사용할 수 있습니다. 모든 Bicep 템플릿은 다른 템플릿에서 모듈로 사용될 수 있습니다. 이 학습 모듈에서는 Bicep 템플릿을 만들었습니다. 즉 Bicep 모듈로 사용할 수 있는 파일을 이미 만든 것입니다.

솔루션 A에 애플리케이션, 데이터베이스 및 네트워킹 리소스를 배포하는 Bicep 템플릿이 있다고 가정하겠습니다. 이 템플릿을 각각 고유한 리소스 집합에 초점을 맞춘 세 모듈로 분할할 수 있습니다. 보너스로 이제 다른 솔루션을 위해 다른 템플릿의 모듈을 재사용할 수도 있습니다. 따라서 솔루션 A와 네트워킹 요구 사항이 유사한 솔루션 B용 템플릿을 개발할 때 네트워크 모듈을 재사용할 수 있습니다.

애플리케이션, 데이터베이스, 네트워킹의 세 가지 모듈을 참조하는 솔루션 A의 템플릿을 보여 주는 다이어그램입니다. 네트워킹 모듈이 솔루션 B에 대한 다른 템플릿에서 재사용됩니다.

템플릿에 모듈 파일에 대한 참조를 포함하려면 module 키워드를 사용합니다. 모듈 정의는 리소스 선언과 유사하지만 리소스 종류 및 API 버전을 포함하는 대신 모듈의 파일 이름을 사용합니다.

module myModule 'modules/mymodule.bicep' = {
  name: 'MyModule'
  params: {
    location: location
  }
}

이 모듈 정의의 몇 가지 주요 부분을 자세히 살펴보겠습니다.

  • module 키워드는 Bicep에게 다른 Bicep 파일을 모듈로 사용한다는 것을 알려줍니다.
  • 리소스와 마찬가지로 모듈에는 myModule와 같은 ‘기호 이름’이 필요합니다. 템플릿의 다른 부분에서 모듈의 출력을 참조하는 경우 기호 이름을 사용합니다.
  • modules/mymodule.bicep은 템플릿 파일을 기준으로 한 대상 파일 경로입니다. 모듈 파일은 일반 Bicep 파일일 뿐입니다.
  • 리소스와 마찬가지로 name 속성은 필수입니다. Azure는 템플릿 파일 내의 각 모듈에 대해 별도의 배포를 만들기 때문에 모듈 이름을 사용합니다. 이러한 배포에는 식별하는 데 사용할 수 있는 이름이 있습니다.
  • params 키워드를 사용하여 모듈의 매개 변수를 지정할 수 있습니다. 템플릿 내에서 각 매개 변수의 값을 설정할 때 식, 템플릿 매개 변수, 변수, 템플릿 내에 배포된 리소스의 속성 및 다른 모듈의 출력을 사용할 수 있습니다. Bicep은 리소스 간의 종속성을 자동으로 이해합니다.

모듈 및 출력

템플릿과 마찬가지로 Bicep 모듈은 출력을 정의할 수 있습니다. 템플릿 내에서 모듈을 함께 연결하는 것이 일반적입니다. 이 경우 한 모듈의 출력이 다른 모듈에 대한 매개 변수가 될 수 있습니다. 모듈 및 출력을 함께 사용하여 강력하고 재사용 가능한 Bicep 파일을 만들 수 있습니다.

모듈 디자인

좋은 Bicep 모듈은 다음과 같은 주요 원칙을 따릅니다.

  • 모듈은 용도가 명확해야 합니다. 모듈을 사용하여 솔루션의 특정 부분에 관련된 모든 리소스를 정의할 수 있습니다. 예를 들어 애플리케이션을 모니터링하는 데 사용되는 모든 리소스가 포함된 모듈을 만들 수 있습니다. 모듈을 사용하여 모든 데이터베이스 서버 및 데이터베이스와 같이 함께 포함되는 리소스 집합을 정의할 수도 있습니다.

  • 모든 리소스를 자체 모듈에 배치하지 마세요. 배포하는 모든 리소스마다 별도의 모듈을 만들지 않아야 합니다. 복잡한 속성이 많은 리소스가 있는 경우 해당 리소스를 자체 모듈에 넣는 것이 합리적일 수 있지만 일반적으로 모듈이 여러 리소스를 결합하는 것이 더 좋습니다.

  • 모듈에는 의미가 명확한 매개 변수 및 출력이 있어야 합니다. 모듈의 용도를 고려합니다. 모듈이 매개 변수 값을 조작해야 하는지 여부 또는 부모 템플릿이 처리한 후 단일 값을 모듈에 전달해야 하는지 여부를 고려합니다. 마찬가지로 모듈이 반환해야 하는 출력을 생각해 보고 모듈을 사용할 템플릿에 유용한지 확인합니다.

  • 모듈은 가능한 한 자체 포함되어야 합니다. 모듈이 변수를 사용하여 모듈의 일부를 정의해야 하는 경우 일반적으로 부모 템플릿이 아니라 모듈 파일에 변수를 포함해야 합니다.

  • 모듈은 비밀을 출력해서는 안 됩니다. 템플릿과 마찬가지로 연결 문자열 또는 키와 같은 비밀 값에 대한 모듈 출력을 만들지 마세요.