Виконуйте безпечні зворотні записи бази даних за допомогою Amazon QuickSight

Виконуйте безпечні зворотні записи бази даних за допомогою Amazon QuickSight

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

Amazon QuickSight це масштабоване, безсерверне рішення для бізнес-аналітики (BI) на основі машинного навчання (ML), яке дозволяє легко підключатися до ваших даних, створювати інтерактивні інформаційні панелі, отримувати доступ до статистики з підтримкою ML і ділитися візуальними матеріалами та інформаційними панелями з десятками тисяч внутрішніх і зовнішніх користувачів, у самому QuickSight або вбудованому в будь-яку програму.

Зворотний запис — це можливість оновлювати вітрину даних, сховище даних або будь-яку іншу базу даних із панелей інструментів BI та аналізувати оновлені дані майже в реальному часі на самій панелі інструментів. У цій публікації ми покажемо, як виконувати безпечні зворотні записи бази даних за допомогою QuickSight.

Огляд варіантів використання

Щоб продемонструвати, як увімкнути функцію зворотного запису за допомогою QuickSight, розглянемо вигадану компанію AnyCompany Inc. AnyCompany — це фірма, що надає професійні послуги, яка спеціалізується на наданні рішень для персоналу своїм клієнтам. AnyCompany визначила, що виконання робочих навантажень у хмарі для підтримки зростаючих потреб глобального бізнесу є конкурентною перевагою, і використовує хмару для розміщення всіх своїх робочих навантажень. AnyCompany вирішила покращити спосіб надання цінових пропозицій своїм клієнтам у своїх відділеннях. Наразі філії генерують клієнтські пропозиції вручну, і як перший крок у цій інноваційній подорожі AnyCompany прагне розробити корпоративне рішення для створення клієнтських цінових пропозицій із можливістю динамічного застосування даних про місцеві ціни під час створення цінової пропозиції.

Зараз використовує AnyCompany Амазонська червона зміна як платформу корпоративного сховища даних і QuickSight як рішення BI.

Створення нового рішення пов’язане з такими проблемами:

  • AnyCompany хоче рішення, яке легко створювати та підтримувати, і вони не хочуть інвестувати в створення окремого інтерфейсу користувача.
  • AnyCompany хоче розширити можливості своєї існуючої інформаційної панелі QuickSight BI, щоб також увімкнути генерацію та прийняття пропозицій. Це спростить розгортання функцій, оскільки їхні співробітники вже використовують інформаційні панелі QuickSight і насолоджуються простим у використанні інтерфейсом, який надає QuickSight.
  • AnyCompany хоче зберігати історію узгодження цінових пропозицій, яка включає створені, перевірені та прийняті пропозиції.
  • AnyCompany хоче створити нову інформаційну панель із даними історії котирувань для аналізу та бізнес-аналізу.

У цій публікації описано кроки, щоб увімкнути функцію зворотного запису в Amazon Redshift від QuickSight. Зауважте, що традиційні інструменти BI доступні лише для читання та мають мінімальні можливості для оновлення вихідних даних.

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

Це рішення використовує такі служби AWS:

  • API -шлюз Amazon – Розміщує та захищає API REST із зворотним записом, який буде викликано QuickSight
  • AWS Lambda – Запускає функцію обчислення, необхідну для створення хешу, і другу функцію для безпечного виконання зворотного запису
  • Amazon QuickSight – Пропонує інформаційні панелі BI та можливості формування пропозицій
  • Амазонська червона зміна – Зберігає котирування, ціни та інші відповідні набори даних
  • Менеджер секретів AWS – Зберігає та керує ключами для підпису хешів (дайджест повідомлень)

Хоча це рішення використовує Amazon Redshift як сховище даних, подібний підхід можна реалізувати з будь-якою базою даних, яка підтримує створення визначених користувачем функцій (UDF), які можуть викликати Lambda.

