[Sprint] API Gateway와 서버리스 애플리케이션

# 학습 목표

  • 다음 아키텍처로 구성된 서버리스 애플리케이션을 배포합니다.
  • 직접 API Gateway로 실행해 봅니다.
  • API Gateway의 인증 기능을 이용해서, HTTP 요청에 특정 API Key를 사용하는 예제를 다음 두 가지 방법으로 구현합니다.
  • CloudWatch Logs를 통해서 API 호출을 모니터링할 수 있어야 합니다.

# 해결 과제

Step 1: API Gateway – Lambda 배포 Instruction

  1. 먼저 lambda 함수와 API Gateway 세팅을 한꺼번에 할 수 있게 SAM을 이용한다
  2. 현재 람다가 런타임 nodejs 14.x을 지원하므로 template.yaml 파일에서 Runtime 부분을 찾아 다음과 같이 바꾼다.
1 - Runtime: nodejs12.x
2 + Runtime: nodejs14.x
  1. 사용자 컴퓨터에 node.js 런타임을 설치한다.
  2. sam build를 통해 빌드가 되는지 확인해 본다.
  3. sam deploy –guided를 통해 배포를 시도한다.
  4. 람다 및 DynamoDB에 어떤 리소스가 생성이 되었는지 직접 콘솔에 들어가서 확인해보게 한다.
  5. 잘 작동되는지 명령어를 통해 확인한다.202 status가 도착하면 성공!

STEP 2: API 게이트웨이 – Lambda

  1. 트리거 추가 버튼을 누른다
  2. 추가 트리거에서 다음 옵션을 통해 API 게이트웨이를 생성한다.
  • API 게이트웨이를 선택
  • 새 API를 생성
  • REST API 유형
  • 보안은 "열기"
  1. 이제 API 엔드포인트에 HTTP 요청을 보내면, 함수를 호출할 수 있다. 요청의 상세 내용이 DynamoDB에 저장된다.

STEP 3: API 게이트웨이에 제한 추가하기

아래 세 개는 꼭 실습해 보세요

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

# 실습 자료

sprint-serverless-apigateway


# 과제 항목별 진행 상황

STEP 1 : API Gateway – Lambda 배포 Instruction

SAM(Serverless Application Model) sample code 로컬로 clone 후 node 버전 변경

/lambda-dynamodb
├──  response.json
├── README.md
├── package-lock.json
├── response.json
├── samconfig.toml
├── src
│   ├── app.js
│   └── package.json
└── template.yaml (open↓)
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  Persist an item to a DynamoDB table from Lambda
Resources:
##
#   Lambda Function                                                      #
##
  LambdaPutDynamoDB:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: app.handler
      Runtime: nodejs14.x
.
.
.

수정 후 sam deploy —guided

$ sam deploy --guided

Configuring SAM deploy
======================

        Looking for config file [samconfig.toml] :  Found
        Reading default arguments  :  Success

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [Lambda-Put-DynamoDB]:
        AWS Region [ap-northeast-2]:
        #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
        Confirm changes before deploy [y/N]:
        #SAM needs permission to be able to create roles to connect to the resources in your template
        Allow SAM CLI IAM role creation [Y/n]:
        #Preserves the state of previously provisioned resources when an operation fails
        Disable rollback [y/N]:
        Save arguments to configuration file [Y/n]:
        SAM configuration file [samconfig.toml]:
        SAM configuration environment [default]:

        Looking for resources needed for deployment:

        Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-1klk1ed3oqx09
        A different default S3 bucket can be set in samconfig.toml and auto resolution of buckets turned off by setting resolve_s3=False

        Saved arguments to config file
        Running 'sam deploy' for future deployments will use the parameters saved above.
        The above parameters can be changed by modifying samconfig.toml
        Learn more about samconfig.toml syntax at
        https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html

        Uploading to Lambda-Put-DynamoDB/767349269ed03c78098dd31681cf08ab  1131323 / 1131323  (100.00%)

        Deploying with following values
        ===============================
        Stack name                   : Lambda-Put-DynamoDB
        Region                       : ap-northeast-2
        Confirm changeset            : False
        Disable rollback             : False
        Deployment s3 bucket         : aws-sam-cli-managed-default-samclisourcebucket-1klk1ed3oqx09
        Capabilities                 : ["CAPABILITY_IAM"]
        Parameter overrides          : {}
        Signing Profiles             : {}

Initiating deployment
=====================

        Uploading to Lambda-Put-DynamoDB/75ba76c9320f25459dac16d64527e0a4.template  1158 / 1158  (100.00%)


Waiting for changeset to be created..

