Server-less API на AWS за 15 хвилин

Amazon Web Services дозволяє дуже швидко проводити прототипування простих веб-додатків, і написати API, припустимо, для простого мобільного додатка можна за лічені хвилини. Ми будемо використати зв'язку DynamoDB та API Gateway (без Лямбда-функцій!) для налаштування GET і POST запитів до бази з можливістю читання, запису і редагування даних в ній.



Насамперед, вам необхідно зареєструватися на AWS і увійти в консоль. Створення нашого сервісу ми почнемо з бази даних DynamoDB, натисніть кнопку Create table введіть заголовок таблиці apiData (у керівництві я буду використовувати свої назви, ви можете вказувати будь-які інші), основний ключ з яким у неї будуть додаватися записи: userID і відмітьте галочку Use default settings.


У DynamoDB рядка в таблицю додаються за вказаною ключа, при цьому можливе додавання будь-якої кількості параметрів і не обов'язково збіг структури даних для різних ключів. У нашому випадку для кожного з користувачів за вказаною userID ми зможемо додавати будь-які дані, які описують даного користувача.

Далі нам необхідно створити так звану роль в сервісі Identity and Access Management. В меню зліва виберіть розділ Roles і натисніть кнопку Create new role; вкажіть її назву — dynamoAPI, і після натискання кнопки Next Step — в розділі AWS Service Roles Amazon API Gateway, ще двічі натисніть Next Step і нарешті — Create Role.

Нас цікавить значення Role ARN зазначене у форматі arn:aws:iam::000000000000:role/roleName. Це значення необхідно буде використовувати при зв'язку запитів з базою даних, тому запишіть його. Далі нам необхідно створити політику доступу для даної ролі, це робиться на вкладці Permissions у розділі Inline policies, розкрийте її і натисніть click here.


У розділі Policy Generator натисніть кнопку Select, на сторінці, що відкриється, виберіть сервіс Amazon DynamoDB і вкажіть Actions:

  • DeleteItem
  • GetItem
  • PutItem
  • Query
  • Scan
  • UpdateItem
Можливо, ви захочете мати можливість робити якісь інші дії з допомогою API, в такому випадку можете вивчити їх на цій сторінці довідки, для базових операцій нам зазначених дій вистачить позаочі. Що стосується пункту Amazon Resource Name — тут ви можете вказати ARN вашої таблиці на вкладці Огляд) або вказати * що дасть можливість користувачам з створеної роллю мати доступ до всіх таблиць вашого облікового запису. Натисніть кнопку Add Statement та Next Step, на сторінці — Apply Policy. На цьому налаштування ролі завершено!

Переходимо до створення API з використанням сервісу API Gateway. Натисніть синю кнопку Create API, на що відкрилася сторінку вкажіть його назву — The API натиснувши кнопку Create API внизу сторінки. Тепер нам необхідно створити ресурс, до якого можна буде звертатися із запитами, натисніть кнопку Actions і виберіть Create Resource.


Назвемо цей ресурс user, він буде містити інформацію про користувачів, і щоб отримати доступ до конкретного користувача — необхідно буде вказати ID користувача в якості параметра шляху. Щоб у сервісі API Gateway створювати такі параметри, нам необхідно створити новий ресурс, на рівень нижче від вже створеного user, і в якості Resource Name та Resource Path вказати {userid} (зверніть увагу, що при вказівці назви у такому форматі Resource Path автоматом замінюється на -userid-, вам необхідно вручну вказати потрібну форму для параметра шляху).


Далі створимо метод для створення запису про новий користувача, для цього виберемо ресурс {userid} і натиснувши кнопку Actions виберемо Create method, виберіть його тип — POST і натисніть галочку для його створення. У меню налаштувань в розділі Integration type необхідно відкрити спойлер Show advanced і вибрати AWS Service Proxy. Налаштування:

  • AWS Region " вкажіть регіон, в якому знаходиться ваша база даних (за замовчуванням — us-east-1, перевірити його можна в розділі Огляд вашої таблиці)
  • AWS Service: DynamoDB
  • AWS Subdomain: залишити порожнім
  • HTTP method: POST (використовується для будь-яких звернень до DynamoDB, в тому числі і для отримання даних)
  • Action Type: Use action name
  • Action: PutItem (використовується для створення нового запису/перезапису всього значення за вказаною ключу)
  • Execution role: вказати роль, яку ми створили, у форматі arn:aws:iam::000000000000:role/roleName




