Lambda를 이용해서 다양한 서비스를 시도했었는데, 오늘은 API Gateway에서 API를 생성하여 Lambda와 연동시켜서 DB에 데이터를 적재해보도록 하겠다.
이전에 사용했던 Dynamo DB를 그대로 사용할것이다.
하지만 이전에 적용했던 내용은 S3에 파일로 데이터를 올리면 S3에서 트리거 동작을 해서 Lambda를 동작시키고
Lambda에서는 S3 안에 있는 새로운 Object를 읽어와서 Dynamo DB에 해당 데이터를 적재하는 방법이였는데, 한가지의 데이터만 입력하고 싶을때는 앞선 구성의 경우는 적합하지 않다.
[실습1] HTTP API Gateway와 Lambda Post 메소드 활용
1-1 Lambda우선 우리 구성의 경우는 위의 서비스를 사용할것이고 앞서 언급했듯이, Dynamo DB를 사용할 것이다.
Dynamo DB 테이블 생성 방법은 이전 포스팅을 참고하길 바란다.
다음으로는 Lambda를 생성한다.
설정은 이전과 같은 설정으로 생성한다.
코드는 아래와 같이 편집한다.
import json
import boto3 #aws와 연동하기 위해 boto3를 import한다.
def lambda_handler(event, context):
bird = json.loads(event["body"]) #json data의 body부분을 선언한다.
dynamodb = boto3.resource('dynamodb') #boto3의 dynamodb를 선언한다.
table = dynamodb.Table('awesome-birds') #dynamodb의 특정 테이블을 선언한다.
table.put_item(Item=bird) #해당 테이블에 Item을 put한다.
return{
"statusCode" : 200, #성공시 반환코드를 리턴 받는다.
"body" : json.dumps({"message": f"{bird['name']} stored in DB!"}) #메세지의 body에 성공시 해당 메시지로 출력한다.
}
다음으로는 API Gateway로 이동하자.
우리는 HTTP API를 사용하도록 하겠다.
API를 생성할때 Integration을 선택하여 연동하는데 Lambda에서 이전에 생성한 Lambda를 지정해서 API를 구성하도록 한다.
메소드는 post, 경로는 /birds로 지정하여 다음으로 넘어간다.
Stage 환경은 없이 다음으로 넘어가서 생성을 완료한다.
생성이 완료된 API Gateway이다.
여기서 우리는 AWS에서 생성한 URL로 테스트를 진행한다.
해당 URL을 테스트하기 위해서 Postman을 이용할 것이다.
API를 테스트할수 있는 Tool이다.
홈페이지로 접속해서
각자의 운영체제에 맞는 애플리케이션을 설치한다.
설치후 실행하면 아래와 같은 화면이다.
+ 버튼을 클릭하여 새로운 테스트 환경을 구성한다.
위와 같이 API Gateway의 URL과 Path를 입력한다.
다음으로 body부분에 전달 하고자 하는 데이터를 입력한다.
{
"id": "453gdgr43-155e-4283-a16f-546435gdgd5",
"canFly": false,
"name": "penguin",
"colors": [
"black",
"white",
"orange"
]
}
body가 작성이 되었으면, Send 버튼을 눌러서 결과를 확인한다.
이전에 코드에서 작성한 대로 body에 해당하는 name이 DB에 적재되었다는 응답을 확인할수 있다.
Dynamo DB에서도 잘 적재되어 있는것을 확인할 수 있다.
[실습2] HTTP API Gateway와 Lambda Get방식 메소드 구현
다음으로 다른 이름의 Lambda 함수를 생성한다.
우선 Lambda의 코드를 작성하자.
import json
import boto3 #AWS 관련 연동을 위한 boto3를 Import한다.
def lambda_handler(event, context):
dynamodb = boto3.resource('dynamodb') #dynamodb를 선언한다.
table = dynamodb.Table("awesome-birds") #테이블을 선언한다.
response = table.get_item(Key={"id":event["pathParameters"]["id"]}) #전달되는 ID를 Path로 전달한다.
return {
"statusCode": 200,
"body": json.dumps(response["Item"]) #응답을 받는다.
}
다음으로 API를 설정하도록 한다.
이전에 만든 API를 활용할 것이다.
새로운 엔드포인트를 생성하기 위해서는 메뉴에서 Route로 이동한다.
해당 메뉴에서 Create를 클릭한다.
메소드는 Get 방식으로 선언하고 경로는 /birds/{id}를 입력한다.
{id}라고 입력한 경우에 Get 요청에서 id를 변수로 받아서 요청을 보내는것으로 이해했지만... 정확히는 좀더 확인이 필요할것 같다.
Route 생성이 완료 됐다.
다음으로는 Lambda와 연결하여 연동하자.
Attach Integration을 클릭하고
Create and attach an integration을 클릭한다.
해당하는 Lambda 함수를 선택하고 Create를 클릭한다.
그러면 새로운 엔드포인트 생성이 완료 된다.
다음 API Gateway로 돌아가서 엔드포인트를 확인한다.
이번에도 Postman을 활용하도록 하자.
우선 DynamoDB의 item의 id를 확인한다.
아래와 같이 요청 URL에 API Gateway의 엔드포인트와 특정 데이터의 id를 조합하여 입력한다.
입력후 send 버튼을 클릭하면 아래와 같이 결과를 확인할 수 있다.
[실습3] HTTP API Gateway와 Lambda (redirect)
다음의 경우는 API Redirect를 구성해보자.
특정 링크를 클릭했을때, 우리가 구축한 API Gateway로 들어오게끔 redirect를 한 다음에 적당한 destination으로 redirect할것이다.
우선 해당 실습을 진행하기 전에 원활한 테스트 환경을 위해서 몇가지 세팅을 해야한다.
DynamoDB로 이동하자.
앞서 생성했던 Table의 각 Item에 이미지 Url을 넣어 주도록 한다.
특정 Item을 선택하고 Edit Item을 클릭한다.
다음으로 새로운 어트리뷰트를 선택하고 String 값으로 지정하여 입력한다.
imageUrl에는 구글에서 펭귄 이미지 검색한 화면의 Url을 복사해서 Value에 입력한다.
다음으로는 redirect를 담당하는 Lambda를 생성한다.
Lambda 구성은 이전과 동일하게 생성하면 된다.
코드는 이전에 get 방식으로 구성한 Lambda의 코드에서 조금 수정하여 사용한다.
import json
import boto3 #AWS 연동을 위한 boto3 import
def lambda_handler(event, context):
dynamodb = boto3.resource('dynamodb') #DamoDB를 선언한다.
table = dynamodb.Table("awesome-birds") #DynamoDB의 Table을 선언한다.
response = table.get_item(Key={"id":event["pathParameters"]["id"]}) #id를 변수로 넘겨서 값을 받는다.
return {
"statusCode": 302, #redirect를 위한 응답 코드
"headers": {
"Location": response["Item"]["imageUrl"] #각 Item의 imageUrl을 header의 location 영역에 받는다.
}
}
다음으로 API Gateway에 해당 Lambda를 연동한다.
Route로 이동하여 추가한다.
integration을 Lambda로 구성한다.
다음으로는 브라우저에서 해당 API Gateway를 호출해보자.
그러면 짜잔하고 결과가 나온다.
여기까지 HTTP API Gateway와 Lambda를 연동하여 다양한 방식으로 API 호출을 했다.
출처 :
https://www.youtube.com/watch?v=x5TcGHUahN8
https://www.youtube.com/watch?v=TzbImff5KO0
https://www.youtube.com/watch?v=GNodLBVDn9Q
'[AWS] > Lambda' 카테고리의 다른 글
[AWS] REST API Gateway와 Cognito & Lambda 연동 (0) | 2022.11.14 |
---|---|
[AWS] Lambda Request body validation (0) | 2022.10.12 |
[AWS] S3에서 Lambda를 트리거 및 DynamoDB 테이블로 적재 -1 (0) | 2022.10.12 |
댓글