API 테스트하기

이제 백엔드 설정과 보안 설정을 모두 완료했으니, 방금 배포한 API를 테스트해 보겠습니다.

API 엔드포인트에 안전하게 접근하려면 다음 단계를 따라야 합니다.

  1. User Pool에 인증하여 사용자 토큰을 획득합니다.
  2. 사용자 토큰으로 Identity Pool에서 임시 IAM 자격 증명을 얻습니다.
  3. IAM 자격 증명을 사용해 Signature Version 4로 API 요청에 서명합니다.

이 단계를 수동으로 수행하는 것은 다소 까다로울 수 있습니다. 그래서 AWS API Gateway Test CLI라는 간단한 도구를 만들었습니다.

다음 명령어로 실행할 수 있습니다.

$ npx aws-api-gateway-cli-test

npx 명령어는 NPM 모듈을 전역으로 설치하지 않고 실행할 수 있는 편리한 방법입니다.

위 단계를 완료하려면 상당히 많은 정보를 전달해야 합니다.

  • Cognito 테스트 사용자 생성 챕터에서 생성한 사용자의 아이디와 비밀번호를 사용합니다.
  • YOUR_COGNITO_USER_POOL_ID, YOUR_COGNITO_APP_CLIENT_ID, YOUR_COGNITO_REGIONCognito User Pool 생성 챕터에서 얻은 값으로 대체합니다. 여기서는 리전이 us-east-1입니다.
  • YOUR_IDENTITY_POOL_IDCognito Identity Pool 생성 챕터에서 얻은 값으로 대체합니다.
  • YOUR_API_GATEWAY_URLYOUR_API_GATEWAY_REGIONAPI 배포 챕터에서 얻은 값으로 대체합니다. 여기서는 URL이 https://0f7jby961h.execute-api.us-east-1.amazonaws.com/prod이고 리전이 us-east-1입니다.

그리고 다음 명령어를 실행합니다.

$ npx aws-api-gateway-cli-test \
--username='admin@example.com' \
--password='Passw0rd!' \
--user-pool-id='YOUR_COGNITO_USER_POOL_ID' \
--app-client-id='YOUR_COGNITO_APP_CLIENT_ID' \
--cognito-region='YOUR_COGNITO_REGION' \
--identity-pool-id='YOUR_IDENTITY_POOL_ID' \
--invoke-url='YOUR_API_GATEWAY_URL' \
--api-gateway-region='YOUR_API_GATEWAY_REGION' \
--path-template='/notes' \
--method='POST' \
--body='{"content":"hello world","attachment":"hello.jpg"}'

이 명령어가 복잡해 보일 수 있지만, 실제로는 기본 HTTP 요청을 보내기 전에 보안 헤더를 생성하는 작업일 뿐입니다. 이 과정은 React.js 앱을 API 백엔드에 연결할 때 더 자세히 살펴볼 것입니다.

윈도우를 사용 중이라면 아래 명령어를 사용하세요. 각 옵션 사이의 공백이 매우 중요합니다.

$ npx aws-api-gateway-cli-test --username admin@example.com --password Passw0rd! --user-pool-id YOUR_COGNITO_USER_POOL_ID --app-client-id YOUR_COGNITO_APP_CLIENT_ID --cognito-region YOUR_COGNITO_REGION --identity-pool-id YOUR_IDENTITY_POOL_ID --invoke-url YOUR_API_GATEWAY_URL --api-gateway-region YOUR_API_GATEWAY_REGION --path-template /notes --method POST --body "{\"content\":\"hello world\",\"attachment\":\"hello.jpg\"}"

명령어가 성공적으로 실행되면, 응답은 다음과 비슷하게 나타납니다.

Authenticating with User Pool
Getting temporary credentials
Making API request
{
  status: 200,
  statusText: 'OK',
  data: {
    userId: 'us-east-1:edc3b241-70c3-4665-a775-1f2df6ddfc26',
    noteId: '6f9f41a0-18b4-11eb-a94f-db173bada851',
    content: 'hello world',
    attachment: 'hello.jpg',
    createdAt: 1603844881083
  }
}

