Використання AWS AppSync і AWS Lake Formation для доступу до безпечного озера даних через GraphQL API | Веб-сервіси Amazon

Використання AWS AppSync і AWS Lake Formation для доступу до безпечного озера даних через GraphQL API | Веб-сервіси Amazon

Вихідний вузол: 2317494

Озера даних набувають популярності для зберігання величезних обсягів даних із різноманітних джерел у масштабований та економічно ефективний спосіб. Оскільки кількість споживачів даних зростає, адміністраторам озер даних часто доводиться впроваджувати детальний контроль доступу для різних профілів користувачів. Їм може знадобитися обмежити доступ до певних таблиць або стовпців залежно від типу користувача, який робить запит. Крім того, компанії іноді хочуть зробити дані доступними для зовнішніх програм, але не знають, як це зробити безпечно. Щоб вирішити ці проблеми, організації можуть звернутися до GraphQL і Формування озера AWS.

GraphQL забезпечує потужний, безпечний і гнучкий спосіб запиту та отримання даних. AWS AppSync це служба для створення GraphQL API, яка може надсилати запити до кількох баз даних, мікросервісів і API з однієї уніфікованої кінцевої точки GraphQL.

Адміністратори озер даних можуть використовувати Lake Formation для керування доступом до озер даних. Lake Formation пропонує точне керування доступом для керування дозволами користувачів і груп на рівні таблиці, стовпця та клітинки. Таким чином, він може забезпечити безпеку даних і відповідність. Крім того, ця Lake Formation інтегрується з іншими службами AWS, такими як Амазонка Афіна, що робить його ідеальним для запитів до озер даних через API.

У цьому дописі ми демонструємо, як створити програму, яка може отримувати дані з озера даних за допомогою API GraphQL і надавати результати різним типам користувачів на основі їхніх конкретних привілеїв доступу до даних. Приклад програми, описаний у цій публікації, створено партнером AWS Технології НЕТСОЛ.

Огляд рішення

Наше рішення використовує Служба простого зберігання Amazon (Amazon S3) зберігати дані, Клей AWS Data Catalog для розміщення схеми даних і Lake Formation для забезпечення керування об’єктами AWS Glue Data Catalog шляхом впровадження рольового доступу. Ми також використовуємо Amazon EventBridge щоб фіксувати події в нашому озері даних і запускати подальші процеси. Архітектура рішення показана на наступній діаграмі.

Схема структури Appsync і LakeFormation Arch

Рисунок 1 – Архітектура рішення

Нижче наведено покроковий опис рішення:

  1. Озеро даних створюється у сегменті S3, зареєстрованому в Lake Formation. Щоразу, коли надходять нові дані, викликається правило EventBridge.
  2. Правило EventBridge запускає AWS Lambda для запуску сканера AWS Glue для виявлення нових даних і оновлення будь-яких змін у схемі, щоб можна було запитувати останні дані.
    Примітка: сканери AWS Glue також можна запускати безпосередньо з подій Amazon S3, як описано в цьому блог.
  3. AWS Amplify дозволяє користувачам входити за допомогою Амазонка Когніто як постачальник ідентифікаційних даних. Cognito автентифікує облікові дані користувача та повертає маркери доступу.
  4. Автентифіковані користувачі викликають AWS AppSync GraphQL API через Amplify, отримуючи дані з озера даних. Для обробки запиту запускається функція Lambda.
  5. Функція Lambda отримує відомості про користувача з Cognito та припускає, що AWS Identity and Access Management (IAM) роль, пов’язану з групою користувачів Cognito запитувача.
  6. Потім функція Lambda запускає запит Athena до таблиць озера даних і повертає результати в AWS AppSync, який потім повертає результати користувачеві.

Передумови

Щоб розгорнути це рішення, ви повинні спочатку зробити наступне:

git clone git@github.com:aws-samples/aws-appsync-with-lake-formation.git
cd aws-appsync-with-lake-formation

Підготувати дозволи на формування озера