Після збереження налаштувань необхідно спершу зайти в перший квадрат Method Request, у пункті API Key Required вибрати true і натиснути на галочку щоб зберегти налаштування — це необхідно для доступу до даного методу ззовні за допомогою сертифіката авторизації (налаштуємо пізніше; не забувайте проробляти цю операцію для всіх методів!). Поверніться назад і зайдіть у другий квадрат Integration Request для налаштування власне запиту в DynamoDB. На сторінці, що відкрилася, — промотати в самий низ і відкрийте розділ Body Mapping Templates, натисніть кнопку Add mapping template, виберіть Content type: application/json, в поле вводу необхідно вказати параметри запиту для створення нового запису використовуйте наступний код:

{ 
"TableName": "apiData",
"Item": {
"userID": {
"S": "$input.params('userid')"
},
"parameter": {
"S": "$input.path('$.parameter')"
}
},
"ReturnValues": "ALL_OLD"
}

Тут ми вказуємо ім'я таблиці, в якій виробляємо зміни, першим вказується ключ, по якому будуть вноситися дані: userID, його значення береться з параметра шляху userid. З тіла запиту беруться дані по ключу parameter і додаються в однойменний стовпець нашої бази даних для зазначеного користувача. В якості відповіді — надсилається попереднє значення за вказаною ключу, якщо воно існувало. Якщо користувач з таким іменем користувача не існувало — прийде порожній відповідь.

Все що нам залишається — це перевірити працездатність запиту, для цього вгорі сторінки натисніть кнопку назад і праворуч від чотирьох квадратів — натисніть на кнопку Test зі значком Гаррі Поттера:


У вікні нам потрібно буде вказати значення Path parameter — це ім'я користувача, якого ми хочемо створити / перезаснувати (нагадаю, PutItem перезаписує всю рядок за вказаною ключу), трохи нижче — вказуємо body запиту:

{
"parameter": "112233"
}

Запит пройшов успішно, ми отримали відповідь з порожнім тілом без всяких помилок!



Якщо ми перейдемо в DynamoDB, то на вкладці Items зможемо побачити тільки що створеного користувача:


Для читання даних про користувача — необхідно так само в рамках ресурсу {userid} створити метод GET c ActionQuery, провести настройку інтеграційного запиту (пам'ятаєте — в цьому випадку запит до бази все одно робиться POST методом!) і вказати наступний темплейт для боді мапінгу:

{
"TableName": "apiData",
"KeyConditionExpression": "userID = :v1",
"ExpressionAttributeValues": {
":v1": {
"S": "$input.params('userid')"
}
}
}

Якщо ж ми хочемо змінити якесь значення параметра для певного користувача, не міняючи всі інші рядки, то ми також можемо використовувати метод POST c Action типу UpdateItem і наступним темплейтом мапінгу:

{
"TableName": "apiData",
"Key": { 
"userID": {
"S": "$input.params('userid')"
}
},
"UpdateExpression": "set token_proof = :tkn",
"ExpressionAttributeValues": { 
":tkn": {
"S": "$input.path('$.token')"
}
},
"ReturnValues": "UPDATED_NEW"
}

У цьому випадку запит повертає всі оновлені дані про користувача в разі успіху, прикладів — цей метод можна використовувати для зберігання appsecret_proof при авторизації користувача через Facebook у вашому додатку.

По суті, всі базові сценарії використання API можна створити грунтуючись на даних прикладах. Все що нам залишається — це отримати доступ до API ззовні, для цього необхідно натиснути нашу улюблену кнопку Actions в меню нашого API і вибрати Deploy API. Вказуєте:

  • Deployment stage: [New Stage]
  • Stage name: apiRelease (або будь-яке інше)
Натискаєте Deploy і отримуєте Invoke URL наступного виду: m00000000a.execute-api.us-east-1.amazonaws.com/apiRelease. Щоб робити запити за цією адресою — необхідний токен авторизації для його отримання — в меню зліва зайдіть в розділ API Keys, натисніть кнопку Create, назвіть як-то свій ключ і збережіть його. Далі у розділі API Stage Association виберіть потрібний API недавно створену сцену, після натисніть кнопку Add. Поверніться через ліве меню в наш API, виберіть Actions -> Deploy API, виберіть створену Stage і натисніть Deploy. Вуаля!

Тепер ви можете робити запити до вашого API ззовні, додавши до запитів header x-api-key з вашим токеном значення. Щоб отримати дані про нашому створеному користувача достатньо зробити відповідний GET запит на адресу m00000000a.execute-api.us-east-1.amazonaws.com/apiRelease/user/newUserOne і ви отримаєте всю наявну про нього інформацію у відповіді! Таким чином, за лічені хвилини можна створити простий API для доступу до бази даних, з допомогою якого можна тестувати ваш новий додаток або будь-яке інше знаряддя, не потребує складної структури даних. Для більш складних проектів, звичайно, варто використовувати більш відповідні інструменти.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.