AWS : node.js Lambda RESTful API 만들기


목차

  1. IAM
  2. Lambda
  3. DynamoDB
  4. API Gateway


IAM ▲top
  • AWS Identity and Access Management(IAM)
  • 분류 : 보안, 자격 증명 및 규정 준수
  • 설명 - https://aws.amazon.com/ko/iam/?nc2=h_l3_dm
    1. 사용자의 AWS 서비스와 리소스에 대한 액세스를 안전하게 통제할 수 있습니다. 
    2. 또한, AWS 사용자 및 그룹을 만들고 관리하며 AWS 리소스에 대한 액세스를 허용 및 거부할 수 있습니다. 
  • 내가 써먹은 것들
    1. 한 프로젝트를 진행할때 루트계정을 Super Admin으로 하고, 그 밑에 사용자를 만들어서 사용자별 권한 제어
    2. Lambda 각 Function에서 사용하려고 하는 AWS Service(DynamoDB, CloudWatch 등...)를 제어
  • 사용과정

Step1. IAM 맨 첫 화면이다. 우선 AWS 사용자 로그인 페이지주소부터 바꿔봤다. 저 외우기힘든 숫자가 걸리적거리니깐.


Step2. 내가 짓고싶은 이름 지으면 된다.

Step3. 인제 로그인은 저 url로 하는걸로.


Step4.

Step5. [상단노랭이]'Add another user'버튼을 통해 여러명의 사용자를 동시에 추가할 수도 있음을 보여주려고 함 눌러봤다.
[하단노랭이]그리고 사용자 계정을 만들어줄 때 최초 사용자 로그인 시 비번을 바꿀 수 있게 해줄 수도 있고, 내가 직접 비번을 정해서 줄 수도 있다.


Step6. 이렇게 사용자를 그롭별 권한별 관리가 가능하다.


Step7. 실제로 썼던거 캡쳐해놓은게 아니기 때문에 일단 API Gateway만 접근가능하게끔 해볼까 하고 'AmazonAPIGatewayAdministrator' 하나만 넣었다.

Step8. 이렇게 완성되었다. 새 그룹이. 그리고 'Next: Review' 버튼을 눌러서 담으로 넘어간다.

Step9.

Step10. 사용자 생성하면 AccessKeyID, Secret access key, Password 정보가 나오고, 해당 정보 한번에 들어있는 csv 파일을 다운받아볼 수 있다.
그러면 이제 계정 주고싶은 사람한테 'Password'부분에 'Show'버튼 눌러서 나오는 비번을 던져준다. 물론 Signin 주소도 줘야겠쬬


csv 파일

Step11. 새로 만든 유저로 로그인을 해보자. 로그인url을 들어가면 저렇게 뜬다.

Step12. 로그인 하니까 비번을 바꾸라고 나온다. 루트계정에서 내가 새 계정만들때 Console password를 'Autogenerated'로 해놨기 때문.

Step13. 새로 만든 유저로 콘솔을 들어왔다. IAM 들어가본다.

Step14. IAM 들어오니 다 권한이 없다고 뜬다. 왜냐면 'AmazonAPIGatewayAdministrator' 권한 하나만 넣었기 때문이다.
이 사용자의 권한을 추가하고싶다면 루트계정에서 IAM -> Groups에서 권한을 추가하면 된다.



Lambda ▲top
  • 분류 : 컴퓨팅
  • 설명 - https://aws.amazon.com/ko/lambda/?nc2=h_l3_c
    1. Lambda에서는 사실상 모든 유형의 애플리케이션이나 백엔드 서비스에 대한 코드를 별도의 관리 없이 실행할 수 있습니다. 
    2. 코드를 업로드하기만 하면, Lambda에서 높은 가용성으로 코드를 실행 및 확장하는 데 필요한 모든 것을 처리합니다. 
    3. 다른 AWS 서비스에서 코드를 자동으로 트리거하도록 설정하거나 웹 또는 모바일 앱에서 직접 코드를 호출할 수 있습니다.
  • 내가 써먹은 것들
    1. DynamoDB에 접근 및 제어를 하기 위함
  • 사용과정

Step1. 콘솔에서 Lambda를 들어가서 Lambda Function을 만들어 보자.


