Python은 Flask / FastAPI / Django 등에서 각 Web Application 의 함수를 Routing해 준다. 그러나, AWS Lambda와 같은 Serverless 방식으로 Function을 구동한다면 어떻게 라우팅 해 줄 수 있을까?
AWS에서 제시하는 답은 API Gateway를 사용하라.!!!
추가적으로 Routing을 처리하는 과정에서 L7 Layer 장비가 해 줄수있는 Application에서의 추가기능을 제공한다. 대표적으로, Request의 Validation 점검, Response의 변형, 그리고 prod/test 등의 deploy 관리 등이다.
그림으로 도식화하여 보자. Amazon API Gateway를 사용하면 다음 그림과 같이 Method (GET / POST) 등에 따라서 Lambda 함수로의 매핑을 해 주는 기능을 한다. 일반 웹프레임워크에서 라우팅 기능이라고 보면 되겠다. 아래 그림에서는 GET Method로 호출할 때는 list 함수를, POST Method 호출할 때는 createUpdate 함수를 호출한다.
API Gateway를 실행하기 위해서는, "AWS Service > API Gateway > Create API 버튼 클릭" 으로 새로운 API를 생성한다. 그 다음 WebSocket , REST API 등 여러 API 유형이 나오는데, 가장 익숙한 REST API 항목에서 "Build"를 눌러서 API를 생성하도록 하자. 다음으로 나오는 페이지에서는 간략히 API이름을 입력해 주면 된다.
API 가 생성되었다면, 다음과 같은 프로세스로 진행 하면된다.
Create Resource에는 "notes"라는 이름으로 생성해 주자.
Create Method에서는 GET 또는 POST 등의 Method를 선택하고, 해당되는 Lambda Function을 설정해 주는 것이 핵심이다.
Lambda에는 이미 함수가 구현/등록되어 있다. 이 함수들을 연결하는 API Gateway는 샘플로 list 함수만 연결이 되어 있는 상황인다.
이러한 환경에서 우리는, Cogniton를 연결하여 인증을 토큰을 받고 이것을 API Gateway와 연결하여 인증이 연동될 수 있도록 해야 한다.
동작 가능성을 점검하기 위해서, aws cli를 통해서 새 사용자 등록을 처리한다. 이후는 web application에서 처리해야 할 것이다. cli명령어는 "aws cognito-idp sign-up" 명령어를 사용한다.
aws cognito-idp sign-up --client-id <App 클라이언트ID> --username student --password student
username과 password는 "student"로 고정하여 테스트 하였음.
위의 aws cli를 사용하면, 사용자
<App 클라이언트 ID>라고 표기한 곳은 위 User Pool 생성 결과에서 표기된 Client ID를 표기한다. 다음과 같이, 필요한 내용은 변수로 만들어서 사용할 수 있다.
$ apiURL='[apiURL]'
$ CognitoPoolId='[Cognito Pool Id]'
$ AppClientId='[App Client Id]'
본 포스팅의 경우, 변수는 다음과 같다.
apiURL='https://tr67vt4vi6.execute-api.us-west-2.amazonaws.com/Prod'
CognitoPoolId='us-west-2_31xxxxxxT'
AppClientId='47frcxxxxxxxxxxxxxxxxxxvo5sp'
변수가 설정 되었다면, cli명령어는 변수를 사용하여 다시 작성할 수 있다.
aws cognito-idp sign-up --client-id $AppClientId --username student --password student
결과값 :
{
"UserConfirmed": false,
"UserSub": "16c1e566-f828-48ab-927b-c43252ced067"
}
이제, 사용자풀 (User Pool)에 사용자가 등록이 되었다. AWS Console > Cognito > User Pool 화면에서, 우리가 생성한 UserPool 이름 (PollyNotesPool)의 User탭에 가면 사용자가 아래와 같이 등록되어 있는 것을 확인 할수 있다.
그러나 자세히 보면 "Confirmation status"가 아직 "Unconfirmed"되어 있는 것을 알 수 있다. 관리자(Admin)이 승인을 해야 최종 "Confirm"이 되는 프로세스를 가지고 있다.
다시 Cli명령어를 사용하여 Admin의 Confirm을 해주자.
aws cognito-idp admin-confirm-sign-up --user-pool-id $CognitoPoolId --username student
필요한 중요 정보는 Pool ID와 승인할 사용자의 이름이다. 사용자 이름은 당연한 것이고, Pool ID는 여러 Pool이 있을 경우 이것을 지칭해야 하므로 필요할 것이다. 그러나, 의문점은 사용자 등록은 App Client ID인데, 승인은 왜 Pool ID를 사용하는가?
App Client ID는 당연히 Pool ID에 종속되어 있기 때문에 연동되어도 상관은 없으나, 일관성이 부족한것은 아닐까?
여기까지 진행한 결과를 테스트 하기 위해서, 간략한 테스트용 웹페이지를 제공한다. 실습에 기본 생성되어 있는 S3에 들어가 보면, Public으로 정적 웹호스팅을 하고 있는 2개의 버킷을 확인 할 수 있는데, 이중 "testlogin..."으로 표기된 웹페이지를 열어본 것이다.
TestLogin 웹페이지의 화면은 다음과 같다. Pool ID와, App Client ID, Username, Passworkd를 입력하면, Cognito가 보내준 Access Token을 확인 할 수 있다.
인증 성공하면, ".getIdToken().getJwtToken()"메서드가 호출된다.
지금까지 Amazon Cognito를 설정하여 1) User Pool를 생성, 2) 사용자를 User Pool에 등록, 3) 사용자 로그인 요청 시 JWT 발행 테스트 하였다. 이제 Cognito에서 발행해 주는 JWT 토큰으로 API Gateway에서 인증되도록 연동해 주어야 한다.
5)
기본 템플릿으로 {"UserId": "student"} 가 저장되어 있다. 이것은 모든 UserId를 "student"로 고정하고 있기 때문에, cognito에서 반환하는 username으로 동적 변경해 주는 부분이다.
[AWS 교육 요약] Developing on AWS (2/3) (0) | 2022.07.13 |
---|---|
[AWS 교육 요약] - Developing on AWS (1/3) (0) | 2022.07.13 |
[텐서플로우] TFIO/TFIO.audio 설치 에러 - NotImplementedError (0) | 2022.07.06 |
[ 코딩 ] 알고리즘 공부 및 경시대회 리스트 (0) | 2022.05.13 |
[React] CRA / WebPack Error - Module not Found : Can't resolve xx (0) | 2022.05.06 |
댓글 영역