구성 모범 사례

이 문서에서는 Azure Operator Service Manager를 사용하여 네트워크 함수 구성 요구 사항을 가장 잘 관리하기 위한 지침을 제공합니다. 여기에는 최적의 CGS(구성 그룹 스키마), CGV(구성 그룹 값) 및 NF(networkFunctions) 리소스 템플릿 디자인이 포함됩니다. NF를 온보딩하고 배포할 때는 이러한 사례를 염두에 두어야 합니다.

구성 방법

구성 리소스를 디자인할 때 다음 메타 스키마 지침을 고려합니다.

  • 먼저 연산자에 노출할 매개 변수를 선택합니다.
    • 경험상, helm value과 같이 직접 작업을 지원하는 매개변수를 노출하는 것이 좋습니다.
    • 다른 에이전트에서 지원하는 매개 변수, 예를 들어 cloudinit userdata을(를) 숨깁니다.
  • 매개 변수를 사이트별, 인스턴스별 및 보안별 집합으로 정렬합니다.
    • 매개 변수가 집합 간에 겹치지 않도록 합니다.
  • 필수 매개 변수와 선택적 매개 변수를 정의합니다.
    • 선택적 매개 변수의 경우 적절한 기본값을 정의합니다.
  • 비밀 노출을 방지하려면 보안 관련 매개 변수의 적절한 구성을 확인합니다.

One-CGS 접근 방식

원래 권장 사항은 전체 NF에 대해 단일 CGS/CGV 집합만 사용하는 것이었습니다. 이 방법은 사이트별, 인스턴스별 및 보안 관련 매개 변수를 함께 통합했습니다. 서비스에 여러 NF가 있는 드문 경우에만 여러 집합이 사용되었습니다. 많은 파트너가 이 방법을 사용하여 성공적으로 온보딩되었으며 계속 지원됩니다. 그러나 이 방법은 비밀을 모호하게 하지 않습니다. 모든 구성 값은 일반 텍스트로 저장되며 대부분의 Azure 메서드를 통해 표시할 수 있습니다.

삼-씨지에스 접근 방식

이제 다음과 같이 매개 변수를 구성하는 세 개 이상의 CGS/CGV 집합을 사용하는 것이 좋습니다.

  • 사이트별 매개 변수

    • 예를 들어 IP 주소와 고유한 이름이 있습니다.
    • 비밀 없이 CGS/CGV를 사용합니다.
    • 배포 중에 일반 텍스트로 값을 저장합니다.
  • 인스턴스별 매개 변수

    • 예를 들어 시간 제한 및 디버그 수준이 있습니다.
    • 비밀 없이 CGS/CGV를 사용합니다.
    • 배포하는 동안 값을 일반 텍스트로 저장합니다.
  • 보안 관련 매개 변수

    • 암호 및 인증서를 예로 들어 있습니다.
    • 비밀과 함께 CGS/CGV를 사용합니다.
    • 배포 중에 모호하게 하려면 AKV(Azure Key Vault)에 값을 저장합니다.

경고

  • 비밀을 사용하는 경우 RBAC(역할 기반 액세스 제어) 범위에 Microsoft.Resources/deployments/exportTemplate/action대한 액세스를 제한하는 것이 좋습니다.

비밀이 없는 CGS

이 예제에서는 CGS가 abc, xyz, qwe 매개 변수를 노출합니다. 두 매개 변수는 기본값을 가지며, 한 매개 변수는 필수로 표시됩니다.

{ 
  "type": "object", 
  "properties": {
    "abc": { 
      "type": "integer", 
      "default": 30
    }, 
    "xyz": { 
      "type": "integer", 
      "default": 40
    },
    "qwe": {
      "type": "integer"
    }
   }
   "required": "qwe"
}

비밀이 없는 CGV

이 예제에서는 이전 CGS를 충족하기 위해 CGV 배포 중에 운영자가 제공한 CGV 입력을 보여줍니다.

{
"qwe": 20
}

이 예제에서는 CGV 배포가 완료된 후 생성된 렌더링된 CGV 리소스를 보여 줍니다.

{
"abc": 30,
"xyz": 40,
"qwe": 20
}

CGV에 AKV가 없는 비밀이 있다

AKV를 사용하지 않는 경우 CGV 리소스 수명 주기 전반에 걸쳐 비밀 값을 제대로 모호하게 하려면 다음 ARM(Azure Resource Manager) 템플릿 요구 사항을 고려합니다.

  • 모든 비밀을 포함하려면 .를 사용하여 개체 매개 변수 "type": "secureObject"를 정의합니다.
    • 이 구성은 비밀을 템플릿 매개 변수로 표시하지 않습니다.

