이번 실습 에서는 API Gateway, Lambda를 이용해서 Aurora에 저장된 데이터를 가져오는 실습을 진행할 예정입니다.
CloudFormation은 사용하면 텍스트 파일 또는 프로그래밍 언어로 전체 인프라와 애플리케이션 리소스를 모델링할 수 있습니다. 이를 통하여 VPC 및 Aurora Serverless몇 번의 클릭 만으로 구성 할 수 있습니다.
CloudFormation으로 Aurora Serverless를 프로비져닝 하였습니다. Query Editor를 이용하여 Sample Query를 수행합니다. 그리고 집계 테이블을 가져오기 위한 Glue ETL 작업을 수행하기 전에 Aurora에 테이블을 생성 합니다.
select * from information_schema.tables;
7. 테스트 하기 위한 간단한 테이블을 생성합니다. 아래 쿼리를 수행 후
실행
버튼을 누릅니다.
실행 후 Status가 성공 인지 확인 합니다.
CREATE TABLE user_table(name VARCHAR(255), role VARCHAR(255));
INSERT INTO user_table(name, role) VALUES('abc', 'admin');
INSERT INTO user_table(name, role) VALUES('def', 'operator');
Aurora에 저장된 데이터를 가지고 올 수 있는 AWS Lambda 함수를 생성합니다.
import boto3
import json
# Update your cluster and secret ARNs
cluster_arn = '<arn:aws:rds:us-east-1:~>'
secret_arn = '<arn:aws:secretsmanager:~>'
def lambda_handler(event, context):
operation = event['operation']
if 'get' == operation:
queryResult = get_rds_data_api()
elif 'para' == operation:
queryResult = get_para_rds_data_api(event['payload']['role'])
return queryResult
def get_rds_data_api():
rds_data = boto3.client('rds-data')
sql = """
SELECT * FROM user_table
"""
response = rds_data.execute_statement(
resourceArn = cluster_arn,
secretArn = secret_arn,
database = 'mydb',
sql = sql)
return response
def get_para_rds_data_api(payload):
rds_data = boto3.client('rds-data')
sql = """
SELECT * FROM user_table where role = :para1
"""
message_value = payload
para1 = [{'name':'para1', 'value':{'stringValue': f'{message_value}'}}]
response = rds_data.execute_statement(
resourceArn = cluster_arn,
secretArn = secret_arn,
database = 'mydb',
sql = sql,
parameters = para1)
return response
5. 수행시간이 긴 Query 를 위해 Lambda 수행 제한시간을 1분으로 늘려 줍니다. 하단의 기본 설정 에 편집을 선택 합니다
6. 제한 시간을 1 분으로 변경하고,
저장
버튼을 누릅니다.
7. Lambda가 Aurora를 접속 할 수 있도록, 실행 권한을 부여합니다.
8. 우측 상단에 권한 탭을 선택 후, 역할 이름 아래 있는 링크를 클릭 합니다.
9. IAM 콘솔로 리다이렉트 됩니다.
정책 연결
버튼을 누릅니다.
10. AmazonRDSDataFullAccess 정책을 검색한 후
정책 연결
버튼을 누릅니다.
REST API Request가 들어오면 이전에 생성한 Lambda 함수를 실행하는 API를 생성합니다
{
"operation": "get"
}
{
"operation": "para",
"payload":
{
"role": "admin"
}
}
실습1, 2가 모두 완료 되었습니다, 수고하셨습니다.