Configuración de una conexión de indexador a Azure SQL mediante una identidad administrada

En este artículo se explica cómo configurar una conexión de indexador a una base de datos de Azure SQL Database mediante una identidad administrada en lugar de proporcionar credenciales en la cadena de conexión.

Puede usar una identidad administrada asignada por el sistema o asignada por el usuario (versión preliminar). Las identidades administradas son inicios de sesión de Microsoft Entra y requieren asignaciones de roles de Azure para acceder a los datos de Azure SQL.

Requisitos previos

1 - Asignación de permisos para leer la base de datos

Siga los pasos que se indican a continuación para asignar al servicio de búsqueda o a la identidad gestionada asignada por el usuario el permiso para leer la base de datos.

  1. Conexión a Visual Studio

    Connect to Visual Studio

  2. Autentíquese con su cuenta de Microsoft Entra

    Authenticate

  3. Ejecute los siguientes comandos:

    Ponga entre corchetes el nombre del servicio de búsqueda o el nombre de la identidad administrada asignada por el usuario.

    CREATE USER [insert your search service name here or user-assigned managed identity name] FROM EXTERNAL PROVIDER;
    EXEC sp_addrolemember 'db_datareader', [insert your search service name here or user-assigned managed identity name];
    

    New query

    Execute query

Si más adelante cambia la identidad del servicio de búsqueda o la identidad asignada por el usuario después de asignar permisos, debe quitar la pertenencia al rol y quitar el usuario de la base de datos SQL y, a continuación, repetir la asignación de permisos. Para eliminar la pertenencia al rol y el usuario, ejecute los siguientes comandos:

sp_droprolemember 'db_datareader', [insert your search service name or user-assigned managed identity name];

DROP USER IF EXISTS [insert your search service name or user-assigned managed identity name];

2 - Agregar una asignación de roles

En esta sección, concederás permiso al servicio de Azure AI Search para leer los datos de SQL Server. Para asignar roles, consulte Asignación de roles de Azure mediante Azure Portal.

  1. En Azure Portal, vaya a la página de Azure SQL Server.

  2. Seleccione Access Control (IAM) .

  3. Seleccione Agregar > Agregar asignación de roles.

    Screenshot that shows Access control (IAM) page with Add role assignment menu open.

  4. En la pestaña Rol, seleccione el rol de Lector adecuado.

  5. En la pestaña Miembros, seleccione Identidad administrada y, a continuación, seleccione Seleccionar miembros.

  6. Seleccione su suscripción a Azure.

  7. Si usa una identidad administrada asignada por el sistema, seleccione Identidad administrada asignada por el sistema, busque el servicio de búsqueda y selecciónelo.

  8. Si por el contrario usa una identidad administrada asignada por el usuario, seleccione Identidad administrada asignada por el usuario, busque el nombre de la identidad y selecciónelo.

  9. En la pestaña Revisión y asignación, seleccione Revisión y asignación para asignar el rol.

3 - Crear el origen de datos

Cree el origen de datos y proporcione una identidad administrada asignada por el sistema o asignada por el usuario (versión preliminar).

Identidad administrada asignada por el sistema

La API de REST, Azure Portal y el SDK de .NET admiten una identidad administrada asignada por el sistema.

Cuando se conecte con una identidad administrada asignada por el sistema, el único cambio en la definición del origen de datos será el formato de la propiedad "credentials". Proporcionará un nombre de catálogo o base de datos original y un ResourceId que no tenga ninguna clave o contraseña de cuenta. ResourceId debe incluir el identificador de suscripción de Azure SQL Database, así como el grupo de recursos de SQL Database y el nombre de la base de datos SQL.

A continuación, se muestra un ejemplo de cómo crear un origen de datos para indexar datos desde una cuenta de almacenamiento mediante la API REST de creación de origen de datos y una cadena de conexión de identidad administrada. El formato de la cadena de conexión de identidad administrada es el mismo para la API REST, el SDK de .NET y Azure Portal.