Увійдіть у Консоль LakeFormation і додайте себе як адміністратора. Якщо ви входите в Lake Formation вперше, ви можете зробити це, вибравши «Додати себе» на екрані «Ласкаво просимо до Lake Formation» і вибравши «Розпочати», як показано на малюнку 2.

Рисунок 2. Додайте себе як адміністратора Lake Formation

В іншому випадку ви можете вибрати «Адміністративні ролі та завдання» на лівій навігаційній панелі та вибрати «Керування адміністраторами», щоб додати себе. Після завершення ви маєте побачити своє ім’я користувача IAM у розділі Адміністратори озера даних із повним доступом.

Виберіть параметри каталогу даних на лівій навігаційній панелі та переконайтеся, що два поля керування доступом IAM не вибрано, як показано на малюнку 3. Ви хочете, щоб Lake Formation, а не IAM, керував доступом до нових баз даних.

Параметри каталогу даних Lake Formation

Рисунок 3 – Параметри каталогу даних Lake Formation

Розгорніть рішення

Щоб створити рішення у своєму середовищі AWS, запустіть такий стек AWS CloudFormation:  Запустіть Cloudformation Stack

Наступні ресурси будуть запущені через шаблон CloudFormation:

  • Amazon VPC і мережеві компоненти (підмережі, групи безпеки та шлюз NAT)
  • Ролі IAM
  • Lake Formation інкапсулююче відро S3, сканер AWS Glue і база даних AWS Glue
  • Лямбда -функції
  • Пул користувачів Cognito
  • AWS AppSync GraphQL API
  • Правила EventBridge

Після розгортання необхідних ресурсів зі стеку CloudFormation ви повинні створити дві функції Lambda та завантажити набір даних в Amazon S3. Lake Formation керуватиме озером даних, що зберігається у сегменті S3.

Створення лямбда-функцій

Кожного разу, коли новий файл поміщається в призначене відро S3, викликається правило EventBridge, яке запускає функцію Lambda для запуску сканера AWS Glue. Веб-сканер оновлює каталог даних AWS Glue, щоб відобразити будь-які зміни в схемі.

Коли програма надсилає запит на дані через GraphQL API, для обробки запиту та повернення результатів викликається лямбда-функція обробника запитів.

Щоб створити ці дві лямбда-функції, виконайте наступне.

  1. Увійдіть у консоль Lambda.
  2. Виберіть лямбда-функцію обробника запитів під назвою dl-dev-crawlerLambdaFunction.
  3. Знайдіть файл функції сканера Lambda у своєму lambdas/crawler-lambda у сховищі git, яке ви клонували на вашій локальній машині.
  4. Скопіюйте та вставте код із цього файлу в розділ «Код». dl-dev-crawlerLambdaFunction у вашій консолі Lambda. Потім виберіть «Розгорнути», щоб розгорнути функцію.
Скопіюйте та вставте код у функцію Lambda

Рисунок 4 – Скопіюйте та вставте код у функцію Lambda

  1. Повторіть кроки 2–4 для вказаної функції обробника запитів dl-dev-requestHandlerLambdaFunction використовуючи код в lambdas/request-handler-lambda.

Створіть шар для обробника запитів Lambda

Тепер ви повинні завантажити додатковий код бібліотеки, необхідний для функції Lambda обробника запитів.

  1. Select Шари в меню ліворуч і виберіть Створити шар.
  2. Введіть назву, наприклад appsync-lambda-layer.
  3. завантажити цей ZIP-файл рівня пакета на вашу локальну машину.
  4. Завантажте ZIP-файл за допомогою Завантажувати кнопка на Створити шар стр.
  5. Вибирати Python 3.7 як час виконання для шару.
  6. Вибирати Створювати.
  7. Select Функції у меню ліворуч і виберіть dl-dev-requestHandler Лямбда-функція.
  8. Прокрутіть вниз до Шари розділ і виберіть Додайте шар.
  9. Виберіть Користувацькі шари а потім виберіть шар, який ви створили вище.
  10. Натисніть додавати.

Завантажте дані в Amazon S3

