Получить строку первичного подключения CosmosDB в шаблоне ARM

#azure-cosmosdb #arm-template

#azure-cosmosdb #azure-rm-template

Вопрос:

У меня есть шаблон ARM, который использует исходный ключ CosmosDB следующим образом:

{ «свойства»: { «включено»: true, «siteConfig»: { «AppSettings»: [ { «имя»: «MongoDB:CnnDetails», «значение»: «[listKeys(resourceId(‘Microsoft.DocumentDB/databaseAccounts’, переменные(‘cosmosdb_full’)), ‘2015-04-08’).primaryMasterKey]» } }

Как мне изменить ее, чтобы вместо нее получить фактическую строку подключения?

Я попробовал несколько вещей:

  1. изменил слово primaryMasterKey на primaryConnectionString. При этом выдается сообщение об ошибке:

‘Свойство выражения языка ‘primaryConnectionString’ не существует, доступными свойствами являются ‘primaryMasterKey, secondaryMasterKey, primaryReadonlyMasterKey, secondaryReadonlyMasterKey’

  1. изменил рабочие клавиши списка на listConnectionStrings. В моей Visual Studio это подчеркнуто красным, но, похоже, работает при передаче через azure devops

‘Свойство выражения языка ‘primaryConnectionString’ не существует, доступными свойствами являются ‘ConnectionStrings’

  1. Я перешел к https://learn.microsoft.com/en-us/rest/api/cosmos-db-resource-provider/databaseaccounts/listconnectionstrings#code-try-0 чтобы попробовать это. ListKeys возвращает структуру, подобную этой:

    { «primaryMasterKey»: «[ОТРЕДАКТИРОВАНО]», «secondaryMasterKey»: «[ОТРЕДАКТИРОВАНО]», «primaryReadonlyMasterKey»: «[ОТРЕДАКТИРОВАНО]», «secondaryReadonlyMasterKey»: «[ОТРЕДАКТИРОВАНО]»}

итак, я понимаю, почему сработал .primaryMasterKey. Но ListConnectionStrings возвращает:

 {
  "connectionStrings": [
{
  "connectionString": "mongodb://[REDACTED]:10255/?ssl=trueamp;replicaSet=globaldb",
  "description": "Primary MongoDB Connection String"
},
{
  "connectionString": "mongodb://[REDACTED]:10255/?ssl=trueamp;replicaSet=globaldb",
  "description": "Secondary MongoDB Connection String"
},
{
  "connectionString": "mongodb://[REDACTED]:10255/?ssl=trueamp;replicaSet=globaldb",
  "description": "Primary Read-Only MongoDB Connection String"
},
{
  "connectionString": "mongodb://[REDACTED]:10255/?ssl=trueamp;replicaSet=globaldb",
  "description": "Secondary Read-Only MongoDB Connection String"
}
]
}
  

Не уверен, как «индексировать в нее»?

Любые подсказки с благодарностью получены.

Ответ №1:

Для всех, кто еще находит этот вопрос и хочет получить полностью завершенный фрагмент шаблона ARM, это то, что я использовал и работает:

 "connectionStrings": [
 {
   "name": "CosmosConnection",
   "connectionString": "[listConnectionStrings(resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbAccountName')), '2019-12-12').connectionStrings[0].connectionString]",
   "type": 3
 }
]
  

Ответ №2:

как вы обычно делаете практически на любом языке:

 ListConnectionStrings.connectionStrings[index].connectionString
  

индекс начинается с 0.

у вас есть более «родной» способ сделать это:

 first(ListConnectionStrings.connectionStrings).connectionString
  

но доступны только функции first и last

Комментарии:

1. Спасибо, я попробовал [listConnectionStrings(resourceId(‘Microsoft. DocumentDB/databaseAccounts’, переменные(‘cosmosdb_full’)), ‘2015-04-08’)[1]. ConnectionString] но я пропустил бит ConnectionStrings [а также думал, что на основе единицы, а не на основе нуля].

Ответ №3:

Ответ здесь от oatsoda правильный, но он будет работать, только если вы находитесь в той же группе ресурсов, что и Cosmos DB, для которой вы получаете строку подключения. Если у вас есть сценарий, в котором Cosmos DB находится в группе ресурсов, отличной от ресурса, который вы генерируете, шаблон ARM для следующего фрагмента — это то, что я использовал для генерации строки подключения для службы приложений, и он работает.

 "Cosmos": {
   "value": "[listConnectionStrings(resourceId(parameters('cosmosResourceGroupName'),'Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), '2019-12-12').connectionStrings[0].connectionString]",
   "type": "Custom"
}
  

Комментарии:

1. Не могли бы вы объяснить, где именно ваш JSON должен быть подключен к шаблону ARM?

2. Это вошло бы в раздел свойств строк подключения, например { «name»: «connectionstrings», «type»: «config», «apiVersion»: «2018-11-01», «properties»: { «Cosmos»: { «value»: «[listConnectionStrings(resourceId(параметры(‘cosmosResourceGroupName’), ‘Microsoft. DocumentDB/databaseAccounts’, параметры(‘cosmosDbName’)), ‘2019-12-12’).ConnectionStrings[0].ConnectionString]», «тип»: «Пользовательский» } } }`

Ответ №4:

В связанном с космосом шаблоне ARM с именем linkedTemplate_cosmos_db-gdp-event-ammi-dev-ne-001 я использовал следующий код.

 "outputs": {
"ConnectionString": {
  "value": "[listConnectionStrings(resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('accountName')), '2019-12-12').connectionStrings[0].connectionString]",
  "name": "CosmosConnection",
  "type": "string"
}
},
  

а затем в шаблоне ARM (linkedTemplate_Main), который использует выходной параметр, следующий, например, параметр конфигурации приложения-функции

  "COSMOS_CONNECTION_STRING": {
        "value": "[reference('linkedTemplate_cosmos_db-gdp-event-ammi-dev-ne-001').outputs.ConnectionString.value]"