POST https://[service name].search.windows.net/datasources?api-version=2020-06-30
Content-Type: application/json
api-key: [admin key]

{
    "name" : "sql-datasource",
    "type" : "azuresql",
    "credentials" : { 
        "connectionString" : "Database=[SQL database name];ResourceId=/subscriptions/[subscription ID]/resourceGroups/[resource group name]/providers/Microsoft.Sql/servers/[SQL Server name];Connection Timeout=30;"
    },
    "container" : { 
        "name" : "my-table" 
    }
} 

Identidad administrada asignada por el usuario (versión preliminar)

La API REST 2021-04-30-preview admite conexiones basadas en una identidad administrada asignada por el usuario. Al conectarse con una identidad administrada asignada por el usuario, se producen dos cambios en la definición del origen de datos:

  • En primer lugar, el formato de la propiedad "credentials" es un nombre de catálogo inicial o de base de datos y un valor de ResourceId que no tiene clave ni contraseña de cuenta. ResourceId debe incluir el identificador de suscripción de Azure SQL Database, así como el grupo de recursos de SQL Database y el nombre de la base de datos SQL. Este es el mismo formato que la identidad administrada asignada por el sistema.

  • En segundo lugar, agregará una propiedad "identity" que contiene la colección de identidades administradas asignadas por el usuario. Solo se debe proporcionar una identidad administrada asignada por el usuario al crear el origen de datos. Establece el tipo en "userAssignedIdentities".

A continuación, se ofrece un ejemplo de cómo crear un objeto de origen de datos de indexador mediante la API REST de creación o actualización de origen de datos en versión preliminar:

POST https://[service name].search.windows.net/datasources?api-version=2021-04-30-preview
Content-Type: application/json
api-key: [admin key]

{
    "name" : "sql-datasource",
    "type" : "azuresql",
    "credentials" : { 
        "connectionString" : "Database=[SQL database name];ResourceId=/subscriptions/[subscription ID]/resourceGroups/[resource group name]/providers/Microsoft.Sql/servers/[SQL Server name];Connection Timeout=30;"
    },
    "container" : { 
        "name" : "my-table" 
    },
    "identity" : { 
        "@odata.type": "#Microsoft.Azure.Search.DataUserAssignedIdentity",
        "userAssignedIdentity" : "/subscriptions/[subscription ID]/resourcegroups/[resource group name]/providers/Microsoft.ManagedIdentity/userAssignedIdentities/[managed identity name]"
    }
}   

4 - Crear el índice

El índice especifica los campos de un documento, los atributos y otras construcciones que conforman la experiencia de búsqueda.

Esta es una llamada a la API REST de creación de índice con un campo booktitle que permite búsquedas:

POST https://[service name].search.windows.net/indexes?api-version=2020-06-30
Content-Type: application/json
api-key: [admin key]

{
    "name" : "my-target-index",
    "fields": [
        { "name": "id", "type": "Edm.String", "key": true, "searchable": false },
        { "name": "booktitle", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false }
    ]
}

5 - Crear el indexador

Un indizador conecta un origen de datos con un índice de búsqueda de destino y proporciona una programación para automatizar la actualización de datos. Una vez creados el índice y el origen de datos, ya podrá crear el indexador. Si el indexador se realizó correctamente, la sintaxis de conexión y las asignaciones de roles son válidas.

Esta es una llamada a la API REST de creación de indexador con una definición de indexador de Azure SQL. El indexador se ejecutará cuando envíe la solicitud.

POST https://[service name].search.windows.net/indexers?api-version=2020-06-30
Content-Type: application/json
api-key: [admin key]

{
    "name" : "sql-indexer",
    "dataSourceName" : "sql-datasource",
    "targetIndexName" : "my-target-index"

Solución de problemas

Si recibe un error cuando el indexador intenta conectarse al origen de datos que indica que el cliente no tiene permiso para acceder al servidor, consulte los errores comunes del indexador.

Para descartar cualquier problema relacionado con el firewall, pruebe también la conexión con y sin restricciones.

Consulte también