상세 컨텐츠

본문 제목

[AWS 교육 요약] Developing on AWS (3/3)

개발 이야기

by 리치윈드 - windFlex 2022. 7. 18. 11:39

본문

반응형

Python은 Flask / FastAPI / Django 등에서 각 Web Application 의 함수를 Routing해 준다. 그러나, AWS Lambda와 같은 Serverless 방식으로 Function을 구동한다면 어떻게 라우팅 해 줄 수 있을까?

AWS에서 제시하는 답은 API Gateway를 사용하라.!!! 

추가적으로 Routing을 처리하는 과정에서 L7 Layer 장비가 해 줄수있는 Application에서의 추가기능을 제공한다. 대표적으로, Request의 Validation 점검, Response의 변형, 그리고 prod/test 등의 deploy 관리 등이다. 

 

 

API Gateway를 사용한 솔루션 개발

 

 

그림으로 도식화하여 보자. 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 가 생성되었다면, 다음과 같은 프로세스로 진행 하면된다. 

  • Resource 생성
  • Method 생성

Create Resource에는 "notes"라는 이름으로 생성해 주자.

Create Method에서는 GET 또는 POST 등의 Method를 선택하고, 해당되는 Lambda Function을 설정해 주는 것이 핵심이다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Cognito 인증 애플리케이션 구축 (Practice 06)

 

 

실습에서 목표로하는 아키텍처

Lambda에는 이미 함수가 구현/등록되어 있다. 이 함수들을 연결하는 API Gateway는 샘플로 list 함수만 연결이 되어 있는 상황인다. 

Lambda에는 이미 함수가 구현되어 있다.

 

기본적으로 API Gateway가 구동되어 있다.(좌), 그러나, API Gateway는 list 함수만 기본 설정 되어 있다. (우)

 

이러한 환경에서 우리는, Cogniton를 연결하여 인증을 토큰을 받고 이것을 API Gateway와 연결하여 인증이 연동될 수 있도록 해야 한다. 

  • Amazon Cognito를 사용하여 사용자풀 (UserPool) 과 앱 클라이언트 (App Client)를 생성
  • 새사용자를 추가하고, Cognito CLI를 이용하여 로그인 (가능 여부 확인)
  • API Gateway에서 Amazon Cognito를 권한 부여자로 등록 (메서드 구성)
  • API 호출 중에, JWT (Just-in time Web Token) 인증 토큰 생성 확인
  • Amazon Cognito 및 API Gateway 구성을 사용하도록 웹 Front-End 애플리케이션 (React) 설정, 기능확인

 

1) Congito User Pool 생성

Cognito User Pool 생성. UserPool 선택 (좌), Password Policy (우) 테스트를 쉽게 하기 위하여 보안수준을 낮추고 보안체크 기능을 비활성화 했다.

 

 

Cognito User Pool 생성 결과: User Pool (좌), App Client (우), 각각의 표기된 ID 문자열 값은 이후 연동에 사용되므로 따로 저장해 두고 사용하자.

2) User Pool 에 새 사용자 등록

동작 가능성을 점검하기 위해서, 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탭에 가면 사용자가 아래와 같이 등록되어 있는 것을 확인 할수 있다. 

User Pool 에 새사용자를 등록한 결과. Unconfirmed 상태이다.

 

그러나 자세히 보면 "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에 종속되어 있기 때문에 연동되어도 상관은 없으나, 일관성이 부족한것은 아닐까?

User Pool에 새사용자 등록 후, Admin의 승인 처리 결과: Confirmed로 변경되었다.

 

3) Amazon Cognito 동작 테스트

여기까지 진행한 결과를 테스트 하기 위해서, 간략한 테스트용 웹페이지를 제공한다. 실습에 기본 생성되어 있는 S3에 들어가 보면, Public으로 정적 웹호스팅을 하고 있는 2개의 버킷을 확인 할 수 있는데, 이중 "testlogin..."으로 표기된 웹페이지를 열어본 것이다. 

TestLogin 웹페이지의 화면은 다음과 같다. Pool ID와, App Client ID, Username, Passworkd를 입력하면, Cognito가 보내준 Access Token을 확인 할 수 있다. 

인증 성공하면, ".getIdToken().getJwtToken()"메서드가 호출된다.

 

4) API Gateway - Cognito를 권한 부여자로 사용하도록 설정

지금까지 Amazon Cognito를 설정하여 1) User Pool를 생성, 2) 사용자를 User Pool에 등록, 3) 사용자 로그인 요청 시 JWT 발행 테스트 하였다. 이제 Cognito에서 발행해 주는 JWT 토큰으로 API Gateway에서 인증되도록 연동해 주어야 한다. 

 

  • AWS service > API Gateway 화면에서 이미 생성되어 있는 우리의 API Gateway ( "PollyNotesAPI" ) 를 클릭해 주자.
  • 그 다음 왼쪽 메뉴 > Authorizers 메뉴 > "Create new Authorizer" 를 클릭하자. 여기에서 우리는 Cognito를 인증기로 연동해 주는 작업을 할 것이다. 
  • Create Authorizer 버튼을 누르면, 아래 그림 (우) 같이 Name, Type, Cognito User Pool, Tocken Source를 입력해 주고 Create 버튼을 눌러주자. 

 

  • Authorizer가 생성되면 결과가 아래 그림 (좌)와 같이 나타나고, 테스트를 실행해 볼 수 있다. 
  • Authorization 항목을 빈칸으로 테스트 하면 당연하게도 401에러와 "Unauthorized request" 메세지를 받는다.
  • 앞서, cognito test 페이지에서 수신받은 JWT 토큰을 입력해 주면 아래 오른쪽 그림처럼 정상 인증인 된것을 확인 할 수 있다. 

API Gateway Authorizer 생성 결과 (좌), Authorizer Test 결과 : 401 에러 (중), Authorizer Test 결과 200 성공 (우)

 

5)

 

  • API Gateway > 왼쪽 메뉴 API: PollyNotesAPI > Resource 메뉴로 돌아온다. 기존 정의한 /notes의 GET/POST 메소드에 대한 정의가 보인다. 
  • GET Method를 선택하고 > Method Request를 선택해 주자

 

  • GET method의 Settings > Authorization -> 편집 --> PollyNotesPool (API Gateway의 Authorizer에서 설정해 주었던 이름)
  • *선택 후 꼭 옆에 있는 v표시 (확인)를 클릭 해 주어야 한다. 

  • 그 다음 다시 상위 메뉴로 나와, Integration Request 메뉴로 들어간다. 

 

 

 

기본 템플릿으로  {"UserId": "student"} 가 저장되어 있다. 이것은 모든 UserId를 "student"로 고정하고 있기 때문에, cognito에서 반환하는 username으로 동적 변경해 주는 부분이다.

 

 

 

 

 

 

 

반응형

관련글 더보기

댓글 영역