이번 포스팅에서는 Amazon Cloud상에서 위와 같은 구성을 만들고, 위의 구성을 만들면서 API와 DynamoDB 및 Lamda를 통한 인증과 정책 제어 하는 과정의 이해를 돕기 위해 단계별로 진행을 하면서 각 서비스의 개념 및 사용 방법을 익혀 보겠습니다.
오늘의 주요 Skill은 아래와 같습니다.
1. DynamoDB에서 테이블을 생성 및 사용하는 방법
2. Python을 사용하여 DynamoDB 테이블에서 데이터를 읽고 쓰는 Lambda 함수를 코딩하는 방법
3. API Gateway를 생성 및 공개하고 Lambda 함수에 연결 하는 방법
4. Lambda Authorizer를 사용하여 API Gateway 메서드에 인증을 추가 하는 방법
DynamoDB Table 생성하기
우선 아래와 AWS에 서비스 콘솔에서 DynamoDB를 검색 하고 클릭 합니다.
아래 그림과 같이 왼쪽 메뉴에서 테이블을 클릭하고 화면 오른쪽 상단의 테이블 생성을 클릭 합니다.
화면에서 아래와 화면과 같이 값을 입력 합니다.
화면을 드래그 하여 아래로 내려서 글로벌 인덱스를 클릭 합니다.
아래와 같은 값을 입력 하고 인덱스 생성을 클릭 합니다.
그럼 아래 화면에서 테이블 생성을 클릭 합니다.
이제 아래 그림과 같이 DynamoDB 테이블이 생성이 되었습니다.
AWS Lamda 생성하기
우선 AWS Lamda에 대해 간단히 설명을 하면, 서버 프로비저닝, 관리, 워크로드 인식 클러스터 확장 로직 생성, 이벤트 통합 유지, 또는 런타임 관리 없이 코드를 실행할 수 있는 서버가 없는 서비스 입니다.
Lamda는 모든 형태의 어플리케이션과 백엔드 서비스에 대한 코드도 별도 관리 없이 실행 할수 있고, 단지 코드를 업로드만 하면, LamDA가 자동적으로, 인프로 리소스를 할당하고, 모든 트래픽에 대해 이벤트 기반으로 코드를 실행을 합니다.
그럼 이제 Lamda를 생성해 보겠습니다.
우선 DynamoDB 테이블에서 제품을 생성/기록할 함수를 생성하기 위해 AWS 콘솔창에서 Lamda를 검색하고 클릭 합니다.
여기서 함수 생성을 클릭 합니다.
위의 그림과 같이 설정을 하고, 함수 생성을 클릭 합니다.
이제 위와 같이 함수가 생성이 되었습니다. 마우스를 스크롤 하여 코드 부분까지 스크롤 하고 lamda_funtion.py 파일의 내용을 아래의 코드를 붙여 넣습니다.
붙여 넣을 코드는 아래와 같습니다.
import boto3 from datetime import datetime from uuid import uuid4 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('acme_products') def lambda_handler(event, context): date = (datetime.now()).strftime("%Y-%m-%d %H:%M:%S") uuid = uuid4() name = event['name'] if event['name'] else '' visible = event['visible'] if event['visible'] else '0' response = table.put_item( Item={ 'uuid': uuid.hex, 'visible': visible, 'name': name, 'creation_date': date, 'updated_date': date } ) return { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": response } |
이제 아래의 화면과 같이 Deploy를 클릭 합니다.
위의 화면과 같이 Deploy를 틀릭 하고 Deploy가 성공적으로 완료 되었음을 확인 합니다.
이제 Dploy한 함수의 기능을 살펴 보면. 이벤트에서 도착하는 값을 핸들러 함수에 첫 번째 인수로 전달하고,
put_item이라는 DynamboDB SDK 메서드를 호출 후 데이터 생성을 위한 데이터 구조를 전달하는 구조 입니다.
그럼 이제 시험을 위해 아래 화면과 같이 test tab을 클릭 합니다.
그리고 아래 그림 처럼 값들을 입력 하고 테스트 버튼을 클릭 합니다.
JSON Code는 아래와 같습니다. 코드 붙인 후 화면 오른쪽에 있는 JSON 설정 저장을 클릭 합니다.
{ "name": "Some Cool Product Name", "visible": "1" } |
이제 시험을 위해 테스트를 클릭 하면 아래 화면과 같이 테스트가 성공을 했는지 확인을 합니다.
이제 위의 테스트를 통해서 앞서 생성한 DynamoDB에 데이터를 입력 했습니다. 그럼 이제 생성이 되었는지 확인을 해보겠습니다. AWS 콘솔창에서 DynamoDB를 검색해서 클릭을 하고 왼쪽 메뉴에서 테이블을 클릭 합니다.
그럼 위의 그림과 같이 이전에 생성한 테이블이 나타 나는데 해당 테이블을 클릭 하고 표항목 탐색 버튼을 클릭 합니다.
여기서 앞서 테스트를 통해 만든 항목이 보여 집니다.
GET PRODUCT LAMBDA 함수 생성
이제 PUT을 통해 DB에 넣는 Lamda는 생성 했고 반대로 get으로 입력한 데이터를 조회할 Lamda를 만들어 보겠습니다.
AWS 콘솔창에서 Lamda를 검색 하고 클릭 한후 아래 화면에서 함수 생성을 클릭 합니다.
아래 화면과 같이 값을 입력 후 함수 생성을 클릭 합니다.
그럼 이제 아래 화면과 같이 함수가 성공적으로 만들어 졌는지 확인 합니다.
코드 섹션의 코드를 아래의 코드로 변경을 합니다.
import boto3 import json from boto3.dynamodb.conditions import Key dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('acme_products') def lambda_handler(event, context): uuid = event['uuid'] response = table.get_item( Key={ 'uuid': uuid } ) return { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json' }, 'body': json.dumps(response) } |
이제 변경된 코드를 배포하기 위해서 아래 화면에서 처럼 Deploy를 클릭 하고 결과를 확인 합니다.
결과가 성공 하고 나서 테스트 Tab을 클릭 하고 아래 화면과 같이 값을 입력 합니다.
JSON Code는 아래와 같습니다. 다만 uuid는 DynamoDB 테이블의 uuid를 입력 해야 합니다.
{ "uuid": "d432921c045e478baf5f8443af4a425c" } |
그러면 JSON형식 저장 버튼을 누르고, 테스트 버튼을 누르고, 그 결과가 성공 하는지 확인 합니다.
UPDATE PRODUCT LAMBDA 함수 생성
이제 PUT과 GET Lamda는 생성을 완료 하였고, DynamoDB에 저장된 데이터를 업데이트 할수 있는 LamDa 함수를 생성ㅇ해 보겠 습니다.
AWS Console창에서 LamDA를 검색해서 클릭 하고, 함수 생성을 클릭 합니다.
그럼 이제 아래 그림과 같이 값을 입력 후 합수 생성을 클릭 합니다.
아래 그림과 같이 함수가 정상적으로 생성된 것을 확인 하고 Code부분을 아래의 코드로 변경 합니다.
사용할 코드는 아래와 같습니다. 코드를 교체 후 Deploy버튼을 누릅니다.
import boto3 from boto3.dynamodb.conditions import Key from datetime import datetime dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('acme_products') def lambda_handler(event, context): uuid = event['uuid'] name = event['name'] if event['name'] else '' visible = event['visible'] if event['visible'] else '0' response = table.update_item( Key={ 'uuid': uuid }, UpdateExpression='SET #nn=:newName, visible=:newVisible, updated_date=:newUpdatedDate', ExpressionAttributeValues={ ':newName': name, ':newVisible': visible, ':newUpdatedDate': (datetime.now()).strftime("%Y-%m-%d %H:%M:%S") }, ExpressionAttributeNames={ "#nn": "name" }, ReturnValues="UPDATED_NEW" ) return { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": response } |
아래의 화면과 같이 성공했음을 확인 하고 테스트 TAB을 클릭 합니다.
테스트 텝에서 아래와 같이 값을 입력 하고. 코드도 아래의 코드로 수정을 한후 테스트 버튼을 누릅니다.
코드는 아래와 같습니다. uuid는 DynamoDB에서 생성한 테이블의 uuid를 입력 합니다.
{ "uuid": "d432921c045e478baf5f8443af4a425c", "visible": "1", "name": "Some UPDATED Product Name" } |
아래의 화면과 같이 테스트가 성공 되었음을 확인 합니다.
DELETE PRODUCT LAMBDA 함수 생성
이제 CRUD중 마지막인 Delte Lamda 함수를 생성 하도록 하겠습니다.
AWS Console창에서 Lamda를 검색 후 클릭 하고 함수 생성 버튼을 누른 후 아래의 값을 입력 합니다.
함수가 성공적으로 생성되었는지 아래 화면과 같이 확인 한후 코드부분을 아래의 코드로 변경후 Deploy 버튼을 클릭 합니다.
코드는 아래와 같습니다.
import boto3 from boto3.dynamodb.conditions import Key dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('acme_products') def lambda_handler(event, context): uuid = event['uuid'] response = table.delete_item( Key={ 'uuid': uuid } ) return { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": response } |
Deploy가 성공 하고 나서 테스트 텝을 클릭 하고 아래와 같이 설정 및 코드를 입력 후 테스트 버튼을 클릭 합니다.
그럼 이제 아래와 같이 테스트가 성공이 되었는지 확인을 합니다.
LIST PRODUCTS LAMBDA 함수 생성
이제 CREAT, UPDATE, DELETE Lamda에 이어 List를 할수 있는 Lamda를 만들어 보겠습니다.
Lamda에서 함수 생성을 클릭 하고 아래의 값들을 입력 하고 함수 생성을 클릭 합니다..
그럼 이제 정상적으로 생성됨을 확인 하고 코드 부분에 아래의 코드로 변경 후 Depoy버튼을 클릭 합니다.
사용할 코드는 아래와 같습니다.
import boto3 from boto3.dynamodb.conditions import Key dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('acme_products') def lambda_handler(event, context): response = table.query( IndexName= "visible-index", KeyConditionExpression= "visible = :visible", ExpressionAttributeValues= { ":visible": "1" }, ) return { 'statusCode': 200, "headers": { "Content-Type": "application/json" }, 'body': response } |
Deploy가 성공 하고 나서, 테스트 탭을 누르고 아래와 같이 입력 합니다. 입력 후 테스트 버튼을 클릭 합니다.
이제 아래와 같이 성공적으로 생성이 되었는지 확인을 합니다.
이제 필요한 모든 함수를 정의를 하였습니다.
Amazon API Gateway 생성하기.
우선 API에 대해서 간단히 설명을 하면 API는 애플리케이션이 백엔드 서비스의 데이터, 비즈니스 로직 또는 기능에 액세스할 수 있는 ‘정문’ 역할을 합니다.
API Gateway는 트래픽 관리, CORS 지원, 권한 부여 및 액세스 제어, 제한, 모니터링 및 API 버전 관리 등 최대 수십만 개의 동시 API 호출을 수신 및 처리하는 데 관계된 모든 작업을 처리합니다.
이제 API를 생성을 하고 앞서 생성한 Lamda와 연결을 하는 작업을 해보겠습니다.
AWS 콘솔창에서 API를 검색 하고 REST API의 구축(Build)버튼을 클릭 합니다.
아래와 같이 입력 후 API생성을 클릭 합니다.
Protocol은 REST
새 API 생성 클릭
이제 API는 생성이 완료가 되었습니다.
API GATEWAY 리소스 생성
작업 (Action) 버튼을 클릭 하고 리소스 생성 버튼을 클릭 합니다.
아래와 같이 값을 입력 후 리소스 생성 버튼을 클릭 합니다.
이제 리소스는 생성이 되었습니다.
API GATEWAY GET 메서드 생성
RESTful API에서 데이터를 처리하는 적절한 방법은 HTTP 메서드/동사를 사용하여 데이터 작업을 수행하는 것입니다.
그러므로 제품 카탈로그를 처리할 주요 동사(GET, POST, PUT, DELETE)를 생성 하겠습니다.
Product가 선택된 상태에서 작업(Action) 버튼을 클릭 하고 메소드 생성 버튼을 클릭 합니다.
아래 화면 처럼 메소드 중 get을 선택을 합니다.
체크 버튼을 클릭 해서 생성을 합니다.
아래와 같이 값을 선택 및 입력 후 저장 버튼을 클릭 합니다.
이제 아래 그림 처럼 get method가 생성이 완료 되었습니다.
같은 절차를 반복해서 POST, PUT DELETE에 대해서도 생성을 해 줍니다. 네가지의 메소드를 생성을 하고나면 아래와 같은 화면이 됩니다.
이제 생성된 메서드를 테스트를 해보겠습니다. 아래 화면에서 생성된 메소드 get 하나를 선택 하고 빨간 박스의 테스트 버튼을 클릭 합니다.
아래의 화면에서 별도의 인수 필요 없이 테스트 버튼을 클릭 하고 결과를 살펴 보면 됩니다.
다른 메소드들의 테스트는 앞서 API의 LAMDA 생성시 사용한 테스트 코드를 입력 후 테스트를 진행 하면 됩니다.
AMAZON API GATEWAY GET 메서드, 제품 검색
앞에서 GET Method를 생성 했지만 REST API는 ID를 기준으로 검색 하는게 일반적 입니다.
여기서는 DynamoDB생성시 사용한 uuid를 기준으로 검색하는 Method를 생성해 보겠 습니다.
작업(Action)에서 리소스 생성을 클릭 하고 아래값을 입력 후 리소스 생성 버튼을 클릭 합니다.
/{uuid}가 선택된 상태에서 위에서 실행했던 메소드 생성 방법으로 get 메소드를 생성 하고 아래의 값들을 입력 후 저장버튼을 클릭 합니다.
이제 경로에 포함하여 전송한 uuid가 Lambda에도 전송되도록 해야 합니다. 그러려면 통합요청을 변경해야 합니다
아래 화면에서 빨간색 부분을 클릭 합니다.
아래쪽으로 스크롤하여 Mapping Templates를 확장을 하고 정의된 텝플릿이 없는 경우를 선택 하고 매핑 템플릿 추가를 클릭 합니다.
아래의 값을 입력 후 확인 버튼을 클릭 합니다.
이제 마우스를 이용해 아래로 좀더 스크롤 해서 아래의 화면과 같이 코드를 입력하고 저장 버튼을 클릭 합니다.
마우스로 위로 스크롤을 해서 메소드 실행 get을 클릭 하여 기본 화면으로 돌아 갑니다.
이제 AWS 콘솔창에서 DynamoDB를 검색 후 왼쪽 메뉴의 테이블을 클릭하고 앞서 생성한 acme_products table을 클릭 하고 표 항목 탐색 버튼을 클릭 합니다.
기존에 생성한 테이블 중에서 uuid 하나를 메모장에 복사를 해둡니다.
API 콘솔로 다시 돌아 와서 아래 화면의 테스트를 클릭 합니다.
{uuid}부분에 앞에서 복사하 uuid값을 입력 후 테스트 버튼을 클릭 합니다.
AWS Lambda Authorizer 생성하기
Lambda Authorizer(이전 명칭은 사용자 지정 권한 부여자)는 Lambda 함수를 사용하여 API에 대한 액세스를 제어하는 API Gateway 기능입니다. 인증 방식은 OAuth 또는 SAML과 같은 보유자 토큰 인증을 사용하거나 요청 파라미터를 사용하여 호출자의 자격 증명을 확인하는 사용자 지정 권한 부여 체계를 구현하려는 경우에 사용 합니다.
요약하면
첫번째 유형 토큰 기반 Lambda Authorizer(토큰 권한 부여자라고도 함)는 보유자 토큰(JSON Web Token(JWT) 또는 OAuth 토큰)에 있는 호출자의 자격 증명을 받습니다.
두번째 요청 파라미터 기반 Lambda Authorizer(요청 권한 부여자라고도 함)는 헤더, 쿼리 문자열 파라미터, stageVariables 및 $context 변수의 조합으로 호출자의 자격 증명을 합니다.
여기서는 권한 부여 검증을 수행할 Lambda 함수를 생성 해보겠습니다.
AWS 콘설창에서 Lamda를 검색 하고 선택한 후 함수 생성을 클릭 하고 아래와 같이 값을 입력 후 함수 생성 버튼을 클릭 합니다.
이 함수는 API Gateway에 대한 액세스 권한을 부여 또는 차단하는 정책을 반환하므로 계속 진행하려면 추가 설정이 필요 합니다. AWS 콘솔창에서 API를 클릭 후 생성 하였던 API에서 아래 값을 복사해 둡니다.
이제 계정 ID 정보를 아래의 창과 같이 값을 찾은 후 복사해 둡니다.
이제 앞에서 생성중이던 Lamda 함수로 돌아가서 코드 부분에 아래의 코드를 아래와 같이 붙여 넣고 Deploy버튼을 클릭 합니다.
사용할 코드는 아래와 같고 앞서 찾은 APIID값과 ACCOUNTD값은 값으로 변경을 합니다.
def lambda_handler(event, context): auth = 'Deny' if (event['authorizationToken'] == '123'): auth = 'Allow' authResponse = { "policyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": ["execute-api:Invoke"], "Effect": auth, "Resource": "arn:aws:execute-api:*:743468197844:nuag4bhpj1/*" } ] } } return authResponse |
이제 API Gateway로 돌아가 권한 부여자를 생성하고 보호하려는 메서드에 연결을 해보겠습니다.
AWS 콘솔에서 API Gateway를 클릭 하고 기전에 만들어 놓은 API GW를 클릭 합니다.
아래의 화면과 같이 권한 부여자를 클릭 하고 새로운 권한 부여자생성을 클릭 합니다.
아래와 같이 엽력 후 생성을 클릭 합니다.
권한 부여 후 생성 버튼을 클릭 합니다.
물론 비즈니스 요구 사항에 따라 보호 여부가 결정 되겠지만. 여기서는 메서드 중 하나만 보호해 보겠습니다.
왼쪽 화면의 리소스를 누르고 ./product 리소스의 GET을 클릭 한후 메소드 요청을 클릭 합니다.
위와 같이 연필 모양을 클릭 하여 위의 값으로 변경 후 저장을 합니다.
이제 GET 메서드가 Lambda Authorizer에 의해 보호됩니다. 값 123을 사용하여 Authorization을 전송하는 요청만 Lambda로 전달됩니다.
배포
배포를 위해 API에서 ./product 리소스에서 작업 버튼을 클릭하여 CORS활성화를 클릭 합니다.
모든 항목을 그대로 두고 cors활성화 및 기존 cors 헤더 대체 버튼을 클릭 합니다.
예 기존값을 대체 한다는 버튼을 클릭 합니다.
이제 API의 리소스 창에서 아래와 같이 /를 클릭 하고 작업 버튼을 클릭 후 API배포를 클릭 합니다.
API 배포 창에서 아래와 같이 입력 후 배포 버튼을 클릭 합니다.
이제 API가 배포가 완료 되었고 API를 호출 할수 있는 url도 생성이 되었습니다. url은 별도의 메모장에 저장을해 둡니다.
테스트를 위해 Amazon에서 제공하는 Test tool의 url주소를 새로운 브라우저 창에 입력을 하면 아래와 같은 화면이 나타납니다.
testtool url: https://us-west-2-aws-training.s3.amazonaws.com/courses/SPL-TF-200-DVREST-1/v1.0.4.prod-ca2cd182/scripts/api-tester/index.html
앞에서 권한 인증을 설정한 get을 클릭 하고 API GATEWAT endpoint에는 앞서 저장한 API 호출 url을 입력 후 마지막에 /products를 입력해 주고, 인증 토큰에는 123을 입력 후 Subbint를 클릭 하면 화면 우측과 같이 200 리턴 코드가 오면
성공을 한 것입니다.
그럼 이제 구축은 완료된 상태 입니다.
좋은 하루 되세요.
'아마존 클라우드' 카테고리의 다른 글
[클라우드] Amazon KMS(Key management System) 사용 방법 (87) | 2023.08.05 |
---|---|
[클라우드] Amazon Lamda에 Application배포하기 (180) | 2023.07.29 |
[클라우드] CodeCommit 사용하기. (78) | 2023.07.15 |
[클라우드] 아마존 로드 발란서 NLB 사용하기 (117) | 2023.07.14 |
[클라우드] 아마존 EKS Auto scaling 사용하기. (116) | 2023.06.24 |