Настройте CORS при доступе к сервису AWS ELB с помощью AWS-SDK-JS.

Я работаю над приложением для мониторинга ELB, которое я хотел бы создать с помощью JS и разместить непосредственно в S3. У меня нет опыта работы с JS, и я изо всех сил пытаюсь справиться с CORS.

Я успешно создал сборку SDK для своего браузера (http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-building.html), который включает поддержку API ELB.

Я интегрировал вход в Amazon (http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-configuring-wif.html) со своим сценарием, и я прикрепил его к роли IAM WebIdentity.

Когда я звоню

elb.describeInstanceHealth(elbRequestParams).on('success', describeInstanceHealthCallback).send();

Я получаю сообщение об ошибке в консоли Javascript

XMLHttpRequest cannot load 'elasticloadbalancing.eu-west-1.amazonaws.com/'. The request was redirected to 'aws.amazon.com/elasticloadbalancing', which is disallowed for cross-origin requests that require preflight.

Я не могу найти четкой документации о том, что то, что я пытаюсь сделать, не будет работать, но я признаю, что меня смущают некоторые термины в документации, и у меня нет опыта работы с CORS в предыдущих приложениях. отступить. Я бы подумал, что весь JS-SDK для браузера немного избыточен, если большинство сервисов не поддерживают CORS, а должны быть.

Я могу заставить это работать, отключив веб-безопасность в моем браузере Chrome, очевидно, это не очень хороший обходной путь, но он укажет мне, что проблема в CORS.

Кто-нибудь знаком с этим подходом, это проблема, которую я размещаю на S3, или у меня будет эта проблема с любого сервера? Должен ли я настраивать корзину S3 с помощью CORS, или в конечной точке «elasticloadbalancing.eu-west-1.amazonaws.com» нет политики CORS?

Спасибо

Эндрю


person Andrew Taylor    schedule 04.03.2014    source источник
comment
как вы запускаете это, работая прямо с s3? можете ли вы показать код, который вызывает elb.describeInstanceHealth(elbRequestParams).on('success', descriptionInstanceHealthCallback).send();   -  person wayne    schedule 04.03.2014
comment
Да, он запускается напрямую с S3. Довольно сложно выбрать конкретный код, но, по сути, просто определить elb как экземпляр AWS.ELB(), а затем вызвать эту строку. Если я отключу CORS в своем браузере, эта строка успешно завершится, как и ожидалось. Есть ли какой-то конкретный код, который вы хотели бы увидеть? Возможно обратный звонок?   -  person Andrew Taylor    schedule 04.03.2014
comment
Проблема CORS наверняка раздражает, и это не синтаксическая ошибка, которая является правильной или неправильной, они могут быть разными. Можете ли вы показать код обратного вызова, а также полный заголовок/детали запроса из chrome devtool   -  person wayne    schedule 04.03.2014
comment
Для ясности; AWS должен поддерживать заголовок CORS для ELB, чтобы мои запросы работали? Если это так, есть ли способ легко это проверить? Попытка найти детали запроса/заголовка сейчас.   -  person Andrew Taylor    schedule 04.03.2014
comment
Я думаю, что это как-то связано с регионом. в каком регионе у вас ведро s3 и в каком регионе ваш elb? В неамериканском регионе возникнут проблемы с использованием стиля домена для доступа к s3. вы видите, что запрос elasticloadbalancing.eu-west-1.amazonaws.com/(регион eu в стиле домена) перенаправляется на aws.amazon.com/elasticloadbalancing (регион США). не повредит попытка изменить настройки региона.   -  person wayne    schedule 04.03.2014


Ответы (1)


Я успешно создал сборку SDK для своего браузера (http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-building.html), который включает поддержку API ELB.

Страница, на которую ссылаются, уже дает первый ключ к отсутствию поддержки CORS для elasticloadbalancing.eu-west-1.amazonaws.com, который, как вы правильно подозреваете, является причиной здесь:

Если вы работаете с SDK за пределами среды, которая принудительно использует CORS в вашем браузере, и хотите получить доступ ко всему спектру услуг, предоставляемых AWS SDK для JavaScript, можно создать пользовательскую копию SDK локально, клонировав репозиторий и запустив те же инструменты сборки, которые использовались для создания размещенной по умолчанию версии SDK.

Это основная причина того, что официальный AWS SDK для JavaScript в браузере исключает все, кроме текущих 5 службы, перечисленные в разделе Поддерживаемые службы раздела Работа со службами в браузере — это отсутствие поддержки CORS:

SDK можно использовать с другими службами, если в вашей среде отключена проверка безопасности CORS. В этом случае вы можете создать свою собственную версию SDK. Дополнительные сведения о как создать пользовательскую сборку SDK.

К сожалению, ни Amazon EC2, ни Elastic Load Balancing в настоящее время предлагает поддержку CORS, см., например, этот недавний запрос функции (поддержка CORS для службы EC2), где автор справедливо приходит к тому же выводу, что и вы (также намекая на то, что Node.js является еще одним важным вариантом использования, который поддерживает все доступные сервисы AWS, см. Работа со службами в Node.js):

С моей точки зрения, если AWS предоставляет библиотеку aws-sdk-js, все сервисы AWS, поддерживаемые этой библиотекой, должны поддерживать CORS, чтобы библиотеку aws-sdk-js можно было использовать не только в среде node.js, но и в браузере. .

Хотя я в принципе согласен и сам ожидал бы более быстрого времени выполнения этой задачи, AWS хорошо известна своим гибким подходом к разработке продуктов, т. е. раннее начало с небольшого набора функций и постепенное улучшение на основе отзывов клиентов. Примечательно, что SDK помечен как Предварительная версия для разработчиков, т. е. еще даже не БЕТА, и я надеюсь, что в будущем это будет соответствующим образом решено. заметное предупреждение может значительно сэкономить пользователям время на то, чтобы самостоятельно разобраться с этим ограничением.

person Steffen Opel    schedule 03.05.2014