Перейдіть до кореневого каталогу клонованого сховища git і виконайте наведені нижче команди, щоб завантажити зразок набору даних. Замініть bucket_name заповнювач із сегментом S3, наданим за допомогою шаблону CloudFormation. Ви можете отримати назву сегмента з консолі CloudFormation, перейшовши до Виходи вкладка з ключем datalakes3bucketName як показано на зображенні нижче.

Малюнок 5 – Назва сегмента S3, показана на вкладці CloudFormation Outputs

Малюнок 5 – Назва сегмента S3, показана на вкладці CloudFormation Outputs

Введіть наведені нижче команди в папку проекту на локальній машині, щоб завантажити набір даних у сегмент S3.

cd dataset
aws s3 cp . s3://bucket_name/ --recursive

Тепер давайте подивимося на розгорнуті артефакти.

Озеро даних

Відро S3 містить зразки даних для двох організацій: компаній та їхніх відповідних власників. Відро зареєстровано в Lake Formation, як показано на малюнку 6. Це дає змогу Lake Formation створювати каталоги даних і керувати ними, а також керувати дозволами на дані.

Рисунок 6 – Консоль Lake Formation, на якій показано розташування озера даних

Рисунок 6 – Консоль Lake Formation, на якій показано розташування озера даних

Базу даних створюється для зберігання схеми даних, присутніх в Amazon S3. Робота AWS Glue використовується для оновлення будь-яких змін у схемі в сегменті S3. Цьому сканеру надано дозвіл СТВОРЮВАТИ, ЗМІНЮВАТИ та ВИДАЛЯТИ таблиці в базі даних за допомогою Lake Formation.

Застосуйте елементи керування доступом до озера даних

Створено дві ролі IAM, dl-us-east-1-developer та dl-us-east-1-business-analyst, кожен з яких призначено окремій групі користувачів Cognito. Через Формування озера кожній ролі призначаються різні повноваження. Роль розробника отримує доступ до кожного стовпця в озері даних, тоді як роль бізнес-аналітика має доступ лише до стовпців інформації, що не дозволяє ідентифікувати особу.

Дозволи озера даних консолі Lake Formation, призначені ролям групи

Рисунок 7 – Дозволи озера даних консолі Lake Formation, призначені ролям групи

Схема GraphQL

API GraphQL доступний для перегляду з консолі AWS AppSync. The Companies тип містить кілька атрибутів, що описують власників компаній.

Схема для GraphQL API

Рисунок 8 – Схема для GraphQL API

Джерелом даних для API GraphQL є функція Lambda, яка обробляє запити.

– Джерело даних AWS AppSync зіставлено з функцією Lambda

Рисунок 9 – Джерело даних AWS AppSync, зіставлене з функцією Lambda

Обробка запитів GraphQL API

Функція лямбда-обробника запитів GraphQL API отримує ідентифікатор пулу користувачів Cognito зі змінних середовища. Використовуючи бібліотеку boto3, ви створюєте клієнт Cognito та використовуєте get_group метод отримання ролі IAM, пов’язаної з групою користувачів Cognito.

Щоб отримати роль, ви використовуєте допоміжну функцію у функції Lambda.

def get_cognito_group_role(group_name): response = cognito_idp_client.get_group( GroupName=group_name, UserPoolId=cognito_user_pool_id ) print(response) role_arn = response.get('Group').get('RoleArn') return role_arn

Використання Служба маркерів безпеки AWS (AWS STS) через клієнт boto3 ви можете взяти на себе роль IAM і отримати тимчасові облікові дані, необхідні для виконання запиту Athena.

def get_temp_creds(role_arn): response = sts_client.assume_role( RoleArn=role_arn, RoleSessionName='stsAssumeRoleAthenaQuery', ) return response['Credentials']['AccessKeyId'],
response['Credentials']['SecretAccessKey'], response['Credentials']['SessionToken']

Ми передаємо тимчасові облікові дані як параметри під час створення нашого клієнта Boto3 Amazon Athena.

athena_client = boto3.client('athena', aws_access_key_id=access_key, aws_secret_access_key=secret_key, aws_session_token=session_token)

