Подключите приложение функций javascript Azure к SQL server с помощью утомительного и управляемого удостоверения службы (MSI).

#javascript #node.js #sql-server #azure-functions #tedious

Вопрос:

Я пытаюсь подключить свое приложение-функцию Azure к управляемому серверу SQL с помощью утомительного и управляемого удостоверения службы (MSI). Сначала я перешел по этим ссылкам, чтобы создать свои функции : https://docs.microsoft.com/fr-fr/azure/azure-sql/database/connect-query-nodejs?tabs=windows
https://medium.com/swlh/a-node-function-app-to-get-json-results-from-azure-synapse-analytics-e671dd6ae827

Я добавил имя функции приложения в базу данных. Я разработал функцию с помощью утомительного и заполнил значение аутентификации «azure-active-directory-msi-app-service». Вот пример моего кода :

 const { Connection, Request } = require('tedious');

module.exports = function (context, req) {

    // Create array to store the query results
    let result = [];
    let rowData = {};

    const config = {
        server: 'XXXXXX.public.XXXXXX.database.windows.net',
        Authentication: {
            type: 'azure-active-directory-msi-app-service',
        },
        options: {
            database: 'YYYYY',
            encrypt: true,
            port: 3342,
            connectTimeout: 120000
        }
    }

    // Create query to execute against the database
    const queryText = `SQL QUERY`;

    context.log('Query selected : '   queryText);

    const connection = new Connection(config);

    // Create Request object
    const request = new Request(queryText, (err) => {
        connection.close();
        if (err) {
            // Error in executing query
            context.log.error(err);
            context.res.status = 500;
            context.res.body = 'Error executing the query';
        } else {
            context.res = {
                status: 200,
                isRaw: true,
                body: result,
                headers: {
                    'Content-Type': 'application/json'
                }
            }
        }
        // Inform Azure Function runtime that work is done
        context.done();
    });

    connection.connect();

    // Manipulate the results and create JSON
    request.on('row', function (columns) {
        rowData = {};
        columns.forEach(function (column) {
            rowData[column.metadata.colName] = column.value;
        });
        result.push(rowData);
    });

    // Attempt to connect and execute queries if connection goes through
    connection.on('connect', function (err) {
        if (err) {
            // Error in connecting
            context.log.error(err);
            context.res.status = 500;
            context.res.body = 'Error connecting to Azure SQL server';
            context.done();
        } else {
            // Connection succeeded
            context.log('Connection succeeded');
            connection.execSql(request);
        }
    });
}
 

Я всегда получаю ошибку аутентификации :

 2021-07-22T12:16:22.925 [Error] ConnectionError: Login failed for user ''.at ConnectionError
(C:homesitewwwrootnode_modulestediousliberrors.js:13:12)at Parser.<anonymous> 
(C:homesitewwwrootnode_modulestediouslibconnection.js:1184:51)at Parser.emit (events.js:315:20)at Readable.<anonymous> 
(C:homesitewwwrootnode_modulestediouslibtokentoken-stream-parser.js:27:14)at Readable.emit (events.js:315:20)at addChunk 
(C:homesitewwwrootnode_modulesreadable-streamlib_stream_readable.js:298:12)at readableAddChunk 
(C:homesitewwwrootnode_modulesreadable-streamlib_stream_readable.js:280:11)at Readable.push 
(C:homesitewwwrootnode_modulesreadable-streamlib_stream_readable.js:241:10)at 
C:homesitewwwrootnode_modulesreadable-streamlibinternalstreamsfrom.js:49:29at Generator.next (<anonymous>) {code: 'ELOGIN'}
 

Не могли бы вы, пожалуйста, помочь мне найти причину проблемы ? Есть ли дополнительная конфигурация, которую я не делал в SQL cloud ?

Заранее спасибо.

Овации,

Ответ №1:

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

 authentication: {
    type: 'azure-active-directory-msi-app-service',
}