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