1. 소개
기본적인 개념은 제가 올린 글 초간단 RESTful API 만들기 (API Gateway와 Lambda를 이용) 을 참고한다.
2. 목적
오늘의 목적 : 사용자 정보를 등록하고 조회하는 기능을 만든다.
이용하는 서비스는,
- API Gateway
- DynamoDB
- 단, Lambda는 이용하지 않겠다.
3. DynamoDB 생성
우선 데이터가 저장될 DynamoDB를 만들어야 한다.
Service : Amazon DynamoDB
- [Create table]을 클릭한다.
- Table name : APIGatewayTestTable
- Primary key : username
- [Create] 클릭한다.
DynamoDB가 만들어졌을 것이다.
4. API Gateway
이제부터는 API Gateway 작업이다.
먼저 리소스를 생성한다. 리소스 이름은 user로 정했다. 리소스 경로는 /user가 된다.
그리고 메소드를 생성한다.
4-1. POST 메소드 등록
4-1-1. 등록
일단 사용자 등록을 위해 POST 메소드를 등록하자.
- 통합 유형 : AWS 서비스
- AWS 서비스 : DynamoDB
- HTTP 메서드 : POST
- 작업 : PutItem
- 실행 역할 : Role 입력
실행 역할은 ARN으로 입력을 해야 하는데, 그냥 "arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess"으로 입력하면 "Cross-account pass role is not allowed" 에러가 발생한다.
따라서 별도로 Role을 만든 후에 입력해줘야 한다.
(..)
POST 메소드가 생성되었을 것이다. 아래 작업을 이어간다.
- [통합 요청]을 클릭하여 [본문 매핑 템플릿]을 선택한다.
- [매핑 템플릿 추가]를 클릭한다.
- Content-Type에 application/json 입력
- 하단에 아래 내용 추가 입력
{ "TableName": "APIGatewayTestTable", "Item": { "userid": { "S": "$context.requestId" }, "tag": { "S": "$input.path('$.tag')" }, "username": { "S": "$input.path('$.username')" } } }
POST 테스트를 시작하자!
요청 본문에 다음 샘플 데이터를 입력한다.
{ "username" : "aws", "tag" : "Amazon Web Services" }
응답 본문에 {} 나오면 성공이 되었을 확률이 높다. 진짜 DynamoDB에 데이터가 들어갔는지 확인해 보자.
4-1-2. 실전
이제 테스트가 아니고 실전에서 사용해보려고 한다.
API 활성화 위치를 이용한다.
username.json에는 위에서 사용한 샘플 데이터와 동일한 포맷의(다른 데이터를 가진) json 데이터를 사용한다.
$ curl -X POST https://[내주소].execute-api.ap-northeast-2.amazonaws.com/test/user -d @username.json
4-1-3. 오류
그런데 만약 다음과 같은 오류가 난다면?
{"message":"Missing Authentication Token"}
API가 배포되지 않았을 가능성이 크다. AWS 콘솔에서 API를 배포한다!
그런데 만약 다음과 같은 오류가 난다면?
{"__type":"com.amazon.coral.validate#ValidationException","message":"2 validation errors detected: Value null at 'item' failed to satisfy constraint: Member must not be null; Value null at 'tableName' failed to satisfy constraint: Member must not be null"}
Content-Type을 추가한다.
$ curl -X POST https://[내주소].execute-api.ap-northeast-2.amazonaws.com/test/user -d @username.json -H "Content-Type: application/json"
4-2. GET 메소드 등록
POST와 차이점을 중심으로 설명하려고 한다.
[메서드 요청]에서는 [URL 쿼리 문자열 파라미터]에 username를 생성한다.
[통합 요청]에서는 POST 메소드와 동일하게 진행하되 다음을 유의한다.
- HTTP 메서드 : POST (GET이 아니다)
- 작업 : GetItem (PutItem이 아니다)
그리고 [통합 요청]에서 [본문 매핑 템플릿]에서 application/json에서 다음을 추가한다.
{ "TableName": "APIGatewayTestTable", "Key": { "username": { "S": "$input.params('username')" } } }
테스트 시작!
우선 AWS 콘솔에서 GET 메소드 테스트이다. username에는 aws를 입력해 보자. (앞에서 만든 것..)
응답 본문을 확인한다.
{ "Item": { "userid": { "S": "test-invoke-request" }, "username": { "S": "aws" }, "tag": { "S": "Amazon Web Services" } } }
위와 같이 나오면 성공.
API 배포 후 실전 테스트!
curl https://[내주소].execute-api.ap-northeast-2.amazonaws.com/test/user?username=aws