Step2. blueprint 선택화면에서 'microservice-http-endpoint' 를 택한다.
이 blueprint는 DynamoDB를 연결시켜주는 라이브러리를 자동으로 import시켜주고,
또한 이력을 자동으로 남겨주는 CloudWatch를 연결시켜준다.

Step3. trigger 설정화면. 'API name'과 'Deployment stage'는 만들어져있는 게 없다면 자동으로 생성된다.

Step4. Lambda Function의 이름을 짓고


Step5. 코딩 후 새로운 Role을 만들어 본다. 이 Role은 IAM에서 확인가능하다.

Step4-5. Lambda 자동완성 코드.

Step6. Trigger 정보까지 확인 후 'Create Function' 한다.


Step7. 그러면 아래와 같이 잘 만들어졌다는 상태 메시지가 나오면 성공이다.

Step8. 'Test'를 눌러서 이제 Lambda Function이 잘 돌아가는 지 확인 할 수 있다.
그러나 아직 우리는 DynamoDB에 아무런 테이블을 만들지 않았으므로,
DynamoDB 설명한 곳에서 테이블을 만들고 돌아오자.


Step9. 아래처럼 'httpMethod'에 메소드 형식을,
'queryStringParameters'.'TableName' 에 DynamoDB에서 생성한 테이블명을 입력 후
'Save and test'를 해본다.


Step9-2. 한번 'Test'버튼으로 세팅이 되면 다음에 'Test'버튼을 누를때 계속 같은 파라미터를 쓰므로,
'Actions'->'Configure test event'로 변경 할 수 있다.

Step10. Lambda에서 'Test'버튼을 누르면 나오는 결과인데, DynamoDB에서 'geoseong'이라는 이름으로
테이블을 만들고 테스트를 했다. Item은 아무것도 안 만들어서 저런 결과가 나왔다.


Step11. 이 결과는 DynamoDB의 'geoseong'테이블에 Item을 하나 추가 한 이후의 테스트 결과이다.

Step12. 이쯤에서 한번 콘솔 이동 후 IAM에 들어가서 좌측 메뉴의 'Roles'를 누르고,
지금 만든 Lambda의 Role을 한번 들어가서 살펴보자.

Step13. 그림에 Policy 별 설명을 써 놓았다. 자세한 Role을 보고 싶다면,
Policy Name컬럼 옆에 있는 'Actions'->'Show Policy'버튼을 눌러서 함 보면 된다.

Step14. 이제 Lambda Function이 구동 되었을 때 자동으로 기록되는 Log를 보러 CloudWatch로 이동해 보자.


Step15. 내가 확인하고자 하는 function을 들어가서 아코디언 형식으로 접혀있는 로그를 하나씩 펼쳐가면서 확인 할 수 있다.
Lambda 코딩에서 'console.log('log')'를 통해서 로그를 남기면 여기서 확인이 가능하다.



DynamoDB ▲top
  • 분류 : 데이터베이스
  • 설명 - https://aws.amazon.com/ko/dynamodb/?nc2=h_l3_db
    1. Amazon DynamoDB는 규모와 관계없이 10밀리초 미만의 지연 시간이 일관되게 요구되는 모든 애플리케이션을 위한 빠르고 유연한 NoSQL 데이터베이스 서비스입니다. 
    2. 완전 관리형 클라우드 데이터베이스로서 문서 모델과 키 값 스토어 모델을 모두 지원합니다. 
    3. Amazon DynamoDB Accelerator(DAX)는 가용성이 뛰어난 완전관리형 인 메모리 캐시로서, 초당 수백만 개의 요청에도 Amazon DynamoDB 응답 시간을 밀리초에서 마이크로초로 단축할 수 있습니다.
  • 사용과정

Step1. DynamoDB에 아무런 테이블이 입력이 안되어있다면 이런 화면이 뜰 것이다.
'Create Table' 버튼 누른다. 우측상단의 region도 잘 살펴본다.

Step2. 'Use default settings'에 체크 풀어서 어케 생겼나 보자

Step3. DynamoDB는 쿼리날릴때 KeyIndex 아니면 아무 컬럼이나
검색기준을 잡을 수 없다. 그래서 설계할 때부터 테이블 검색조건을 염두하고 Index를 추가하도록.
근데 Secondary Index를 추가할때마다 비용이 더 들어가니 참고.. ㅋ

