次の方法で共有


構成のベスト プラクティス

この記事では、Azure Operator Service Manager を使用してネットワーク関数の構成要件を最適に管理するためのガイドラインを示します。 これには、最適な構成グループ スキーマ (CGS)、構成グループ値 (CGV)、networkFunctions (NSG) リソース テンプレートの設計が含まれます。 これらのプラクティスは、NF のオンボードとデプロイ時に心に留めておいてください。

構成方法

構成リソースを設計するときは、次のメタスキーマ ガイドラインを検討してください。

  • まず、演算子に公開するパラメーターを選択します。
    • 経験則として、 helm valueなどの直接操作によってサポートされるパラメーターを公開します。
    • cloudinit userdataなど、別のエージェントによってサポートされるパラメーターを抑制します。
  • パラメーターをサイト固有、インスタンス固有、およびセキュリティ固有のセットに並べ替えます。
    • パラメーターがセット間で重複しないようにします。
  • 必須パラメーターと省略可能なパラメーターを定義します。
    • 省略可能なパラメーターの場合は、適切な既定値を定義します。
  • シークレットが公開されないようにするには、セキュリティ固有のパラメーターを適切に構成してください。

One-CGS アプローチ

元の推奨事項は、NF 全体に対して 1 つの CGS/CGV セットのみを使用することでした。 このアプローチでは、サイト固有、インスタンス固有、およびセキュリティ固有のパラメーターをまとめて統合します。 サービスに複数のNFが含まれるまれなケースでのみ、複数のセットが使用されていました。 多くのパートナーがこのアプローチを使用して正常にオンボードされており、引き続きサポートされ続けています。 ただし、この方法ではシークレットが隠されることはありません。 すべての構成値はプレーンテキストで格納され、ほとんどの Azure メソッドを使用して表示できます。

Three-CGS アプローチ

次のようにパラメーターを編成して、少なくとも 3 つの CGS/CGV セットを使用することをお勧めします。

  • サイト固有のパラメーター

    • 例として、IP アドレスと一意の名前があります。
    • シークレットなしで CGS/CGV を使用します。
    • デプロイ時に値をプレーンテキストで格納します。
  • インスタンス固有のパラメーター

    • たとえば、タイムアウトとデバッグ レベルがあります。
    • シークレットなしで CGS/CGV を使用します。
    • デプロイ時に値をプレーンテキストで格納します。
  • セキュリティ固有のパラメーター

    • 例として、パスワードと証明書があります。
    • CGS/CGV をシークレットと共に使います。
    • デプロイ中に隠す値を Azure Key Vault (AKV) に格納します。

Warnung

  • シークレットを使用する場合は、ロール ベースのアクセス制御 (RBAC) スコープ Microsoft.Resources/deployments/exportTemplate/actionへのアクセスを制限することを検討してください。

シークレットのない CGS

この例では、 abcxyz、および qwe パラメーターを公開する CGS を示します。 2 つのパラメーターには既定値があり、1 つは必須とマークされています。

{ 
  "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
}

AKVを使用せずにシークレットを含むCGV

AKV が使用されていない場合は、次の Azure Resource Manager (ARM) テンプレート要件を検討して、CGV リソース ライフサイクル全体にわたってシークレット値を適切に隠します。

  • すべてのシークレットを格納するには、 "type": "secureObject"を使用してオブジェクト パラメーターを定義します。
    • この構成では、テンプレート パラメーターとしてシークレットの表示が隠されます。

この例では、オブジェクト パラメーターの secretCgvContentを定義する方法を示します。

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

  • bicep loadJsonContent() 関数を使用して secretCgvContent ハイドレートしないでください。
  • CGV リソースのプロパティで、 configurationType: 'Secret'"secretConfigurationValue": "[string(parameters('secretCgvContent'))]"を使用します。
    • この構成では、ほとんどの Azure ユーザー インターフェイスを介してシークレット データを表示できなくなります。

この例では、オブジェクト secretCgvContent 内のすべてのシークレットを CGV リソースに渡す方法を示します。

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

AKV を使用したシークレットを含む CGV

AKV が使用されている場合は、次の ARM テンプレート要件を考慮して、CGV リソース ライフサイクル全体にわたってシークレット値を適切に隠します。

  • シークレットごとに文字列 parameter を定義し、すべてのシークレット値を収集する 1 つのオブジェクト 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 リソースライフサイクル全体でシークレット値を正しく隠すには、次の ARM テンプレート要件を検討してください。

  • "type": "secureObject"パラメーターと secretValues パラメーターのテンプレートでconfigを使用する
    • この構成では、テンプレート パラメーターとしてシークレットの表示が隠されます。
"parameters": {
   "siteSpecificValues": {
     "type": "object"
   },
   "secretValues": {
     "type": "secureObject"
    },
    "nfValues": {
     "type": "object"
    },
    "config": {
      "type": "secureObject",
      "defaultValue": "[union(parameters('nfValues'),parameters('siteSpecificValues'), parameters('secretValues'))]"
    }
}

  • secretValues を bicep loadJsonContent() 関数でハイドレートしないでください。
  • networkFunctions リソースのプロパティで、 configurationType: 'Secret'"secretDeploymentValues": "[string(parameters('config'))]"を使用します。
    • ネットワーク関数がデプロイされると、この構成により、ほとんどの Azure ユーザー インターフェイスを介してシークレット データが表示されるのを防ぐことができます。
"resources": [
  {
    "type": "Microsoft.HybridNetwork/networkFunctions",
      "configurationType": "Secret",
      "secretDeploymentValues": "[string(variables('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 キーワードを指定しない場合、すべてのプロパティが必須と見なされます。 省略可能なプロパティ型をサポートするには、少なくとも 1 つの必須プロパティ型が必要です。

{
"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 に存在しない場合、オブジェクトの既定値は評価されません。