DevOps BootCamp/마이크로서비스

AWS 서버리스 애플리케이션 배포

cloudmaster 2023. 5. 9. 22:38
SAM(serverless application model)

대표적인 기능

  • 한 번에 배포
    • Lambda 함수, API Gateway 등의 리소스를 CLI 명령어 한 번으로 배포가 가능하게 만들 수 있습니다.
  • 로컬에서의 테스트
    • 꼭 배포하지 않아도 로컬 환경에서 테스트가 가능합니다.
  • AWS CloudFormation 기능을 이용한 단일 작업을 통한 리소스(인프라) 관리
    • AWS CloudFormation은 이후에 배우게 될 Terraform과 같은 Infrastructure as Code 도구입니다

 

SAM 대안
serverless 범용성이 좀 더 좋다 멀티 클라우드에
terraform 사용할 수 있지만 서버리스위한 툴은아님

 

 

sam으로 기본적인 Hello World 애플리케이션 배포

 

SAM 설치(Mac)

 

1. SAM 설치 전 사전 조건

  • AWS 계정 생성
  • IAM 권한 및 AWS 자격 증명
    터미널에 AWS configure를 친후 IAM에서 발급받은 aws 인증키를 입력해줘서 인증해줘야함
  • docker 설치
  • homebrew 설치
  • aws sam cli 설치
brew install aws-sam-cli

설치 후 잘 깔려있는지 확인

sam --version

 

HelloWorld 출력하는 애플리케이션 배포

[참고] https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html

 

Tutorial: Deploying a Hello World application - AWS Serverless Application Model

If you don't have Python on your local machine, use the sam build --use-container command instead. The AWS SAM CLI will create a Docker container that includes your function's runtime and dependencies. This command requires Docker on your local machine. To

docs.aws.amazon.com

 

잠깐 !! 본격적인 서버리스 배포 전에 Lambda에 대한 적절한 권한을 추가해 주어야 한다.

 

 

Sprint1) API Gateway를 활용한 서버리스 애플리케이션 배포

Step 1: API Gateway - Lambda 배포 Instruction

 

  • git clone 하기
git clone https://github.com/aws-samples/serverless-patterns/ 
cd serverless-patterns/lambda-dynamodb

 

  • 현재 람다가 런타임 node 14.x를 지원하므로 template.yaml 파일 수정
Runtime: node.js14.x

 

  • 변경사항 sam build

 

  • sam 으로 배포
sam deploy --guided

 

잘 동작 하는지 확인

202 state가 도착하면 성공!

 

 

STEP 2: API 게이트웨이 - Lambda

 1. 트리거 추가 버튼을 누른다

 

 2. 추가 트리거에서 다음 옵션을 통해 API 게이트웨이를 생성한다.

  • API 게이트웨이를 선택
  • 새 API를 생성
  • REST API 유형
  • 보안은 "열기"

 

 3. 이제 API 엔드포인트에 HTTP 요청을 보내면, 함수를 호출할 수 있다. 요청의 상세 내용이 DynamoDB에 저장된다.

 

 

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

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

 > API 게이트웨이 부분을 클릭해 게이트웨이 탭으로 들어간다

 

 > 왼쪽에 리소스를 클릭 -> 작업 클릭 -> 메서드 생성

 

 > 박스에 원하는 메서드 선택하고 체크 표시 클릭

 

 > 작업 메뉴에서 API 배포 클릭

 

 > POST 클릭 -> 테스트 클릭

 

 > 요청 본문에 JSON 적기

 

 > DynamoDB 콘솔로 이동 -> 왼쪽 탭 항목 탐색 -> 데이터가 추가된 것을 확인할 수 있음

 

  • 본문만 저장하도록 만들기
  • API 키를 이용한 인증 추가하기

[참고] https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/api-gateway-create-usage-plans-with-console.html#api-gateway-usage-plan-create

 

