Невозможно получить доступ к S/4HANA в системе Premise через Cloud Connector, используя SAP Cloud SDK для JavaScript

Я пытаюсь получить доступ к системе S/4HANA on Premise через Cloud Connector и службу подключения SAP Cloud Platform, используя SAP Cloud SDK для JavaScript (версия 1.5.0).

Подробно имею

  • Cloud Connector
  • служба связи
  • экземпляр службы xsuaa
  • Маршрутизатор приложений (app-router)
  • пункт назначения
  • служба назначения

которые все работают как положено. Эти предварительные условия объясняются различными учебниками ( https://blogs.sap.com/2019/04/02/a-do-it-yourself-at-home-guide-how-to-connect-a-node.js-app-on-sap-cloud-platform-for-the-cloud-foundry-to-an-s4hana-on-premise-system-securely-via-cloud-connector/, https://blogs.sap.com/2017/07/13/part-2-how-to-use-the-sap-cloud-platform-connectivity-and-the-cloud-connector-in-the-cloud-foundry-environment/).

С этой настройкой у меня нет проблем с доступом к облачной системе S / 4HANA. При использовании SAP Cloud SDK для Java все работает должным образом, т.е. я могу получить доступ к локальной системе. У меня достаточно прав на систему помещения. Базовая аутентификация используется.

Пример запроса GET для получения информационных записей документа с использованием SAP Cloud SDK JavaScript:

let destination = await useOrFetchDestination({
destinationName: 'MY_DESTINATION',
jwt: 'MY_JWT' });
DocumentInfoRecord.requestBuilder()
.getAll()
.execute(destination);

Но тестирование на локальной системе приводит к сбою запроса GET с кодом состояния 503:

ERR Error: get request failed!
ERR     at Object.errorWithCause (/path-to-app/node_modules/@sap/cloud-sdk-util/dist/error.js:14:20)
ERR     at specializeError (/path-to-app/@sap/cloud-sdk-core/dist/request-builder/request/odata-request.js:175:32)
ERR     at /path-to-app/@sap/cloud-sdk-core/dist/request-builder/request/odata-request.js:162:58
ERR     at processTicksAndRejections (internal/process/task_queues.js:86:5)
ERR Caused by:
ERR Error: Request failed with status code 503
ERR     at createError (/path-to-app/axios/lib/core/createError.js:16:15)
ERR     at settle (/path-to-app/axios/lib/core/settle.js:17:12)
ERR     at IncomingMessage.handleStreamEnd (/path-to-app/axios/lib/adapters/http.js:237:11)
ERR     at IncomingMessage.emit (events.js:198:15)
ERR     at endReadableNT (_stream_readable.js:1139:12)
ERR     at processTicksAndRejections (internal/process/task_queues.js:81:17)

Что я мог пропустить? Нужны ли дополнительные HTTP-заголовки для успешного выполнения запроса?

ОБНОВЛЕНИЕ: добавлена ​​информация о месте назначения во фрагмент кода и завершено сообщение об ошибке.

2-е ОБНОВЛЕНИЕ: Конфигурация назначения выглядит примерно так:

Name: <MY_DESTINATION>
Type: HTTP
URL: http://...    //this matches the cloud connector host, i.e. in SAP Cloud Platform Cockpit --> Cloud Connectors --> Exposed Back-End Systems
ProxyType: OnPremise
Authentication: BasicAuthentication
User: <USERNAME>
Password: <PASSWORD>

2 ответа

Решение

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

В логах облачного коннектора ошибок не было. Но удаленная отладка приложения (следуя этим инструкциям) вызвала это сообщение об ошибке:

К вашему субсчету не подключен SAP Cloud Connector (SCC). Запрошенное открытие туннеля для субсчета "SUBACCOUNT_ID" и идентификатора местоположения SCC со значением по умолчанию, которое является пустой строкой или просто не настроено. Проверьте конфигурацию на SCC и облачной стороне.

С помощью useOrFetchDestination JavaScript из SAP Cloud SDK для получения информации о месте назначения не возвращал это свойство, поэтому оно никогда не добавлялось в запрос.

Текущее решение состоит в том, чтобы удалить идентификатор местоположения как из пункта назначения, так и из облачного соединителя. Тогда запросы выполняются успешно.

Есть ли способ получить идентификатор местоположения пункта назначения?

Обновление: идентификатор местоположения можно получить из пункта назначения, используя originalProperties свойство. Если присутствует, он содержит свойство с именем CloudConnectorLocationId, Как описано здесь, это значение может быть добавлено как SAP-Connectivity-SCC-Location_ID заголовок к запросу.

Спасибо Dennis H за вашу поддержку.

Обновить:

Честно говоря, я немного озадачен в настоящее время. Учитывая, что ваш запрос работает с Java SDK, я тоже не понимаю, почему он не работает в JS.

Вы пытались запросить тот же сервис в Java? (То есть вы уверены, что сопоставления путей в вашем облачном соединителе работают правильно?) Можете ли вы поделиться своей конфигурацией назначения из облачной кабины? Есть ли еще какие-либо записи в журнале, кроме ошибки, которую вы уже опубликовали? Есть ли у вас доступ к журналам облачного коннектора? (То есть вы можете как-то выяснить, где происходит сбой запроса?


Оригинальный ответ:

Если это именно тот код, который вы используете:

DocumentInfoRecord.requestBuilder()
  .getAll()
  .execute({});

Тогда запрос все равно не будет работать, так как вы не указали правильный пункт назначения для execute функция. Вам нужно либо передать сам пункт назначения, например:

.execute({
  url: 'https://my.onprem.system',
  ...
})

(но я представляю, что это довольно сложно для локального пункта назначения), или укажите имя пункта назначения JWT текущего запроса, например:

.execute({
  destinationName: 'my-on-prem-destination',
  jwt: myJwt
})

Если это не тот код, который вы используете, не могли бы вы предоставить более представительный фрагмент кода и полную трассировку стека ошибки?

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