CloudFormation stack changeset
---------------------------------------------------------------------------------------------------------
Operation                  LogicalResourceId          ResourceType               Replacement
---------------------------------------------------------------------------------------------------------
+ Add                      DynamoTable                AWS::DynamoDB::Table       N/A
+ Add                      LambdaPutDynamoDBRole      AWS::IAM::Role             N/A
+ Add                      LambdaPutDynamoDB          AWS::Lambda::Function      N/A
---------------------------------------------------------------------------------------------------------


Changeset created successfully. arn:aws:cloudformation:ap-northeast-2:159088646233:changeSet/samcli-deploy1683633231/e679b728-d8b3-4479-aed9-d6770c9d488c


2023-05-09 20:53:57 - Waiting for stack create/update to complete

CloudFormation events from stack operations (refresh every 5.0 seconds)
---------------------------------------------------------------------------------------------------------
ResourceStatus             ResourceType               LogicalResourceId          ResourceStatusReason
---------------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS         AWS::DynamoDB::Table       DynamoTable                -
CREATE_IN_PROGRESS         AWS::DynamoDB::Table       DynamoTable                Resource creation
                                                                                 Initiated
CREATE_COMPLETE            AWS::DynamoDB::Table       DynamoTable                -
CREATE_IN_PROGRESS         AWS::IAM::Role             LambdaPutDynamoDBRole      -
CREATE_IN_PROGRESS         AWS::IAM::Role             LambdaPutDynamoDBRole      Resource creation
                                                                                 Initiated
CREATE_COMPLETE            AWS::IAM::Role             LambdaPutDynamoDBRole      -
CREATE_IN_PROGRESS         AWS::Lambda::Function      LambdaPutDynamoDB          -
CREATE_IN_PROGRESS         AWS::Lambda::Function      LambdaPutDynamoDB          Resource creation
                                                                                 Initiated
CREATE_COMPLETE            AWS::Lambda::Function      LambdaPutDynamoDB          -
CREATE_COMPLETE            AWS::CloudFormation::Sta   Lambda-Put-DynamoDB        -
                           ck
---------------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
------------------------------------------------------------------------------------------------------------
Outputs
------------------------------------------------------------------------------------------------------------
Key                 DynamoDbTable
Description         DynamoDb Table
Value               Lambda-Put-DynamoDB-DynamoTable-1MW4JSVZRJPFN

Key                 LambdFunction
Description         LambdaPutDynamoDB function  Arn
Value               Lambda-Put-DynamoDB-LambdaPutDynamoDB-cd1IuekX6y51
------------------------------------------------------------------------------------------------------------


Successfully created/updated stack - Lambda-Put-DynamoDB in ap-northeast-2
$ aws lambda invoke --function-name arn:aws:lambda:ap-northeast-2:159088646233:function:Lambda-Put-DynamoDB-LambdaPutDynamoDB-cd1IuekX6y51 --invocation-type Event  --payload '{ "Metadata": "Hello" }'  response.json --cli-binary-format raw-in-base64-out
{
    "StatusCode": 202
}
# 배포 성공

STEP 2: 트리거 추가 API 게이트웨이 – Lambda

STEP 3: API 게이트웨이에 제한 추가하기

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

API 배포 후 결과

  • 본문만 저장하도록 만들기

Lambda 함수 코드 수정

코드 수정후 테스트 Postman → DynamoDB 확인

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

API Gateway에서 API 키가 필요함 falsetrue 로 변경후 API 배포

사용량 계획 생성

스테이지 연결

사용량 계획 API 키

API Key 복사

테스트 진행

  • 권한 부여자를 이용한 인증 부여하기 (optional)
  1. Amazon Cognito 사용자 풀 생성
  1. Amazon Cognito 리소스 서버 설정

리소스 서버 생성

앱 클라이언트 사용자 지정 범위 설정

  1. API 권한 부여자 생성
  1. API 승인 설정 변경
  1. API 배포
  1. API 테스트

Amazon Cognito 사용자 가입 Cognito 호스팅 페이지로 접속하여 Sign up 진행

Amazon Cognito 사용자 로그인

http://localhost로 redirect 되며, 권한 부여 코드 획득

권한 부여 코드를 사용하여 토큰 획득

액세스 토큰을 사용하여 API 호출


# TROUBLE SHOOTING LOG

💡 API Key 이용하여 Postman에서 테스트 진행시 Key 값을 x-api-key로 사용해야 함

원인

API Key 이름으로 인증헤더에 넣어서 POST를 진행하면 인증 안됨

해결 방안


#References

Leave a Comment