[TROUBLESHOOTING] API Gateway로 서버리스 애플리케이션 호출하기

Son_Doobu96·2023년 2월 2일
0

sprint Troubleshooting

목록 보기
1/7
post-thumbnail
post-custom-banner

◎ 이번 실습의 달성 목표

  • 아키텍처로 구성
    • API Gateway - Lambda - DynamoDB
  • 직접 API Gateway로 실행
  • API Gateway의 인증 기능을 이용해서, HTTP 요청에 특정 API Key를 사용하는 방법 구현
  • API Key
  • 권한 부여자
  • CloudWatch Logs를 통해서 API 호출을 모니터링

■ Step 1~2. API Gateway와 Lambda를 같이 배포

본 실습은 SAM 템플릿을 통해 진행됐습니다.
자료 출처 : https://serverlessland.com/patterns/lambda-dynamodb

SAM을 활용 전 알아야 할 것?

아래 두 가지만 잘 기억하시면 SAM 관련 문제는 왠만해서는 해결하실 수 있을겁니다.

  1. aws-cli에서 사용하고 있는 사용자에 적절한 권한이 없다면 많은 오류가 날 것이다.
  2. 적절한 권한을 주었음에도 진행이 되지 않을 경우 CloudFormation에서 스택을 삭제 후 다시 진행해 볼것을 추천합니다.

▶ 사용한 권한 목록

다른 권한도 들어있으니 참고로만 봐주시면 감사 하겠습니다!

sam deploy --guided

를 활용해 Lambda의 배포에 성공했다면 트리거를 추가해 API Gateway를 생성 해준다.
API Gateway를 사용하는 기본적인 이유는 Lambda의 백엔드 서비스 함수를 호출하고 그 결과를 집계하기 위해서이다.
자세한 이유는 이 포스팅을 확인해주시면 감사합니다!


■ Step 3. API Gateway 제한하기

API Gateway를 제한하는 이유는 보안, 속도, 용도의 제한등 다양한 이유가 있다.

이번 실습에서 API Gateway를 제한하는 목표에는 아래 4가지가 있었다.

  • POST 전용으로만 작동하게 만들기
  • 본문만 저장하도록 만들기
  • API 키를 이용한 인증 추가하기
  • 권한 부여자를 이용한 인증 부여하기 (optional)

POST 전용으로만 작동하게 만들기

처음 API 게이트웨이 UI를 확인하면 정돈되지 못한 느낌을 받게 된다. 조금 옛날스런 느낌도 있다.
맨 처음 화면을 보게 되었을때는 빨간색으로 표시된 POST 부분이 ANY로 지정되어 있다.
AWS API Gateway HTTP Method 설정 공식 문서

해당 문서의 HTTP 메서드 설정을 확인하면 ANY는 모든 HTTP 메서드를 지원한다고 되어있다.
우리의 목표인 POST 전용으로만 작동하게 만들기에 부합하지 않으므로 새로운 메서드를 생성해 주었다.

어렵지 않게 메서드를 생성한 후 Postman을 이용해 해당 변경 사항이 잘 적용되었는지 체크하려 했지만 문제가 발생했다.

  1. POST 요청이 안된다.
  2. 근데 GET 요청도 문제가 없다.

이건 사실 당연한 문제이다. AWS Console을 통해 진행 하다보니 Local 진행과 다른 점을 눈치채지 못했었는데 POST 메소드를 생성하고 ANY 메소드를 제거한 것이 "소스 코드를 변경한 행위"와 같다는 점을 인식하지 못했었다.

우리가 Local에서 소스코드를 변경했다면 당연히 다시 배포를 해야 그 변경 사항이 적용이 될 것이다. AWS Console에서의 진행도 크게 다르지 않았다.

변경 사항이 있다면 반드시 다시 배포를 통해 변경 사항을 적용해줘야 한다는 것을 머리에 심어뒀다!

다음은 Postman으로 확인해야 할 엔드포인트이다.

그건 AWS Lambda의 트리거에서 쉽게 확인할 수 있다.
하지만 쉬운 확인 보다 중요했던 것이... 이 엔드포인트를 분석하는 것이었다.

API endpoint의 구성은

https://<api-id>.execute-api.<region>.amazonaws.com/<stage_name>/<호출하려는 API 리소스 이름>

으로 되어 있다. 여기서 확인할 수 있는 점은 Lambda는 함수이기에 호출 하려는 API 리소스의 이름은 백엔드 Local 서버 에서 구성하던 하나의 "함수"인 것이고
스테이지는 그 상위의 디렉토리다! 라는 것을 알게 되었다.

실제로 필요에 따라 Local에서 엔드포인트를 구성하듯이 스테이지를 구성할 수 있다는 것을 팀원이 아니었다면 아마 끝까지 못 찾았을 수도 있을것 같다...
하나하나 잘 뜯어보자!


본문만 저장하도록 만들기

내가 이해한 내용으로 이 내용은 DB에 body만이 저장되도록 만들라는 것으로 이해했다.
이 부분을 확인하기 위해 DynamoDB에 데이터가 어떻게 들어오는지를 먼저 확인하려 했다.

항목 탐색 탭에서 해당 내용을 확인해 볼 수 있었다.

잘 들어온다 .. 개꿀?


API 키를 이용한 인증 추가하기

이 부분은 공식문서에 매우 자세하게 나와있었다.
AWS API Gateway 콘솔에서 API key를 설정하는 방법
공식 문서대로 API Key를 생성한 후

사용량 계획을 생성해줬다. 사용량 계획을 생성하는 이유는 API Key와 연동하여
설정한 스테이지 엔드포인트에 대한 보안 능력을 높이고 성능 수준을 향상시키기 위해서이다.

◆ 발생한 문제

이후 포스트맨으로 인증 암호 없이 POST요청을 보냈는데 너무 잘 작동해서 한참동안의 삽질을 시작했다.

문제의 원인은 리소스에서 API 키에 대한 설정을 안해줬었기 때문이다..

설정 해준 후 문제 없이 잘 작동했다. 사실 요청헤더에 x-api-key가 아닌 Authorization을 넣어서 몇번 삽질을 더 하긴 했지만 말이다 ㅋㅋㅋㅋ
나와 같은 문제를 겪으신 분들은 아래 공식문서를 확인하시면 좋을 것 같다.
AWS 키 소스 선택에 관한 공식문서


권한 부여자를 이용한 인증 부여하기 (optional)

이 부분은 AWS가 정말 더 없이 친절하다.
AWS 권한 부여자 사용에 관련된 공식문서

AWS 공식 문서의 내용대로 권한부여자의 역할을 파악하고 따라서 진행한 것이 정말 도움이 많이 됐다.

profile
DevOps를 꿈꾸는 엔지니어 지망생!
post-custom-banner

0개의 댓글