На наступному малюнку показано робочий процес для виконання зворотного запису з QuickSight.

Першим кроком у рішенні є створення хешу або дайджесту повідомлення набору атрибутів у Amazon Redshift за допомогою функції Lambda. Цей крок запобігає підробці запиту. Щоб створити хеш, Amazon Redshift викликає a скаляр Лямбда UDF. Використаний тут механізм хешування є популярним ПЛІНКА2 функція (доступна в бібліотеці Python хешліб). Щоб додатково захистити хеш, використовується хешування з ключем, яке є швидшою та простішою альтернативою код автентифікації повідомлення на основі хешу (HMAC). Цей ключ створюється та зберігається диспетчером секретів і має бути доступним лише для дозволених програм. Після створення захищеного хешу він повертається в Amazon Redshift і об’єднується в поданні Amazon Redshift.

Записування згенерованої цитати назад до Amazon Redshift виконується функцією зворотного запису Lambda, а кінцева точка API REST API Gateway створюється для захисту та передачі запитів функції зворотного запису. Функція зворотного запису виконує такі дії:

  1. Згенеруйте хеш на основі вхідних параметрів API, отриманих від QuickSight.
  2. Підпишіть хеш, застосувавши ключ із диспетчера секретів.
  3. Порівняйте згенерований хеш із хешем, отриманим із вхідних параметрів, використовуючи метод compare_digest, доступний у HMAC модуль
  4. Після успішної перевірки запишіть запис у таблицю подання пропозицій в Amazon Redshift.

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

Згенеруйте хеш

Хеш генерується за допомогою Lambda UDF в Amazon Redshift. Крім того, для підпису хешу використовується ключ диспетчера секретів. Щоб створити хеш, виконайте такі кроки:

  1. Створіть ключ диспетчера секретів із Інтерфейс командного рядка AWS (AWS CLI):
aws secretsmanager create-secret --name “name_of_secret” --description "Secret key to sign hash" --secret-string '{" name_of_key ":"value"}' --region us-east-1

  1. Створіть Lambda UDF, щоб створити хеш для шифрування:
import boto3 import base64
import json
from hashlib import blake2b
from botocore.exceptions import ClientError def get_secret(): #This key is used by the Lambda function to further secure the hash. secret_name = "<name_of_secret>" region_name = "<aws_region_name>" # Create a Secrets Manager client session = boto3.session.Session() client = session.client(service_name='secretsmanager', region_name=<aws_region_name> ) # In this sample we only handle the specific exceptions for the 'GetSecretValue' API. # See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html # We rethrow the exception by default. try: get_secret_value_response = client.get_secret_value(SecretId=secret_name) except Exception as e: raise e if "SecretString" in get_secret_value_response: access_token = get_secret_value_response["SecretString"] else: access_token = get_secret_value_response["SecretBinary"] return json.loads(access_token)[<token key name>] SECRET_KEY = get_secret()
AUTH_SIZE = 16 def sign(payload): h = blake2b(digest_size=AUTH_SIZE, key=SECRET_KEY) h.update(payload) return h.hexdigest().encode('utf-8') def lambda_handler(event, context):
ret = dict() try: res = [] for argument in event['arguments']: try: msg = json.dumps(argument) signed_key = sign(str.encode(msg)) res.append(signed_key.decode('utf-8')) except: res.append(None) ret['success'] = True ret['results'] = res except Exception as e: ret['success'] = False ret['error_msg'] = str(e) return json.dumps(ret)

  1. Визначте UDF Amazon Redshift для виклику функції Lambda для створення хешу:
CREATE OR REPLACE EXTERNAL FUNCTION udf_get_digest (par1 varchar)
RETURNS varchar STABLE
LAMBDA 'redshift_get_digest'
IAM_ROLE 'arn:aws:iam::<AWSACCOUNTID>role/service-role/<role_name>';

