Выполняйте безопасную обратную запись в базу данных с помощью Amazon QuickSight.

Выполняйте безопасную обратную запись в базу данных с помощью Amazon QuickSight.

Исходный узел: 2641420

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

Обратная запись — это возможность обновлять витрину данных, хранилище данных или любую другую серверную часть базы данных из панелей мониторинга BI и анализировать обновленные данные практически в реальном времени на самой панели мониторинга. В этом посте мы покажем, как выполнять безопасную обратную запись базы данных с помощью QuickSight.

Обзор вариантов использования

Чтобы продемонстрировать, как включить возможность обратной записи с помощью QuickSight, давайте рассмотрим вымышленную компанию AnyCompany Inc. AnyCompany — это фирма, предоставляющая профессиональные услуги, которая специализируется на предоставлении кадровых решений своим клиентам. AnyCompany определила, что запуск рабочих нагрузок в облаке для поддержки растущих глобальных бизнес-потребностей является конкурентным преимуществом, и использует облако для размещения всех своих рабочих нагрузок. AnyCompany решила улучшить способ, которым ее филиалы предоставляют котировки своим клиентам. В настоящее время филиалы генерируют расценки клиентов вручную, и в качестве первого шага на этом инновационном пути AnyCompany стремится разработать корпоративное решение для генерации расценок клиентов с возможностью динамического применения данных о местных ценах во время формирования расценок.

В настоящее время AnyCompany использует Амазонка Redshift в качестве платформы корпоративного хранилища данных и QuickSight в качестве решения для бизнес-аналитики.

Создание нового решения связано со следующими проблемами:

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

В этом посте описываются шаги, необходимые для включения функции обратной записи в Amazon Redshift из QuickSight. Обратите внимание, что традиционные инструменты бизнес-аналитики доступны только для чтения и практически не имеют возможности обновлять исходные данные.

Обзор решения

В этом решении используются следующие сервисы AWS:

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

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

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

Первым шагом решения является создание хэша или дайджеста сообщения набора атрибутов в Amazon Redshift путем вызова функции Lambda. Этот шаг предотвращает подделку запроса. Для создания хэша Amazon Redshift вызывает скалярная лямбда-определяемая функция. Используемый здесь механизм хеширования является популярным БЛЕЙК2 функция (доступна в библиотеке Python хэшлиб). Для дополнительной защиты хэша используется хеширование с ключом, которое является более быстрой и простой альтернативой код аутентификации сообщения на основе хэша (ХМАК). Этот ключ создается и хранится диспетчером секретов и должен быть доступен только разрешенным приложениям. После создания безопасного хэша он возвращается в Amazon Redshift и объединяется в представлении Amazon Redshift.

Запись сгенерированной котировки обратно в Amazon Redshift выполняется функцией обратной записи Lambda, а конечная точка REST API шлюза API создается для защиты и передачи запросов функции обратной записи. Функция обратной записи выполняет следующие действия:

  1. Сгенерируйте хэш на основе входных параметров API, полученных от QuickSight.
  2. Подпишите хэш, применив ключ из Secrets Manager.
  3. Сравните сгенерированный хэш с хешем, полученным из входных параметров, с помощью метода compare_digest, доступного в HMAC модуль.
  4. После успешной проверки запишите запись в таблицу отправки котировок в Amazon Redshift.

В следующем разделе представлены подробные шаги с примерами полезной нагрузки и фрагментами кода.

Сгенерировать хэш

Хэш создается с помощью UDF Lambda в Amazon Redshift. Кроме того, ключ Secrets Manager используется для подписи хэша. Чтобы создать хэш, выполните следующие действия:

  1. Создайте ключ диспетчера секретов из Интерфейс командной строки AWS (интерфейс командной строки AWS):
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. Создайте UDF Lambda для генерации хэша для шифрования:
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. Определите пользовательскую функцию 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. Получите ключ от Secrets Manager.

Этот ключ используется функцией Lambda для дополнительной защиты хэша. Это указано в 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

Операция обратной записи инициируется QuickSight, вызывающим ресурс шлюза API, который вызывает функцию обратной записи Lambda. В качестве предварительного условия для создания вычисляемого поля в QuickSight для вызова API обратной записи необходимо сначала создать эти ресурсы.

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

Создайте ресурс REST API с типом метода GET, который использует функции Lambda (созданные на следующем шаге) в качестве типа интеграции. Инструкции см. Создание REST API в Amazon API Gateway и Настройте интеграцию Lambda в API Gateway.

На следующем снимке экрана показаны сведения о создании параметра строки запроса для каждого параметра, передаваемого в шлюз API.

На следующем снимке экрана показаны сведения о создании параметра шаблона сопоставления для каждого параметра, передаваемого в шлюз API.

Создайте лямбда-функцию

Создайте новую функцию Lambda для вызова шлюзом API. Функция Lambda выполняет следующие шаги:

  1. Получите параметры от QuickSight через шлюз API и хэшируйте объединенные параметры.

В следующем примере кода параметры извлекаются из вызова шлюза API с помощью объекта события функции Lambda:

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

Функция выполняет логику хеширования, как показано на создать хэш на шаг раньше, используя объединенные параметры, переданные QuickSight.

  1. Сравните хешированный вывод с параметром hash.

Если они не совпадают, обратной записи не произойдет.

  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 и вызывает предыдущую функцию 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

Ключ Secrets Manager извлекается и используется функцией Lambda для создания хэша для сравнения. Обратная запись будет выполнена только в том случае, если хеш совпадает с хешем, переданным в параметре.

В следующей таблице Amazon Redshift будет сохранена история котировок, заполненная функцией Lambda. Записи, выделенные зеленым цветом, представляют самые последние записи для цитаты.

Соображения и следующие шаги

Использование безопасных хэшей предотвращает подделку параметров полезных данных, которые отображаются в окне браузера при вызове URL-адреса обратной записи. Чтобы дополнительно защитить URL-адрес обратной записи, вы можете использовать следующие методы:

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

Вы можете дополнительно улучшить это решение, чтобы отображать веб-форму при открытии URL-адреса обратной записи. Это может быть реализовано путем динамического создания HTML-формы в бэкэнд-функции Lambda для поддержки ввода дополнительной информации. Если ваша рабочая нагрузка требует большого количества операций обратной записи, требующих более высокой пропускной способности или параллелизма, специально созданное хранилище данных, такое как Версия, совместимая с Amazon Aurora PostgreSQL может быть лучшим выбором. Для получения дополнительной информации см. Вызов функции AWS Lambda из кластера БД Aurora PostgreSQL. Затем эти обновления можно синхронизировать с таблицами 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 Большие данные