API Gateway 콘솔을 사용하여 사용량 계획 생성, 구성 및 테스트 - Amazon API Gateway

API 키는 하나 이상의 사용량 계획과 연결할 수 있습니다. 사용량 계획은 하나 이상의 단계와 연결할 수 있습니다. 그러나 지정된 API 키는 API의 각 단계에 대하여 단 하나의 사용량 계획에만 연결

docs.aws.amazon.com

순서

 1. apigateway -> API 키 클릭

 

 2. 작업 -> API 키 생성 클릭

 

3.  이름: 아무거나, API 키: 자동 생성 한 후 -> 저장

 

 4. 

5. 왼쪽 탭 사용량 계획 -> 생성

 6.  리소스 -> POST 메서드 클릭 -> 메서드 요청 클릭

 

7. API 키가 필요함 -> true로 설정 후 저장

 

 8. API 키 표시 클릭

 

 9.  postman에 헤더 x-api-key 벨류 값으로 생성된 apikey 입력 후 테스트

 > x-api-key 쓰는 이유: 인증보다는 Throttling 목적으로 생성되는 것이 일반적 

 > Throttling: API 요청에 속도와 횟수를 제한하는

 

 10. 추가된 것을 알 수 있다

 

  • 권한 부여자를 이용한 인증 부여하기

1. 함수생성
2. 함수값 입력

// A simple token-based authorizer example to demonstrate how to use an authorization token 
// to allow or deny a request. In this example, the caller named 'user' is allowed to invoke 
// a request if the client-supplied token value is 'allow'. The caller is not allowed to invoke 
// the request if the token value is 'deny'. If the token value is 'unauthorized' or an empty
// string, the authorizer function returns an HTTP 401 status code. For any other token value, 
// the authorizer returns an HTTP 500 status code. 
// Note that token values are case-sensitive.

exports.handler =  function(event, context, callback) {
    var token = event.authorizationToken;
    switch (token) {
        case 'allow':
            callback(null, generatePolicy('user', 'Allow', event.methodArn));
            break;
        case 'deny':
            callback(null, generatePolicy('user', 'Deny', event.methodArn));
            break;
        case 'unauthorized':
            callback("Unauthorized");   // Return a 401 Unauthorized response
            break;
        default:
            callback("Error: Invalid token"); // Return a 500 Invalid token response
    }
};

// Help function to generate an IAM policy
var generatePolicy = function(principalId, effect, resource) {
    var authResponse = {};
    
    authResponse.principalId = principalId;
    if (effect && resource) {
        var policyDocument = {};
        policyDocument.Version = '2012-10-17'; 
        policyDocument.Statement = [];
        var statementOne = {};
        statementOne.Action = 'execute-api:Invoke'; 
        statementOne.Effect = effect;
        statementOne.Resource = resource;
        policyDocument.Statement[0] = statementOne;
        authResponse.policyDocument = policyDocument;
    }
    
    // Optional output with custom properties of the String, Number or Boolean type.
    authResponse.context = {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": true
    };
    return authResponse;
}

 

3. API 게이트웨이로 이동

4. 권한부여자 -> 생성

  > 토큰 형식에 토큰 소스로 'authorizationToken'입력 후 생성

 

5. test값에 allow 입력하여 응답 코드 200이 나오면 테스트성공

 

6. 리소스에 메소드 요청 클릭

7. 승인에 권한부여자 이름 입력

 

8. API 배포 클릭

9. 포스트맨 헤더 값에 키는 authorizationToken, 값은 allow입력 후 send -> 200나오면 성공

'DevOps BootCamp > 마이크로서비스' 카테고리의 다른 글

서버리스 사진첩  (0) 2023.05.11
API Gateway  (1) 2023.05.09
AWS Lambda  (0) 2023.05.09
CQRS  (0) 2023.05.08
메시지 브로커를 이용한 비동기식 통신  (0) 2023.05.08