이 예제에서는 개체 매개 변수 secretCgvContent를 정의하는 방법을 보여줍니다.

"parameters": {
   "secretCgvContent": {
     "type": "SecureObject"
    }
}

메모

  • bicep의 loadJsonContent() 함수를 사용하여 secretCgvContent을 채우지 마세요.
  • 변수 정의에 매개 변수를 SecureObject 포함하지 마세요.
  • CGV 리소스 속성에서 사용 configurationType: 'Secret'"secretConfigurationValue": "[string(parameters('secretCgvContent'))]".
    • 이 구성은 대부분의 Azure 사용자 인터페이스를 통해 비밀 데이터를 표시할 수 없습니다.

이 예제에서는 개체 secretCgvContent 의 모든 비밀을 CGV 리소스에 전달하는 방법을 보여줍니다.

{
  "type": "Microsoft.HybridNetwork/configurationGroupValues",
  "properties": {
    "configurationType": "Secret"
    "secretConfigurationValue": "[string(parameters('secretCgvContent'))]"
  }
}

AKV와 함께 비밀을 가진 CGV

AKV를 사용하는 경우 CGV 리소스 수명 주기 전반에 걸쳐 비밀 값을 제대로 모호하게 하려면 다음 ARM 템플릿 요구 사항을 고려합니다.

  • 각 비밀에 대한 문자열 parameter 과 모든 비밀 값을 수집할 하나의 개체 variable 를 정의합니다.
    • 개체 변수에는 매개 변수 문자열에 대한 참조만 포함됩니다.

이 예제에서는 개체 변수 secretPassword1내에 포함된 매개 변수 secretVal.configurationValue 를 정의하는 방법을 보여줍니다.

"parameters": {
   "secretPassword1": {
     "type": "string"
    }
}
"variables": {
    "configurationValue": {
     "secretVal": {
        "elastic_passwd": "secretPassword1"
      }
    }
}
  • 매개 변수 입력의 경우 일반 텍스트 암호 대신 AKV에 대한 템플릿 참조를 사용합니다.
    • 이 구성은 비밀을 템플릿 변수로 표시하지 않습니다.

이 예제에서는 AKV 비밀 secretPassword1 및 키를 사용하여 비밀을 정의하는 방법을 보여줍니다.

  "secretPassword1": {
      "reference": {
        "keyVault": {
            "id": "/subscriptions/xxx/resourceGroups/yyy/providers/Microsoft.KeyVault/vaults/zz"
        },
        "secretPassword1": "<akv-secret-key>"
      }
}
  • CGV 리소스 속성에서 사용 configurationType: 'Secret'"secretConfigurationValue": "string(secretVal.configurationValue)".
    • 이 구성은 대부분의 Azure 사용자 인터페이스를 통해 비밀 데이터를 표시할 수 없습니다.

이 예제에서는 개체 secretVal.configurationValue 의 모든 비밀을 새 CGV에 전달하는 방법을 보여줍니다.

