Ошибка ResourceNotFound шаблона ARM Azure при ссылке на управляемое удостоверение в политике доступа к хранилищу ключей.

При развертывании службы KeyVault с политикой доступа к управляемой идентификации во включенном приложении логики происходит сбой, поскольку она еще не существует. Я добавил зависимость для приложения логики.

Странно то, что этот шаблон работал неделями, теперь он каждый раз дает сбой, поэтому я немного запутался. Я скопировал это из шаблонов быстрого запуска от MS. Но проблема не в этом, поскольку если вы посмотрите на ошибку, она указывает на правильный целевой ресурс. Также этот шаблон работает, если я нажимаю повторно развернуть после сбоя, поскольку в это время уже существует управляемое удостоверение. Я тестировал его, но он все равно не работает.

Вот мой шаблон ARM

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "logicAppName": {
            "type": "string",
            "minLength": 1,
            "metadata": {
                "description": "Describes the name of the Logic App resource"
            },
            "defaultValue": "demo"
        },
        "location": {
            "type": "string",
            "defaultValue": "[resourceGroup().location]",
            "metadata": {
                "description": "Specifies the Azure location where the key vault should be created."
            }
        }
    },
    "variables": {
        "keyVaultName": "[concat('eakeyvault', uniquestring(resourceGroup().id))]",
        "logicAppName": "[parameters('logicAppName')]"
    },
    "resources": [
        {
            "type": "Microsoft.KeyVault/vaults",
            "name": "[variables('keyVaultName')]",
            "apiVersion": "2018-02-14",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[resourceId('Microsoft.Logic/workflows', variables('logicAppName'))]"
            ],
            "properties": {
                "enabledForDeployment": false,
                "enabledForDiskEncryption": false,
                "enabledForTemplateDeployment": false,
                "tenantId": "[subscription().tenantId]",
                "accessPolicies": [
                    {
                        "objectId": "[reference(concat(resourceId('Microsoft.Logic/workflows/', variables('logicAppName')), '/providers/Microsoft.ManagedIdentity/Identities/default'), '2018-11-30').principalId]",
                        "tenantId": "[subscription().tenantId]",
                        "permissions": {
                            "secrets": ["get"]
                        }
                    }
                ],
                "sku": {
                    "name": "standard",
                    "family": "A"
                },
                "networkAcls": {
                    "value": {
                        "defaultAction": "Allow",
                        "bypass": "AzureServices"
                    }
                }
            }
        },
        {
            "type": "Microsoft.Logic/workflows",
            "apiVersion": "2017-07-01",
            "name": "[variables('logicAppName')]",
            "location": "[resourceGroup().location]",
            "identity": {
                "type": "SystemAssigned"
            },
            "properties": {
                "state": "Disabled",
                "definition": {
                    "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
                    "actions": {

                    },
                    "contentVersion": "1.0.0.0",
                    "outputs": {},
                    "parameters": {
                        "$connections": {
                            "defaultValue": {},
                            "type": "Object"
                        }
                    },
                    "triggers": {
                        "Recurrence": {
                            "recurrence": {
                                "frequency": "Day",
                                "interval": 1,
                                "schedule": {
                                    "hours": [
                                        "3"
                                    ]
                                }
                            },
                            "type": "Recurrence"
                        }
                    }
                },
                "parameters": {

                }
            }
        }
    ]
}

И ошибка

введите здесь описание изображения

{
   "id":"/subscriptions/x/resourceGroups/demo6/providers/Microsoft.Resources/deployments/Microsoft.Template/operations/272BE07B42936635",
   "operationId":"272BE07B42936635",
   "properties":{
      "provisioningOperation":"Read",
      "provisioningState":"Failed",
      "timestamp":"2019-10-06T15:09:38.8112774Z",
      "duration":"PT1.3818083S",
      "trackingId":"faf54706-3f6f-469a-9917-a65bdba9768f",
      "statusCode":"NotFound",
      "statusMessage":{
         "error":{
            "code":"ResourceNotFound",
            "message":"The Resource 'Microsoft.Logic/workflows/demo' under resource group 'demo6' was not found."
         }
      },
      "targetResource":{
         "id":"/subscriptions/x/resourceGroups/demo6/providers/Microsoft.Logic/workflows/demo/providers/Microsoft.ManagedIdentity/Identities/default",
         "resourceType":"Microsoft.ManagedIdentity/Identities",
         "resourceName":"default",
         "apiVersion":"2018-11-30"
      }
   }
}

person Adam Marczak    schedule 06.10.2019    source источник


Ответы (4)


Я использовал это как ссылку на службу приложений:

[reference(resourceId('Microsoft.Web/sites', variables('webAppName')), '2016-08-01', 'Full').identity.principalId]

и, конечно, зависит от:

[resourceId('Microsoft.Web/sites', variables('webAppName'))]
person juunas    schedule 07.10.2019
comment
это может действительно сработать, похоже, ссылка на поставщика удостоверений не работает должным образом. Кроме того, при использовании ссылочной функции вам не понадобится зависимость. его избыточный - person 4c74356b41; 07.10.2019
comment
Да, в этом не должно быть необходимости. Я только что нашел несколько случаев, когда это не было лишним, и без него были проблемы :( - person juunas; 07.10.2019
comment
у вас есть примеры? я никогда не видел ничего подобного. не быть злым, просто заинтересованным в тех случаях - person 4c74356b41; 07.10.2019
comment
Нет: \ Это было довольно давно, и я уже сделал обходные пути в зависимости от - person juunas; 07.10.2019
comment
К сожалению, я работаю с Logic Apps, но я использовал ту же логику, что и вы. Ссылка на принципал приложений логики и зависит от приложения логики. Может, это просто ошибка Azure? - person Adam Marczak; 07.10.2019
comment
спасибо, это работает, но явно есть ошибка, появившаяся с 2018-11-30, так как раньше она работала нормально - person emp; 10.10.2019
comment
может быть ошибка синхронизации: когда я развертываю шаблон в первый раз, я получаю ту же ошибку, но при повторном развертывании он работает! (он работает, когда создаются KeyVault и WebApp) зависимость должна быть не от ресурса веб-сайта, а от удостоверения, но как это написать? - person Dargos; 28.05.2020

у вас есть опечатка в вашей resourceId() функции:

reference(concat(resourceId('Microsoft.Logic/workflows', variables('logicAppName')), '/providers/Microsoft.ManagedIdentity/Identities/default'), '2018-11-30').principalId

обратите внимание на дополнительный / после workflows.

person 4c74356b41    schedule 06.10.2019
comment
Правда, скопировал это из шаблонов быстрого запуска от MS. Но проблема не в этом, поскольку если вы посмотрите на ошибку, она указывает на правильный целевой ресурс. Также этот шаблон работает, если я нажимаю повторно развернуть после сбоя, поскольку в это время уже существует управляемое удостоверение. Я тестировал его, но он все равно не работает; ( - person Adam Marczak; 07.10.2019
comment
Теперь мне интересно, почему, по вашему мнению, не указывать все это в вопросе было хорошей идеей? после некоторых поисков это похоже на ошибку, tbh. вы можете обойтись с вложенным развертыванием, скорее всего - person 4c74356b41; 07.10.2019
comment
Да, это важная информация. Я добавлю это к исходному вопросу. Это было не умышленно, я просто забыл добавить это во время написания. - person Adam Marczak; 07.10.2019

Это теория, но попробуйте обновить свою политику доступа, добавив в нее дополнительные зависимости:

"dependsOn:" [
"[resourceId('Microsoft.Logic/workflows', variables('logicAppName'))]"
]

Мысль о том, что компоненты политики доступа отличаются от фактического создания Key Vault.

Оба плана используют Azure Active Directory (Azure AD) для аутентификации. Для авторизации уровень управления использует управление доступом на основе ролей (RBAC), а плоскость данных использует политику доступа Key Vault.

Это имеет смысл с ошибкой, поскольку политика доступа не может быть назначена, если рабочий процесс еще не создан.

person DreadedFrost    schedule 14.01.2020

Что-то очень важное, что я хотел добавить, это то, что указано в официальной документации здесь:

https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/error-not-found#solution-1---set-dependencies

Ссылочная функция и функции list * создают неявную зависимость от указанного ресурса, когда этот ресурс развертывается в том же шаблоне и на него ссылаются по его имени (а не идентификатору ресурса).

У меня возникла проблема, заключающаяся в том, что я указывал свой "dependsOn" с таким идентификатором ресурса:

"dependsOn": [
                "[resourceId('Microsoft.Web/sites', parameters('serv_webjobs_as_name'))]"
            ],

Что по-прежнему приводило к сбою создания и позволяло процессу создания игнорировать мою зависимость. Однако, когда я поставил зависимость на основе «имени», а не идентификатора, она начала работать:

"dependsOn": [
                "[parameters('serv_webjobs_as_name')]"
            ],
person Mathieu    schedule 23.03.2020
comment
В документации также говорится, что вы НЕ должны добавлять DependencyOn, если у вас есть неявная зависимость. Я знаю, что исходный вопрос здесь был, и это была ошибка, но не имеет отношения к проблеме в этом случае. Используйте ссылочную функцию и передайте имя ресурса, чтобы установить неявную зависимость между ресурсами, которым необходимо совместно использовать свойство. Не добавляйте явный элемент dependsOn, если вы уже определили неявную зависимость. Такой подход снижает риск возникновения ненужных зависимостей. - person Adam Marczak; 24.03.2020