기본적인 개념은 제가 올린 글 초간단 RESTful API 만들기 (API Gateway와 Lambda를 이용) 을 참고한다.

 

오늘의 목적 : 사용자 정보를 등록하고 조회하는 기능을 만든다.

이용하는 서비스는,

  • API Gateway
  • DynamoDB
  • 단, Lambda는 이용하지 않겠다.


우선 데이터가 저장될 DynamoDB를 만들어야 한다.

Service : Amazon DynamoDB

  • [Create table]을 클릭한다.
  • Table name : APIGatewayTestTable
  • Primary key : username
  • [Create] 클릭한다.

DynamoDB가 만들어졌을 것이다.

 

이제부터는 API Gateway 작업이다.

먼저 리소스를 생성한다. 리소스 이름은 user로 정했다. 리소스 경로는 /user가 된다.

그리고 메소드를 생성한다.

 

1. POST 메소드 등록

일단 사용자 등록을 위해 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에 데이터가 들어갔는지 확인해 보자.

 

이제 테스트가 아니고 실전에서 사용해보려고 한다.

API 활성화 위치를 이용한다.

username.json에는 위에서 사용한 샘플 데이터와 동일한 포맷의(다른 데이터를 가진) json 데이터를 사용한다.

$ curl -X POST https://[내주소].execute-api.ap-northeast-2.amazonaws.com/test/user -d @username.json

 

그런데 만약 다음과 같은 오류가 난다면?

{"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"

 

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