{
"resources": [ {
  "type": "Microsoft.HybridNetwork/configurationGroupValues",
    "properties": {
      "configurationType": "Secret"
      "secretConfigurationValue": "string(secretVal.configurationValue)"
      }
   }
]

비밀이 있는 networkFunctions

networkFunctions 리소스 수명 주기 전반에 걸쳐 비밀 값을 제대로 모호하게 하려면 다음 ARM 템플릿 요구 사항을 고려합니다.

  • 템플릿에서 "type": "secureObject"secretValues 매개 변수에 config를 사용하십시오
    • 이 구성은 비밀을 템플릿 매개 변수로 표시하지 않습니다.
"parameters": {
    "nfValues": {
     "type": "object"
    },
    "siteSpecificValues": {
     "type": "object"
    },
    "secretValues": {
     "type": "secureObject"
    },
    "config": {
      "type": "secureObject",
      "defaultValue": "[union(parameters('nfValues'), parameters('siteSpecificValues'), parameters('secretValues'))]"
    }
}

메모

  • bicep의 loadJsonContent() 함수를 사용하여 secretValues을 채우지 마세요.
  • 변수 정의에 매개 변수를 SecureObject 포함하지 마세요.
  • 네트워크 기능 리소스 특성에서 configurationType: 'Secret'"secretDeploymentValues": "[string(parameters('config'))]"를 사용하세요.
    • 네트워크 함수가 배포되면 이 구성은 대부분의 Azure 사용자 인터페이스를 통해 비밀 데이터를 표시하지 못하게 합니다.
"resources": [
  {
    "type": "Microsoft.HybridNetwork/networkFunctions",
      "configurationType": "Secret",
      "secretDeploymentValues": "[string(parameters('config'))]",
  }
]

JSON 스키마 개요

JSON 스키마는 애플리케이션에 필요한 JSON 데이터 및 상호 작용하는 방법에 대한 형식을 제공하는 IETF(인터넷 엔지니어링 태스크 포스) 표준입니다. JSON 문서에 이러한 표준을 적용하면 JSON 데이터 간에 일관성 및 데이터 유효성을 적용할 수 있습니다.

JSON 스키마는 어디에 사용합니까?

  • Azure Operator Service Manager는 CGS schemaDefinition 개체의 속성 내에서 ConfigurationGroupSchemaPropertiesFormat JSON 스키마 표기법을 메타 스키마로 사용합니다.
  • Azure Operator Service Manager를 사용하면 운영자가 SNS(사이트 네트워크 서비스) 또는 NF를 인스턴스화하는 동안 데이터(JSON 값)를 제공해야 하는 경우 디자이너와 게시자가 JSON 스키마를 지정할 수 있습니다.
  • Azure Operator Service Manager를 사용하면 메타 스키마 속성이 선택적이거나 필수입니다. 속성이 표시된 required경우 JSON 값에 지정해야 합니다.

지원되는 JSON 키워드는 무엇인가요?

CGS 메타 스키마의 경우 Azure Operator Service Manager는 형식별로 JSON 표준 키워드에 대한 지원을 구현합니다.

  • 개체 형식의 경우 키워드 지원은 필터 정책에 의해 제한됩니다. JSON 스키마 참조의 개체 를 참조하세요.
  • 문자열 형식의 경우 키워드 지원이 제한되거나 필터링되지 않습니다. JSON 스키마 참조의 문자열 을 참조하세요.
  • 숫자 형식의 경우 키워드 지원이 제한되거나 필터링되지 않습니다. JSON 스키마 참조의 숫자 형식 을 참조하세요.

선택적 필드 및 필수 필드

선택적 속성을 생략하는 키워드를 required 포함하여 속성을 선택 사항으로 선언합니다. 키워드를 required 지정하지 않으면 모든 속성이 필요한 것으로 간주됩니다. 선택적 속성 형식을 지원하려면 하나 이상의 필수 속성 형식이 필요합니다.

{
"type": "object",
"properties": {
  "abc": {
    "type": "integer",
     "default": 30
  },
  "xyz": {
    "type": "string",
    "default": "abc123"
  }
 }
"required":  ["abc"]
} 

JSON 스키마의 기본값

선택적 속성의 경우 Azure Operator Service Manager는 기본값을 처리하는 사용자 지정 메서드를 구현합니다. 기본값이 CGS 메타 스키마에 정의되면 Azure Operator Service Manager는 입력 CGV 데이터에 속성이 없거나 정의되지 않은 해당 값을 사용합니다. Azure Operator Service Manager 유효성 검사기 논리는 기본적으로 연산자가 값을 제공하지 않을 때 CGV 값을 기본값으로 수화합니다.

기본값을 정의하는 방법

기본값은 속성 내부 또는 배열의 항목 내에서 지정해야 합니다. 다음 예제에서는 정수 및 문자열 속성 형식의 기본값을 보여 줍니다.

{
"type": "object",
"properties": {
  "abc": {
    "type": "integer",
     "default": 30
  },
  "xyz": {
    "type": "string",
    "default": "abc123"
  }
 }
} 

기본값 정의 규칙

기본값의 유효성을 검사할 때 적용되는 규칙은 다음과 같습니다. 예상 결과를 보장하기 위해 기본값을 사용하는 경우 이러한 규칙을 고려합니다.

  • 기본값은 필수 속성에 적용하면 안 됩니다.
  • 기본값은 키워드가 처음 나타나는 위치부터 하향식으로 평가됩니다.
  • 입력 CGV에 속성 값이 존재하는 경우 해당 속성의 자식만 기본값으로 평가됩니다.
  • 입력 CGV에 속성 값이 없으면 자식과 함께 기본값이 평가됩니다.
  • 속성 값이 object 형식이고 해당 키가 입력 CGV에 없는 경우 개체에 대한 기본값이 평가되지 않습니다.