Step4. 테이블을 만들고 테이블 생성 로딩중인 모습


Step5. Keyindex는 'id'밖에 없는 테이블이다. 데이터를 넣어보자.

Step6. 데이터를 넣고 Save

Step7. 데이터가 들어간 모습.



API Gateway ▲top
  • 분류 : 모바일 서비스
  • 설명 - https://aws.amazon.com/ko/api-gateway/?nc2=h_l3_as
    1. Amazon API Gateway는 어떤 규모에서든 개발자가 API를 손쉽게 생성, 게시, 유지 관리, 모니터링 및 보안할 수 있게 해주는 완전관리형 서비스입니다. 
    2. 몇 번의 클릭으로 Amazon Elastic Compute Cloud(EC2)에서 실행되는 워크로드, AWS Lambda에서 실행되는 코드, 기타 웹 애플리케이션 등과 같은 백엔드 서비스의 데이터, 비즈니스 로직 또는 기능에 애플리케이션이 액세스하게 해주는 "현관문" 역할을 하는 API를 생성할 수 있습니다.
    3. Amazon API Gateway는 트래픽 관리, 권한 부여 및 액세스 제어, 모니터링, API 버전 관리를 비롯해 최대 수십만 건의 동시 API 호출을 수락 및 처리하는 데 관련된 모든 작업을 처리합니다.
  • 사용과정

Step1. 저 API는 앞선 Lambdafunction 만들때 Trigger가 발동되어서
자동으로 설정 및 생성된 API이다. 클릭해서 들어가보자.


Step2. 좌측메뉴의 Resources를 눌러서, 'triggerDynamo1'의 'ANY'메소드를 누르면 나오는 화면이다.
개인적으로 POSTMAN이라는 툴으로 테스트하기 귀찮다면 API Gateway의 'TEST'버튼으로 테스트한다.

Step3. Method Request부분을 들어갔을때의 화면이다.
'API Key Required'는 이 Lambda펑션을 아무나 못들어가게 하고 싶을 때 'true'로 바꾼다.
API Key는 그냥 만드는게 아니고, 좌측메뉴에 'API Keys'를 눌러서 설정한다.

Step4. Integration Request를 들어갔을때의 화면.
Lambda의 Region과 Function을 연동시키는 곳이다. 언제든 바꿀수있다.

Step5. 그리고 메소드를 들어갈때 요구되는 파라미터를 어떤 이름으로 받을 지 설정하는 곳은
'Body Mapping Templates'를 펼쳐서, 'Add mapping template'로 추가를 시키면 된다.
개인적으로는 body-json을 body로 단순하게 바꿨다.

Step6. 설정이 다 끝났다고 생각하면 오산이다 절대! ㅋ
'Actions'에서 'Deploy API'를 통해서 Deploy를 해야지 실제로 Lambda펑션이 태어난다.


Step7. 'Deployment stage'에는 좌측메뉴의 'Stages'에 Lambda펑션 만들때 미리 생성된(그렇다고생각ㅋ)
stage이름이 나올 것이다. 물론 저 콤보박스를 펼쳐서 '[New Stage]'를 해도 된다. 나는 그냥 'Deploy'할거다 ㅋ

Step8. 이제 공식적으로 Lambda펑션이 세상밖으로 나왔다. 좌측메뉴의 'Stages'를 들어간 모습
그리고 접근주소가 발급되었다.


Step9. Lambda펑션들을 코딩으로 접근할 수 있게 친절하게 라이브러리를 제공한다.
이게 대단한게 내가 만든 Lambda펑션을 만들때마다 자동으로 코드를 완성시켜서 갖고 있기 때문에,
내가 새로운 Lambda펑션을 만들고 SDK를 다운받으면
기존의 내용과 다르게 새로 만든 Lambda펑션에 접근하는 메소드가 생긴것을 확인할 수 있다.

Step10. 이렇게 새로 생성된 API stage주소로 파라미터를 넣어서 들어가 보았다. 결과 잘 나온다.


Step11. 참고로 SDK를 통해서 Lambda에 접근하려면,
해당하는 펑션의 'Method Request'에서 'Authorization'을 'AWS_IAM'으로 바꿔서 저장해야 접근된다.



+ Recent posts