Amazon QuickSight を使用して安全なデータベース ライトバックを実行する

Amazon QuickSight を使用して安全なデータベース ライトバックを実行する

ソースノード: 2641420

アマゾンクイックサイト は、スケーラブルでサーバーレスの機械学習 (ML) を活用したビジネス インテリジェンス (BI) ソリューションであり、データへの接続、インタラクティブなダッシュボードの作成、ML 対応の分析情報へのアクセス、数万人とのビジュアルやダッシュボードの共有が簡単になります。 QuickSight 自体内、またはアプリケーションに組み込まれた内部および外部ユーザーのいずれかです。

ライトバックは、BI ダッシュボード内からデータ マート、データ ウェアハウス、またはその他のデータベース バックエンドを更新し、更新されたデータをダッシュ​​ボード自体内でほぼリアルタイムで分析できる機能です。 この記事では、QuickSight を使用して安全なデータベース ライトバックを実行する方法を説明します。

ユースケースの概要

QuickSight でライトバック機能を有効にする方法を示すために、AnyCompany Inc という架空の会社を考えてみましょう。AnyCompany は、顧客に従業員ソリューションを提供することに特化したプロフェッショナル サービス会社です。 AnyCompany は、増大するグローバル ビジネス ニーズをサポートするためにクラウドでワークロードを実行することが競争上の利点であると判断し、クラウドを使用してすべてのワークロードをホストしています。 AnyCompany は、支店が顧客に見積もりを提供する方法を強化することを決定しました。 現在、各支店は顧客見積を手動で生成していますが、このイノベーションへの取り組みの最初のステップとして、AnyCompany は見積生成時にローカル価格データを動的に適用する機能を備えた顧客見積生成用のエンタープライズ ソリューションの開発を検討しています。

AnyCompany が現在使用している Amazonレッドシフト エンタープライズ データ ウェアハウス プラットフォームとして、QuickSight を BI ソリューションとして使用します。

新しいソリューションを構築するには、次のような課題が伴います。

  • AnyCompany は、構築と保守が簡単なソリューションを望んでおり、個別のユーザー インターフェイスの構築に投資したくありません。
  • AnyCompany は、既存の QuickSight BI ダッシュボードの機能を拡張して、見積の生成と見積の受け入れも可能にしたいと考えています。 従業員はすでに QuickSight ダッシュボードを使用しており、QuickSight が提供する使いやすいインターフェイスを享受しているため、これにより機能の展開が簡素化されます。
  • AnyCompany は、生成、レビュー、承認された見積を含む見積交渉履歴を保存したいと考えています。
  • AnyCompany は、分析とビジネスの洞察のために見積履歴データを備えた新しいダッシュボードを構築したいと考えています。

この投稿では、QuickSight から Amazon Redshift へのライトバック機能を有効にする手順について説明します。 従来の BI ツールは読み取り専用で、ソース データを更新するオプションがほとんど、またはまったくないことに注意してください。

ソリューションの概要

このソリューションでは、次の AWS サービスを使用します。

このソリューションではデータ ストアとして Amazon Redshift を使用しますが、Lambda を呼び出すことができるユーザー定義関数 (UDF) の作成をサポートする任意のデータベースで同様のアプローチを実装できます。

次の図は、QuickSight からライトバックを実行するワークフローを示しています。

ソリューションの最初のステップは、Lambda 関数を呼び出して、Amazon Redshift の一連の属性のハッシュまたはメッセージ ダイジェストを生成することです。 このステップにより、リクエストの改ざんが防止されます。 ハッシュを生成するために、Amazon Redshift は スカラー ラムダ UDF。 ここで使用されるハッシュ メカニズムは一般的なものです。 ブレイク2 関数 (Python ライブラリで利用可能) ハッシュライブラリ)。 ハッシュをさらに安全にするために、キー付きハッシュが使用されます。これは、より高速かつ簡単な代替手段です。 ハッシュベースのメッセージ認証コード (HMAC)。 このキーは Secrets Manager によって生成および保存され、許可されたアプリケーションのみがアクセスできるようにする必要があります。 安全なハッシュが生成された後、Amazon Redshift に返され、Amazon Redshift ビューで結合されます。

生成された見積もりの​​ Amazon Redshift への書き込みは、ライトバック Lambda 関数によって実行され、API Gateway REST API エンドポイントが作成され、リクエストを保護してライトバック関数に渡します。 ライトバック機能は次のアクションを実行します。

  1. QuickSight から受け取った API 入力パラメータに基づいてハッシュを生成します。
  2. Secrets Manager からキーを適用してハッシュに署名します。
  3. で利用可能なcompare_digestメソッドを使用して、生成されたハッシュを入力パラメータから受け取ったハッシュと比較します。 HMAC モジュールを開きます。
  4. 検証が成功したら、Amazon Redshift の見積もり送信テーブルにレコードを書き込みます。

次のセクションでは、サンプル ペイロードとコード スニペットを使用して詳細な手順を説明します。

ハッシュを生成する

ハッシュは、Amazon Redshift の Lambda UDF を使用して生成されます。 さらに、ハッシュの署名には Secrets Manager キーが使用されます。 ハッシュを作成するには、次の手順を実行します。

  1. Secrets Manager キーを次から作成します。 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. Lambda 関数を呼び出してハッシュを作成するように Amazon Redshift UDF を定義します。
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 IDおよびアクセス管理 Lambda 関数を呼び出せるようにするには、前のステップの (IAM) ロールに次のポリシーをアタッチする必要があります。

