Як я можу використовувати AWS CloudFront та API Gateway паралельно для одного домену?


9

Я розміщую ці статичні активи свого веб-сайту на S3 і налаштовую CloudFront для їх розповсюдження. Це, по суті, відповідає вмісту, який користувачі потребують для будь-якого запиту GET на моєму веб-сайті, до існуючих шляхів, тобто із запрошенням помилок.

У мене також є декілька запитів POST, з якими мені потрібно звернутися. Форми подань, надсилання електронних листів, сповіщень, взаємодія з базою даних.

Як я можу налаштувати Lambda (або шлюз API) поряд з CloudFront для того ж домену, щоб CloudFront обробляв GET-запити, а API Gateway обробляв запити з тілом або POST-запитами. Або я можу це якось зробити за окремою URL-адресою?

Відповіді:


2

Я запускаю кілька веб-додатків саме за вашим запропонованим дизайном, і я діставав gofaas , навчальний додаток Go та Lambda, щоб поділитися методами.

Вам потрібні два окремі домени, наприклад www.gofaas.netдля S3 + CloudFront та api.gofaas.netдля API Gateway + Lambda.

Тоді ви можете дозволити статичному сайту взаємодіяти з API з конфігурацією CORS шлюзу API і деяким JavaScript:

fetch(`https://api.gofaas.net/work`, {
    method: "POST",
    mode: "cors",
    headers: {
        "Accept": "application/json",
        ...
    },
    body: JSON.stringify(...)
})
    .then(function(response) {
        return response.json();
    })
    .then(function (json) {
        // use response
    })
    .catch(function (err) {
        console.log("fetch error", err);
    });

Ось декілька посібників щодо налаштування цього:

Статичні веб-сайти з S3, CloudFront та ACM

Безпека API з Lambda, API Gateway, CORS та JWT


Тестування сайту завжди стає цікавим тут. Важко копіювати інфраструктуру AWS на місцевому рівні, щоб ви могли робити інтеграційні тести на місцевому рівні. Я використовую маршрут замість субдомену. Це допомагає в частині тестування. Також усуває проблеми CORS. Потім шлюз API стає джерелом CloudFront для цього маршруту.
Коста

6

Ви можете створити функцію лямбда, встановити шлюз API, а потім налаштувати CloudFront для пересилання певних шляхів (наприклад, / rest / *) до шлюзу API, а також обслуговувати все інше з відра S3.

Ось повна інструкція про те, як показати це: https://www.codeengine.com/articles/process-form-aws-api-gateway-lambda/


2

З точки зору підключення "щось" має відповідати на ваші запити (GET, POST, PUT, все). Перш за все, у вас є TCP-з'єднання, і "щось" потрібно переконатися, що він розуміє рівень 7 та має сенс з байтів, які клієнт надсилає. Тільки в цей момент можна обробляти GET-запити інакше, ніж POST-запити або одну URL-адресу, ніж іншу URL-адресу. Отже, врешті-решт, вам потрібна послуга, яка здатна розуміти та маршрутизувати HTTP. Наступні служби здатні зробити це: CloudFront ELB / ALB API шлюз (обмеження настає пізніше)

API Gateway використовує CloudFront внутрішньо (не даючи вам можливості реально налаштувати що-небудь на рівні CloudFront) - це означає, що немає можливості запустити CloudFront та API Gateway поруч, оскільки, зрештою, це означатиме, що ви запускаєте CloudFront з CloudFront пліч-о-пліч.

CloudFront надає вам можливість вибору різних джерел на основі шаблонів, але ви можете вибрати лише S3 або ELB / ALB як джерело, а не функції Lambda (крім функцій Lambda @ Edge).

ALB / ELB може використовувати лише екземпляри EC2 як бекенд - тут немає Lambda або S3.

Єдині способи, які я можу придумати, з чого можна зробити те, що ви хочете зробити, це такі:

  • Ви використовуєте шлюз API і спрямовуєте певний "актив"-шлях до функції Lambda, який робить вид зворотного проксі-сервера для S3 (таким чином, обробляючи статичні активи через лямбда) - будьте в курсі витрат на Lambda тут!
  • Ви можете зробити те ж саме, але замість того, щоб передати об'єкт через Lambda, просто генеруйте підписану URL-адресу в Lambda, переадресацію безпосередньо на S3 для обслуговування (можливо, це буде більш економічно)
  • Використання інших субдоменів для ваших активів, ніж для решти вашої програми - це дуже поширена модель, оскільки ви можете легко розділитись на рівні DNS і використовувати різні сервіси для різних випадків використання (CloudFront для активів та шлюз API для нестатичних частини)

Отже, мій дзвінок був би останнім варіантом - але це означає, що вам потрібно вказати клієнтам / браузерам на окремий піддомен для всіх статичних активів (або для всіх POST-запитів).

Здається, ви хочете ознайомитись з такими технологіями, як AngularJS або React, щоб створити в браузері справді керовану програму API. При такому підході ви використовуєте справжній API, який обробляє всі "динамічні" запити за допомогою шлюзу API і доставляє саму програму від S3 як статичний актив. Можливо, перегляд тих, хто може допомогти вам знайти свій шлях - навіть якщо ви їх не використовуєте, архітектурна схема того, як будувати такі речі, - це те, що ви просите в імхо.


2

У мене таке ж налаштування. Статичні активи на S3, функції Lambda, що подаються через шлюз API, і мають одне і те ж доменне ім'я.

Я працюю з шлюзом API, який вже використовує CloudFront і розкриває деякі його функції, такі як кешування. Потім я конфігурую URI, які відображають статичні активи. В шлюзі API ресурсом може бути функція лямбда, функція AWS, макет або інша URL-адреса. У мене вони вказують на мої URL-адреси S3.

URI-адреси можуть бути встановлені так само, щоб поширювати підпункти, наприклад, наприклад /assets/*.


Тож частина, яка мені створює проблеми, - це розгортання API. Зазвичай це розгортається без провідного шляху у вашому випадку /assets/*. Я маю видалити розгортання та клацнути правою кнопкою миші /assets/*шлях і розгорнути звідти.
Коста

1
Я повинен зануритися в інструменти командного рядка і навчитися створювати та редагувати звідти api та lambda.
Коста
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.