Amazon QuickSight로 안전한 데이터베이스 쓰기 저장 수행

Amazon QuickSight로 안전한 데이터베이스 쓰기 저장 수행

소스 노드 : 2641420

아마존 퀵 사이트 확장 가능한 서버리스 머신 러닝(ML) 기반 비즈니스 인텔리전스(BI) 솔루션으로 데이터에 쉽게 연결하고, 대화형 대시보드를 생성하고, ML 지원 인사이트에 액세스하고, 시각적 개체 및 대시보드를 수만 명과 공유할 수 있습니다. QuickSight 자체 내에서 또는 모든 애플리케이션에 내장된 내부 및 외부 사용자.

쓰기 저장은 BI 대시보드 내에서 데이터 마트, 데이터 웨어하우스 또는 기타 데이터베이스 백엔드를 업데이트하고 업데이트된 데이터를 대시보드 자체 내에서 거의 실시간으로 분석하는 기능입니다. 이 게시물에서는 QuickSight를 사용하여 안전한 데이터베이스 쓰기 저장을 수행하는 방법을 보여줍니다.

사용 사례 개요

QuickSight로 다시 쓰기 기능을 활성화하는 방법을 보여주기 위해 가상의 회사인 AnyCompany Inc를 가정해 보겠습니다. AnyCompany는 고객에게 인력 솔루션을 전문적으로 제공하는 전문 서비스 회사입니다. AnyCompany는 증가하는 글로벌 비즈니스 요구 사항을 지원하기 위해 클라우드에서 워크로드를 실행하는 것이 경쟁 우위를 점하고 클라우드를 사용하여 모든 워크로드를 호스팅한다고 판단했습니다. AnyCompany는 지점에서 고객에게 견적을 제공하는 방식을 개선하기로 결정했습니다. 현재 지사는 고객 견적을 수동으로 생성하고 있으며, 이 혁신 여정의 첫 번째 단계로 AnyCompany는 견적 생성 시 현지 가격 데이터를 동적으로 적용할 수 있는 기능을 갖춘 고객 견적 생성을 위한 엔터프라이즈 솔루션을 개발하려고 합니다.

현재 AnyCompany에서 사용하는 아마존 레드 시프트 엔터프라이즈 데이터 웨어하우스 플랫폼으로, 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>';

XNUMXD덴탈의 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단계의 기능.

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 게이트웨이 리소스 생성

쓰기 되돌림 작업은 Lambda 쓰기 되돌림 기능을 호출하는 API 게이트웨이 리소스를 호출하는 QuickSight에 의해 시작됩니다. 쓰기 되돌림 API를 호출하기 위해 QuickSight에서 계산된 필드를 생성하기 위한 전제 조건으로 먼저 이러한 리소스를 생성해야 합니다.

API Gateway는 매핑 템플릿을 사용하여 URL 쿼리 문자열 매개변수로 생성된 매개변수를 사용하여 쓰기 되돌림 Lambda 함수를 보호하고 호출합니다. Lambda 프록시 통합을 사용하면 매핑 매개변수를 피할 수 있습니다.

Lambda 함수(다음 단계에서 생성됨)를 통합 유형으로 사용하는 메서드 유형 GET의 REST API 리소스를 생성합니다. 지침은 다음을 참조하십시오. Amazon API Gateway에서 REST API 생성API Gateway에서 Lambda 통합 설정.

다음 스크린샷은 API Gateway에 전달되는 각 파라미터에 대한 쿼리 문자열 파라미터 생성에 대한 세부 정보를 보여줍니다.

다음 스크린샷은 API Gateway에 전달된 각 파라미터에 대한 매핑 템플릿 파라미터 생성에 대한 세부 정보를 보여줍니다.

Lambda 함수 생성

API Gateway가 호출할 새 Lambda 함수를 생성합니다. Lambda 함수는 다음 단계를 수행합니다.

  1. API 게이트웨이를 통해 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. 견적 내역을 Amazon Redshift에 다시 쓰기 위해 트리거될 API Gateway 호스팅 URL을 보관할 견적 생성이라는 QuickSight 계산 필드를 추가합니다.
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이 열릴 때 웹 기반 양식을 렌더링하도록 이 솔루션을 더욱 향상시킬 수 있습니다. 이는 추가 정보 입력을 지원하기 위해 백엔드 Lambda 함수에서 HTML 양식을 동적으로 생성하여 구현할 수 있습니다. 워크로드에 더 높은 처리량 또는 동시성이 필요한 많은 수의 쓰기 되돌림이 필요한 경우 다음과 같은 목적으로 구축된 데이터 저장소 Amazon Aurora PostgreSQL 호환 에디션 더 나은 선택이 될 수 있습니다. 자세한 내용은 다음을 참조하십시오. Aurora PostgreSQL DB 클러스터에서 AWS Lambda 함수 호출. 그런 다음 이러한 업데이트를 다음을 사용하여 Amazon Redshift 테이블로 동기화할 수 있습니다. 연합 쿼리.

결론

이 게시물에서는 Lambda, API Gateway, Secrets Manager 및 Amazon Redshift와 함께 QuickSight를 사용하여 QuickSight BI 환경을 벗어나지 않고 사용자 입력 데이터를 캡처하고 Amazon Redshift 데이터 웨어하우스를 안전하게 업데이트하는 방법을 보여주었습니다. 이 솔루션은 데이터베이스 업데이트 또는 삽입 작업을 위한 외부 애플리케이션 또는 사용자 인터페이스를 생성할 필요가 없으며 관련 개발 및 유지 관리 오버헤드를 줄입니다. QuickSight에서 발생하는 호출만 API Gateway에서 수락하도록 하기 위해 키 또는 토큰을 사용하여 API Gateway 호출을 보호할 수도 있습니다. 이에 대해서는 후속 게시물에서 다룰 예정입니다.


저자에 관하여

스리칸트 바헤티 Amazon QuickSight의 전문 월드 와이드 수석 솔루션 아키텍트입니다. 그는 컨설턴트로 경력을 시작했으며 여러 민간 및 정부 기관에서 근무했습니다. 나중에 그는 PerkinElmer Health and Sciences & eResearch Technology Inc에서 일하면서 트래픽이 많은 웹 애플리케이션, AWS 서비스 및 서버리스 컴퓨팅을 사용하는 보고 플랫폼을 위한 고도로 확장 가능하고 유지 관리 가능한 데이터 파이프라인의 설계 및 개발을 담당했습니다.

라지 시바수브라마니암 분석에 중점을 둔 AWS의 수석 솔루션 설계자입니다. Raji는 전 세계 Fortune 500대 기업 및 Fortune 100대 기업을 위한 종단 간 엔터프라이즈 데이터 관리, 비즈니스 인텔리전스 및 분석 솔루션 설계를 전문으로 합니다. 그녀는 관리 시장, 의사 타겟팅 및 환자 분석을 비롯한 다양한 의료 데이터 세트를 통해 통합 의료 데이터 및 분석에 대한 심층적인 경험을 보유하고 있습니다.

타임 스탬프 :

더보기 AWS 빅 데이터