{ "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 の機能。

QuickSight で Amazon Redshift データセットをセットアップする

見積生成ダッシュボードは、次の 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 Gateway リソースを呼び出すことによって開始され、Lambda ライトバック関数が呼び出されます。 QuickSight で計算フィールドを作成してライトバック API を呼び出すための前提条件として、まずこれらのリソースを作成する必要があります。

API Gateway は、マッピング テンプレートを使用して URL クエリ文字列パラメータとして作成されたパラメータを使用してライトバック Lambda 関数を保護し、呼び出します。 マッピングパラメータは、Lambda プロキシ統合を使用することで回避できます。

Lambda 関数 (次のステップで作成) を統合タイプとして使用する、メソッド タイプ GET の REST API リソースを作成します。 手順については、を参照してください。 Amazon API Gateway での REST API の作成 および API Gateway で Lambda 統合をセットアップする.

次のスクリーンショットは、API ゲートウェイに渡される各パラメーターのクエリ文字列パラメーターを作成する詳細を示しています。

次のスクリーンショットは、API ゲートウェイに渡される各パラメーターのマッピング テンプレート パラメーターを作成する詳細を示しています。

Lambda関数を作成する

API Gateway が呼び出す新しい Lambda 関数を作成します。 Lambda 関数は次の手順を実行します。

  1. API Gateway を介して QuickSight からパラメータを受信し、連結されたパラメータをハッシュします。

次のコード例では、Lambda 関数のイベント オブジェクトを使用して API Gateway 呼び出しからパラメータを取得します。

 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. Generate Quote という名前の QuickSight 計算フィールドを追加して、Amazon Redshift に見積もり履歴を書き戻すためにトリガーされる API Gateway でホストされる URL を保持します。
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. 「Generate Quote」計算フィールドを追加し、これをハイパーリンクとしてスタイル設定します。

このリンクを選択すると、レコードが Amazon Redshift に書き込まれます。 これは、Lambda 関数がパラメータのハッシュを実行するときに返される同じハッシュ値に影響します。

次のスクリーンショットは、サンプル テーブルのビジュアルを示しています。

Amazon Redshift データベースへの書き込み

Secrets Manager キーは Lambda 関数によって取得され、比較用のハッシュを生成するために使用されます。 ライトバックは、ハッシュがパラメータで渡されたハッシュと一致する場合にのみ実行されます。

次の Amazon Redshift テーブルは、Lambda 関数によって入力された見積もり履歴をキャプチャします。 緑色のレコードは、見積の最新のレコードを表します。

考慮事項と次のステップ

安全なハッシュを使用すると、ライトバック URL が呼び出されたときにブラウザ ウィンドウに表示されるペイロード パラメータの改ざんが防止されます。 ライトバック URL のセキュリティをさらに強化するには、次の手法を使用できます。

  • QuickSight ユーザーのみがアクセスできるプライベート VPC に REST API をデプロイします。
  • リプレイ攻撃を防ぐために、ハッシュ関数とともにタイムスタンプを生成し、ライトバック URL の追加パラメータとして渡すことができます。 その後、特定の時間ベースのしきい値内でのみライトバックを許可するようにバックエンド Lambda 関数を変更できます。
  • APIゲートウェイに従ってください アクセス制御 および セキュリティ ベストプラクティス。
  • 軽減する 公開 API に対するサービス拒否の可能性。

このソリューションをさらに拡張して、ライトバック URL が開かれたときに Web ベースのフォームをレンダリングすることができます。 これは、追加情報の入力をサポートするバックエンド Lambda 関数で HTML フォームを動的に生成することで実装できます。 ワークロードで、より高いスループットまたは同時実行性を必要とする多数のライトバックが必要な場合は、次のような専用のデータ ストアを使用します。 AmazonAuroraPostgreSQL互換版 より良い選択かもしれません。 詳細については、以下を参照してください。 Aurora PostgreSQL DB クラスターからの AWS Lambda 関数の呼び出し。 これらの更新は、次を使用して Amazon Redshift テーブルに同期できます。 フェデレーションクエリ.

まとめ

この投稿では、QuickSight を Lambda、API Gateway、Secrets Manager、Amazon Redshift と組み合わせて使用​​して、QuickSight BI 環境を離れることなくユーザー入力データをキャプチャし、Amazon Redshift データ ウェアハウスを安全に更新する方法を説明しました。 このソリューションにより、データベースの更新または挿入操作のために外部アプリケーションやユーザー インターフェイスを作成する必要がなくなり、関連する開発とメンテナンスのオーバーヘッドが削減されます。 API ゲートウェイ呼び出しは、キーまたはトークンを使用して保護し、QuickSight から発信された呼び出しのみが API ゲートウェイによって受け入れられるようにすることもできます。 これについては今後の投稿で説明します。


著者について

スリカントバヘティ Amazon QuickSight の世界規模の専門プリンシパル ソリューション アーキテクトです。 彼はコンサルタントとしてキャリアをスタートし、複数の民間および政府機関で働いていました。 その後、PerkinElmer Health and Sciences & eResearch Technology Inc に勤務し、AWS サービスとサーバーレス コンピューティングを使用したレポート プラットフォーム用の高トラフィック Web アプリケーション、拡張性と保守性の高いデータ パイプラインの設計と開発を担当しました。

ラジ・シバスブラマニアム AWSのシニアソリューションアーキテクトであり、アナリティクスを専門としています。 Rajiは、世界中のFortune500およびFortune100企業向けのエンドツーエンドのエンタープライズデータ管理、ビジネスインテリジェンス、および分析ソリューションの設計を専門としています。 彼女は、管理された市場、医師のターゲティング、患者の分析など、さまざまな医療データセットを使用した統合医療データと分析の深い経験を持っています。

タイムスタンプ:

より多くの AWSビッグデータ