Команда Управління ідентифікацією та доступом AWS Роль (IAM) на попередньому кроці повинна мати наведену нижче політику, щоб мати можливість викликати функцію Lambda:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:<AWSACCOUNTID>1:function:redshift_get_digest" }
}

  1. Отримайте ключ у менеджера секретів.

Цей ключ використовується функцією лямбда для додаткового захисту хешу. Про це вказано в get_secret функцію на кроці 2.

Налаштуйте набори даних Amazon Redshift у QuickSight

На інформаційній панелі генерації пропозицій використовується наступне подання Amazon Redshift.

Створіть подання Amazon Redshift, яке використовує всі попередні стовпці разом із стовпцем хешу:

create view quote_gen_vw as select *, udf_get_digest ( customername || BGCheckRequired || Skill|| Shift ||State ||Cost ) from billing_input_tbl

Записи виглядатимуть так, як на скріншоті нижче.

Попереднє подання використовуватиметься як набір даних QuickSight для генерації котирувань. За допомогою набору даних буде створено аналіз QuickSight. Для аналізу майже в реальному часі ви можете використовувати режим прямого запиту QuickSight.

Створення ресурсів API Gateway

Операція зворотного запису ініціюється QuickSight, викликаючи ресурс API Gateway, який викликає функцію зворотного запису Lambda. Як передумова для створення обчислюваного поля в QuickSight для виклику API зворотного запису, ви повинні спочатку створити ці ресурси.

Шлюз API захищає та викликає функцію лямбда-запису з параметрами, створеними як параметри рядка запиту URL-адреси з шаблонами зіставлення. Параметрів зіставлення можна уникнути за допомогою інтеграції проксі-сервера Lambda.

Створіть ресурс REST API типу методу GET, який використовує лямбда-функції (створені на наступному кроці) як тип інтеграції. Інструкції див Створення REST API в Amazon API Gateway та Налаштуйте інтеграцію Lambda в API Gateway.

На наступному знімку екрана показано деталі створення параметра рядка запиту для кожного параметра, переданого до API Gateway.

На наступному знімку екрана показано деталі створення параметра шаблону зіставлення для кожного параметра, переданого до API Gateway.

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

Створіть нову лямбда-функцію для виклику шлюзу API. Функція Лямбда виконує такі дії:

  1. Отримувати параметри від QuickSight через API Gateway і хешувати об’єднані параметри.