Клієнт і запит передаються в нашу допоміжну функцію запитів Athena, яка виконує запит і повертає ідентифікатор запиту. За допомогою ідентифікатора запиту ми можемо читати результати з S3 і об’єднувати їх як словник Python, який повертається у відповідь.

def get_query_result(s3_client, output_location): bucket, object_key_path = get_bucket_and_path(output_location) response = s3_client.get_object(Bucket=bucket, Key=object_key_path) status = response.get("ResponseMetadata", {}).get("HTTPStatusCode") result = [] if status == 200: print(f"Successful S3 get_object response. Status - {status}") df = pandas.read_csv(response.get("Body")) df = df.fillna('') result = df.to_dict('records') print(result) else: print(f"Unsuccessful S3 get_object response. Status - {status}") return result

Увімкнення клієнтського доступу до озера даних

На стороні клієнта AWS Amplify налаштовано з пулом користувачів Amazon Cognito для автентифікації. Ми перейдемо до консолі Amazon Cognito, щоб переглянути пул користувачів і створені групи.

Рисунок 10 – Пули користувачів Amazon Cognito

Рисунок 10 – Пули користувачів Amazon Cognito

Для нашого прикладу програми ми маємо дві групи в нашому пулі користувачів:

  • dl-dev-businessAnalystUserGroup – Бізнес-аналітики з обмеженими правами.
  • dl-dev-developerUserGroup – Розробники з повними дозволами.

Якщо ви дослідите ці групи, ви побачите роль IAM, пов’язану з кожною. Це роль IAM, яка призначається користувачеві під час автентифікації. Athena бере на себе цю роль під час запиту до озера даних.

Якщо ви переглянете дозволи для цієї ролі IAM, ви помітите, що вона не містить елементів керування доступом нижче рівня таблиці. Вам потрібен додатковий рівень керування, наданий Lake Formation, щоб додати детальний контроль доступу.

Після того, як Cognito перевірить і автентифікує користувача, Amplify використовує маркери доступу, щоб викликати API AWS AppSync GraphQL і отримати дані. На основі групи користувача функція Lambda приймає на себе відповідну роль групи користувачів Cognito. Використовуючи прийняту роль, виконується запит Athena, і результат повертається користувачеві.

Створення тестових користувачів

Створіть двох користувачів, одного для розробника та одного для бізнес-аналітика, і додайте їх до груп користувачів.

  1. Перейдіть до Cognito та виберіть пул користувачів, dl-dev-cognitoUserPool, це створено.
  2. Вибирати Створити користувача і надайте деталі для створення нового користувача бізнес-аналітика. Ім'я користувача може бути бізнес-аналітик. Залиште адресу електронної пошти пустою та введіть пароль.
  3. Виберіть користувачів і виберіть щойно створеного користувача.
  4. Додайте цього користувача до групи бізнес-аналітиків, вибравши Додати користувача до групи кнопки.
  5. Виконайте ті самі кроки, щоб створити іншого користувача з цим іменем розробник і додайте користувача до групи розробників.

Перевірте розчин

Щоб протестувати своє рішення, запустіть програму React на локальній машині.

  1. У каталозі клонованого проекту перейдіть до react-app каталог.
  2. Встановіть залежності проекту.
npm install

  1. Встановіть Amplify CLI:
npm install -g @aws-amplify/cli

  1. Створіть новий файл під назвою .env за допомогою наступних команд. Потім за допомогою текстового редактора оновіть значення змінних середовища у файлі.
echo export REACT_APP_APPSYNC_URL=Your AppSync endpoint URL > .env
echo export REACT_APP_CLIENT_ID=Your Cognito app client ID >> .env
echo export REACT_APP_USER_POOL_ID=Your Cognito user pool ID >> .env

Використовувати Виходи вкладку стека консолі CloudFormation, щоб отримати необхідні значення з ключів, як показано нижче:

REACT_APP_APPSYNC_URL appsyncApiEndpoint
REACT_APP_CLIENT_ID cognitoUserPoolClientId
REACT_APP_USER_POOL_ID cognitoUserPoolId
  1. Додайте попередні змінні до свого середовища.
source .env

  1. Згенеруйте код, необхідний для взаємодії з API за допомогою Розширити CodeGen. На вкладці «Виходи» консолі Cloudformation знайдіть свій ідентифікатор API AWS Appsync поруч із appsyncApiId ключ
amplify add codegen --apiId <appsyncApiId>

Прийміть усі параметри за замовчуванням для наведеної вище команди, натиснувши Що натомість? Створіть віртуальну версію себе у на кожну підказку.

  1. Запустіть додаток.

Ви можете підтвердити, що програма запущена, відвідавши http://localhost:3000 і ввійдіть як користувач-розробник, якого ви створили раніше.

Тепер, коли програма запущена, давайте подивимося, як кожна роль обслуговується з companies кінцева точка.

По-перше, підпишіться як роль розробника, яка має доступ до всіх полів, і зробіть запит API до кінцевої точки компанії. Зверніть увагу, до яких полів ви маєте доступ.

Результати для ролі розробника

Рисунок 11 – Результати для ролі розробника

Тепер увійдіть як користувач Business Analyst і зробіть запит до тієї самої кінцевої точки та порівняйте включені поля.

Результати для ролі бізнес-аналітика

Рисунок 12 – Результати для ролі бізнес-аналітика

Стовпці «Ім’я» та «Прізвище» списку компаній виключаються в поданні бізнес-аналітики, навіть якщо ви зробили запит до тієї самої кінцевої точки. Це демонструє потужність використання однієї уніфікованої кінцевої точки GraphQL разом із кількома ролями IAM групи користувачів Cognito, зіставленими з дозволами Lake Formation, для керування доступом на основі ролей до ваших даних.

Очищення

Після завершення тестування рішення очистіть наведені нижче ресурси, щоб уникнути стягнення плати в майбутньому:

  1. Очистіть відра S3, створені шаблоном CloudFormation.
  2. Видаліть стек CloudFormation, щоб видалити сегменти S3 та інші ресурси.

Висновок

У цій публікації ми показали вам, як безпечно надавати дані в озері даних автентифікованим користувачам програми React на основі їхніх прав доступу на основі ролей. Щоб досягти цього, ви використали GraphQL API в AWS AppSync, детальні елементи керування доступом із Lake Formation і Cognito для автентифікації користувачів за групами та зіставлення їх із ролями IAM. Ви також використовували Athena для запиту даних.

Додаткову інформацію на цю тему див Візуалізація великих даних за допомогою AWS AppSync, Amazon Athena та AWS Amplify та Створіть архітектуру сітки даних за допомогою AWS Lake Formation і AWS Glue.

Чи застосуєте ви цей підхід для обслуговування даних із вашого озера даних? Дайте нам знати в коментарях!


Про авторів

Рана Датт є головним архітектором рішень в Amazon Web Services. Він має досвід розробки масштабованих програмних платформ для фінансових послуг, охорони здоров’я та телекомунікаційних компаній, і він захоплено допомагає клієнтам будувати AWS.

Ранджит Раяпролу є старшим архітектором рішень в AWS, який працює з клієнтами на північному заході Тихого океану. Він допомагає клієнтам розробляти та використовувати добре архітектурні рішення в AWS, які вирішують їхні бізнес-проблеми та прискорюють впровадження послуг AWS. Він зосереджується на безпеці та мережевих технологіях AWS для розробки рішень у хмарі в різних галузевих вертикалях. Ранджит живе в районі Сіетла і любить активний відпочинок.

Джастін Лето є старшим архітектором рішень в Amazon Web Services, спеціалізується на базах даних, аналітиці великих даних і машинному навчанні. Його пристрасть полягає в тому, щоб допомогти клієнтам краще адаптувати хмару. У вільний час він захоплюється морським плаванням і грою на джазовому фортепіано. Він живе в Нью-Йорку з дружиною та маленькою донькою.

Часова мітка:

Більше від Великі дані AWS