Bicep — использование OpenAPI для создания определения API и политик XML для каждой операции

У меня есть требование, согласно которому мой клиент хотел бы предоставить спецификацию OpenAPI для создания API с операциями и попросить разработчиков создать политики операций. Я понимаю, что это можно сделать для всех операций API, однако политика каждой операции различна. Возможно ли через Bicep использовать OpenAPI, а затем использовать bicep для назначения другой политики XML?

param apiName string = 'reallycool-api-dev'
param apimName  string = 'apim-coolness-01'
resource apimServiceResource 'Microsoft.ApiManagement/service@2022-04-01-preview' existing  = {
  name: apimName
}

resource apiService  'Microsoft.ApiManagement/service/apis@2023-05-01-preview' = {
  name: apiName
  parent: apimServiceResource
  properties: {
    displayName                                     : 'ReallyCool-API-dev'
    isCurrent                                       : true
    description                                     : 'ReallyCool API-dev'
    protocols                                       : ['https']    
    subscriptionRequired                            : true
    format: 'openapi+json'
    value                                           : loadTextContent('OpenAPI ReallyCoolAPI.json')
    path                                            : 'reallycool/dev'
    subscriptionKeyParameterNames: {
        header : 'Ocp-Apim-Subscription-Key'
        query   : 'subscription-key'
    }
    }    
}         



resource firstOperationPolicy 'Microsoft.ApiManagement/service/apis/operations/policies@2022-09-01-preview'    = {   
    name: '${apimName}/api/operations/operationNamefromOpenAPIspec/policy'   
    parent: apiService   properties: {
                  format: 'rawxml'
                  value: loadTextContent('TestPolicy.xml')   
        } 
        }

Я получаю следующую ошибку:

Error BCP170: Expected resource name to not contain any "/" characters. Child resources with a parent resource reference (via the parent property or via nesting) must not contain a fully-qualified name.
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
114
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ошибка BCP170: Ожидаемое имя ресурса не содержит символов «/». Дочерние ресурсы со ссылкой на родительский ресурс (через родительское свойство или через вложение) не должны содержать полное имя.

Я попытался выполнить код в своей среде и получил то же сообщение об ошибке, что и вы.

Ошибка связана с форматом аргумента name, передаваемого в ресурсе политики работы API. Вы можете просто передать name: 'policy', поскольку он уже определил родительские ресурсы с соответствующими поставщиками ресурсов для конкретных операций службы управления API (API).

Модифицированный код:

resource firstOperationPolicy 'Microsoft.ApiManagement/service/apis/operations/policies@2022-09-01-preview'    = {   
    name: 'policy'   
    parent: apiOperationExample  
    properties: {
       format: 'rawxml'
       value: loadTextContent('vcs.xml')
    } 
}

Развертывание выполнено успешно:

Ответ принят как подходящий

Необходимо знать идентификатор операции в спецификации openAPI.json относительно того, к какой политике вам нужно применить policy.xml. формат: '${apimName}/${apiName}/operationIdfromOpenAPIspec/policy'

Необходимо указать полное имя ресурса политики, т.е.:

param apiName string = 'reallycool-api-dev'
param apimName  string = 'apim-coolness-01'

resource firstOperationPolicy 'Microsoft.ApiManagement/service/apis/operations/policies@2022-09-01-preview'    = {   
    name: '${apimName}/${apiName}/operationIdfromOpenAPIspec/policy'             
    properties: {
                  format: 'rawxml'
                  value: loadTextContent('TestPolicy.xml')   
        } 
}

Другие вопросы по теме