Наведений нижче приклад коду отримує параметри з виклику API Gateway за допомогою об’єкта події функції Lambda:

 customer= event['customer’]) bgc = event['bgc']

Функція виконує логіку хешування, як показано в створити хеш кроком раніше, використовуючи об’єднані параметри, передані QuickSight.

  1. Порівняйте хешований вихід із хеш-параметром.

Якщо вони не збігаються, зворотний запис не відбудеться.

  1. Якщо хеші збігаються, виконайте зворотний запис. Перевірте наявність запису в таблиці генерації котирувань, сформувавши запит із таблиці за допомогою параметрів, переданих із QuickSight:
query_str = "select * From tbquote where cust = '" + cust + "' and bgc = '" + bgc +"'" +" and skilledtrades = '" + skilledtrades + "' and shift = '" +shift + "' and jobdutydescription ='" + jobdutydescription + "'"

  1. За результатами запиту виконайте наступну дію:
    1. Якщо для попередньої комбінації не існує запису, згенеруйте та запустіть запит на вставку, використовуючи всі параметри зі статусом, як згенеровано.
    2. Якщо існує запис для попередньої комбінації, згенеруйте та запустіть запит на вставку зі статусом як у перегляді. quote_Id для існуючої комбінації буде використано повторно.

Створіть візуал QuickSight

Цей крок передбачає створення візуалізації таблиці, яка використовує обчислюване поле для передачі параметрів до API Gateway і виклику попередньої функції Lambda.

  1. Додайте обчислюване поле QuickSight під назвою Generate Quote, щоб зберігати URL-адресу, розміщену на шлюзі API, яка буде ініційована для запису історії котирувань в Amazon Redshift:
concat("https://xxxxx.execute-api.us-east-1.amazonaws.com/stage_name/apiresourcename/?cust=",customername,"&bgc=",bgcheckrequired,"&billrate=",toString(billrate),"&skilledtrades=",skilledtrades,"&shift=",shift,"&jobdutydescription=",jobdutydescription,"&hash=",hashvalue)

  1. Створіть візуал таблиці QuickSight.
  2. Додайте обов’язкові поля, такі як Клієнт, Навички та Вартість.
  3. Додайте обчислюване поле «Створити пропозицію» та оформіть його як гіперпосилання.

Якщо вибрати це посилання, запис буде записано в Amazon Redshift. Це стосується того самого хеш-значення, яке повертається, коли лямбда-функція виконує хешування параметрів.

На наступному знімку екрана показано приклад візуалізації таблиці.

Записати в базу даних Amazon Redshift

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

Наступна таблиця Amazon Redshift фіксуватиме історію котирувань, заповнену функцією лямбда. Записи, виділені зеленим кольором, представляють останні записи для цитати.

Міркування та наступні кроки

Використання захищених хешів запобігає підробці параметрів корисного навантаження, які відображаються у вікні браузера під час виклику URL-адреси зворотного запису. Щоб додатково захистити URL-адресу зворотного запису, ви можете застосувати такі методи:

  • Розгорніть REST API у приватному VPC, доступному лише для користувачів QuickSight.
  • Щоб запобігти атакам повторного відтворення, разом із функцією хешування можна створити мітку часу та передати її як додатковий параметр у URL-адресі зворотного запису. Потім можна модифікувати бекенд-функцію Lambda, щоб дозволити зворотний запис лише протягом певного порогового значення на основі часу.
  • Слідкуйте за шлюзом API управління доступом та безпеку Кращі практики.
  • Пом'якшити потенційна відмова в обслуговуванні для загальнодоступних API.

Ви можете додатково покращити це рішення, щоб відтворити веб-форму, коли відкривається URL-адреса зворотного запису. Це можна реалізувати шляхом динамічного створення HTML-форми у серверній функції Lambda для підтримки введення додаткової інформації. Якщо ваше робоче навантаження вимагає великої кількості зворотних записів, які вимагають вищої пропускної здатності або паралельності, спеціально створене сховище даних, наприклад Редакція Amazon Aurora, сумісна з PostgreSQL може бути кращим вибором. Для отримання додаткової інформації див Виклик функції AWS Lambda з кластера Aurora PostgreSQL DB. Потім ці оновлення можна синхронізувати в таблиці Amazon Redshift за допомогою федеративні запити.

Висновок

У цьому дописі показано, як використовувати QuickSight разом із Lambda, API Gateway, Secrets Manager і Amazon Redshift для збору введених користувачами даних і безпечного оновлення сховища даних Amazon Redshift, не виходячи з середовища QuickSight BI. Це рішення усуває необхідність створювати зовнішню програму або інтерфейс користувача для оновлення бази даних або операцій вставки, а також зменшує пов’язані витрати на розробку та обслуговування. Виклик шлюзу API також можна захистити за допомогою ключа або маркера, щоб гарантувати, що шлюз API приймає лише виклики, що надходять із QuickSight. Про це йтиметься в наступних публікаціях.


Про авторів

Шрікант Бахеті є спеціалізованим світовим головним архітектором рішень для Amazon QuickSight. Він розпочав свою кар’єру консультантом і працював у багатьох приватних та державних організаціях. Пізніше він працював у PerkinElmer Health and Sciences & eResearch Technology Inc, де відповідав за проектування та розробку веб-додатків із високим трафіком, високомасштабованих і підтримуваних конвеєрів даних для платформ звітності з використанням служб AWS і безсерверних обчислень.

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

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

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