이제 사용자 인증을 처리하고 보안이 적용된 서버리스 API를 구축했습니다. 다음 섹션에서는 서버리스 환경에서 제3자 API를 사용하는 방법과 비밀 정보를 다루는 방법을 살펴보겠습니다.


일반적인 문제

  • 응답 {status: 403}

    이 문제는 가장 흔히 발생하며, 디버깅하기 어려울 수 있습니다. 디버깅을 시작하기 전에 다음 사항을 확인하세요:

    • apig-test 명령어의 --path-template 옵션이 /notes를 가리키는지 확인하세요. notes가 아니라 /notes여야 합니다. 이 형식은 요청을 안전하게 서명하는 데 중요합니다.

    • YOUR_API_GATEWAY_URL에 후행 슬래시가 없어야 합니다. 예를 들어, URL은 https://ly55wbovq4.execute-api.us-east-1.amazonaws.com/prod와 같이 끝에 /가 없어야 합니다.

    • Windows에서 Git Bash를 사용 중이라면, YOUR_API_GATEWAY_URL에 후행 슬래시를 추가하고 --path-template에서 선행 슬래시를 제거해 보세요. 예를 들어, --invoke-url https://ly55wbovq4.execute-api.us-east-1.amazonaws.com/prod/ --path-template notes와 같이 설정할 수 있습니다. 이에 대한 논의는 여기에서 확인할 수 있습니다.

    이 오류는 Lambda 함수가 호출되기 전에 발생할 가능성이 높습니다. 따라서 IAM 역할이 Identity Pool에 대해 올바르게 구성되었는지 확인하세요. 서버리스 API 문제 디버깅 챕터에 설명된 단계를 따라 IAM 역할에 적절한 권한이 설정되었는지 확인하세요.

    다음으로, API Gateway 로그를 활성화하고 이 지침에 따라 로그된 요청을 확인하세요. 이를 통해 문제를 더 잘 이해할 수 있습니다.

    마지막으로, 아래 댓글 스레드를 확인하세요. 비슷한 문제를 겪은 사람들이 많으며, 여러분과 동일한 문제를 겪은 사람이 있을 가능성이 높습니다.

  • 응답 {error: "Some error message"}

    만약 명령어가 {error: "Some error message"} 응답과 함께 실패한다면, 이 문제를 디버깅하기 위해 몇 가지 작업을 할 수 있습니다. 이 응답은 Lambda 함수에서 오류가 발생했을 때 생성됩니다. libs/handler-lib.js의 오류 핸들러에 다음과 같이 console.log를 추가하세요.

    // 실패 시
    .catch((e) => {
      console.log(e);
      return [500, { error: e.message }];
    })
    

    그리고 serverless deploy function -f create를 사용해 배포하세요. 하지만 HTTP 요청을 보낼 때 이 출력을 볼 수는 없습니다. 콘솔 로그는 HTTP 응답에 포함되지 않기 때문입니다. 로그를 확인해야 합니다. API Gateway 및 Lambda 로그 작업에 대한 자세한 챕터가 있으며, 디버그 메시지를 확인하는 방법은 여기에서 읽어볼 수 있습니다.

    이 오류의 일반적인 원인은 serverless.yml의 들여쓰기가 잘못된 경우입니다. 이 챕터serverless.yml과 비교하여 들여쓰기를 다시 확인하세요.

  • ‘User: arn:aws:... is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:...’

    이 오류는 Lambda 함수가 DynamoDB 요청을 할 수 있는 권한이 없다는 것을 의미합니다. Lambda 함수가 DynamoDB에 요청을 할 수 있도록 하는 IAM 역할은 serverless.yml에 설정되어 있습니다. 이 오류의 일반적인 원인은 iamRoleStatements:의 들여쓰기가 잘못된 경우입니다. 레포지토리의 파일과 비교하여 확인하세요.