Невозможно получить доступ к 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
})
Если это не тот код, который вы используете, не могли бы вы предоставить более представительный фрагмент кода и полную трассировку стека ошибки?