서버 프레임워크 vs SAM vs AWS CDK 없음

현재 AWS에서 서버 없는 프로그램을 구축할 때, 프로젝트의 개발, 테스트, 배치를 돕는 몇 가지 다른 도구 패키지가 있습니다.Serverless Framework는 오랫동안 국왕이었지만 AWS SAMCDK는 최근 점점 인기를 끌고 있다.그러나 새로운 프로젝트 중 어느 것이 가장 좋은지, 그들 사이에는 어떤 차이가 있을까.어쨌든 Cloudformation 템플릿을 만드는 도구일 뿐입니다. 그렇죠?
모든 옵션의 장단점을 이해하기 위해서, 나는 이 세 가지 옵션 중에서 같은 예시 응용 프로그램을 구축하고, 이러한 방법을 비교하기로 결정했다.
이 글의 마지막 부분에서 나는 네가 서버 프레임워크가 없고AWS SAM과 CDK에 대해 기본적으로 알고 자신의 수요와 취향에 따라 다음 프로젝트에 가장 적합한 내용을 현명하게 선택할 수 있기를 바란다.

우리의 예시 응용 프로그램


재미를 유지하기 위해 우리가 모든 프레임워크를 보여주는 응용 프로그램은 전형적인 ToDo 응용 프로그램이 아니라 ToDont 응용 프로그램일 것이다.사용자는 API 게이트웨이에 POST 요청을 보내서 자신이 하지 말아야 할 일을 설명할 수 있습니다. Lambda 함수는 ToDont 항목을 SQS 대기열에 넣고 버퍼로 사용하며, 마지막 Lambda 함수는 버퍼 대기열을 사용합니다. 이 항목에 대해 복잡한 처리를 하는 척하고 다이나모DB 테이블에 저장합니다.

응용 프로그램 구조는 매우 간단하고 이해하기 쉽지만 실제 응용 프로그램과 비슷할 정도로 복잡하다.코드의 치밀성과 가독성을 유지하기 위해서는 때때로 최선의 실천과 상식을 소홀히 해야 한다.모든 설정은 완전하고 기능이 완비되어 있지만, 이 예시들을 가지고 프로그램을 직접 배치하고 싶다면 코드와 완전한 예시를 찾을 수 있다. here
다음 Lambda 함수는 다음과 같습니다.
// src/post.js
const { SQS } = require('@aws-sdk/client-sqs');

const sqs = new SQS();

const handler = async (event) => {
  console.log('event', event);
  const { id, title } = JSON.parse(event.body);

  await sqs.sendMessage({
    QueueUrl: process.env.QUEUE_URL,
    MessageBody: JSON.stringify({
      id,
      title,
    })
  });

  return {
    statusCode: '200',
  };
};

module.exports = { handler };
람바다 과정은 이렇습니다.
// src/process.js
const { DynamoDB } = require('@aws-sdk/client-dynamodb');
const { marshall } = require("@aws-sdk/util-dynamodb");

const ddb = new DynamoDB();

const handler = async (event) => {
  console.log('event', event);

  const tasks = event.Records.map((record) => {
    const { id, title } = JSON.parse(record.body);
    return ddb.putItem({
      TableName: process.env.TABLE_NAME,
      Item: marshall({
        title,
        id,
      }),
    });
  });

  return Promise.all(tasks);
};

module.exports = { handler };

선결 조건


어플리케이션을 따라가서 배포하려면 다음 사항에 유의하십시오.

  • 아래의 모든 비교는 다음 패키지를 프로젝트에 의존항으로 설치했다고 가정합니다
  • @aws-sdk/client-dynamodb
  • @aws-sdk/util-dynamodb
  • @aws-sdk/client-sqs
  • 아래 패키지 관리자와 스크립트 실행 프로그램은 실을 사용하지만 명령을 대체할 수 있는 NPM을 사용할 수 있습니다.
  • 모든 예는 당신이 설정한 것으로 가정합니다AWS credentials default profile
  • 서버 프레임워크 없음


    Serverless 프레임워크(이하 "Serverless")는 이미 오랫동안 존재해 왔고 오랫동안 대부분의 지역사회의 첫 번째 프레임워크가 되었다.CloudFormation의 더 나쁜 부분을 추상적으로 간소화하고 응용 프로그램의 테스트와 배치를 간소화하는 간단한 도구입니다.
    서버 없는 CLI를 실행하는 첫 번째 방법은 실행 yarn add serverless -D 을 통해 프로젝트에 (dev) 의존항으로 설치한 다음, 응용 프로그램과 기초 구조를 정의하는 데 사용되는 파일 하나만 serverless.yml 을 실행하는 것이다.전체 구성 참조here를 찾을 수 있지만 간단히 말해서 서버가 없습니다.yml은 두 부분으로 구성되어 있습니다.
  • 응용 프로그램 창고, AWS 환경 및 lambda 함수를 설명하기 위한 서버 프레임워크 설정 없음
  • 클라우드 정보 자원으로 정의된 다른 인프라, 예를 들어 DynamoDB 테이블과 SQS 대기열 등.
  • 다음은 저희 응용 프로그램serverless.yml의 외관입니다.
    // serverless.yml
    service: sls-todont
    
    provider:
      name: aws
      region: eu-north-1
      runtime: nodejs14.x
      environment: # Inject environment variables
        TABLE_NAME: ${self:custom.tableName}
        QUEUE_URL: !Ref todontsQueue
      iamRoleStatements: # Configure IAM role statements
        - Effect: Allow
          Action: sqs:sendMessage
          Resource: ${self:custom.queueArn}
        - Effect: Allow
          Action: dynamodb:putItem
          Resource: ${self:custom.tableArn}
    
    custom: # Custom variables that we can reference elsewhere
      tableName: ${self:service}-table
      queueName: ${self:service}-queue
      tableArn: # Get ARN of table with CloudFormation helper
        Fn::GetAtt: [todontsTable, Arn]
      queueArn: # Get ARN of queue with CloudFormation helper
        Fn::GetAtt: [todontsQueue, Arn]
    
    functions: # Define our two Lambda functions
      post:
        handler: src/post.handler
        events: # Invoke on post requests to /todonts
          - http:
              method: post
              path: todonts
      process:
        handler: src/process.handler
        events: # Consume SQS queue
          - sqs:
              arn: ${self:custom.queueArn}
    
    # CloudFormation below to define our infrastructure resources
    resources: 
      Resources:
        todontsTable:
          Type: AWS::DynamoDB::Table
          Properties:
            TableName: ${self:custom.tableName}
            AttributeDefinitions:
              - AttributeName: id
                AttributeType: S
            KeySchema:
              - AttributeName: id
                KeyType: HASH
            BillingMode: 'PAY_PER_REQUEST'
        todontsQueue:
          Type: AWS::SQS::Queue
          Properties:
            QueueName: ${self:custom.queueName}
    
    이제 응용 프로그램을 배치하려면 yarn serverless deploy만 실행하면 됩니다.
    서버 없는 CLI에는 배포된 함수의 로그를 인쇄하거나 추적하거나 yarn serverless logs --function process [--tail]를 실행하여 호출할 수 있는 유틸리티 기능이 포함되어 있습니다.그러나 개발 과정에서 대부분의 시간을 이 함수를 호출하지 않습니다.반대로 Serverless는 로컬에서 함수를 시뮬레이션하고 실행할 수 있으며, 실행 yarn serverless invoke --function process 을 통해 이를 실현할 수 있습니다.
    ➕ 찬성 의견
  • 대규모 도움말 커뮤니티
  • 플러그인 생태계
  • 구성이 단순하고 유연한 다변화 지원
  • 뛰어난 디버깅 및 테스트 유틸리티
  • ➖ 기만하다
  • 인프라 시설의 일부 부분에 대해 대부분의 응용 프로그램은 클라우드 정보 정의를 사용해야 한다
  • 구성 및 구성 요소 공유가 어려움
  • YAML 구성에만 해당됩니다.기술적으로 JS로 구성을 작성할 수 있지만 관련 문서가 거의 없습니다
  • 많은 개발자들이 서버 없는 설정과 클라우드 포메이션 설정 사이의 경계가 도대체 어디에 있는지, 아니면 왜 파일 사이의 문법을 변경해야 하는지 이해하려고 노력하는 것을 보았다
  • 리소스:
    Get started with Serverless Framework
    Serverless Stack tutorial for deplying a production Serverless app


    서버 없는 프레임워크SAM(또는 서버 없는 응용 프로그램 모델)와 매우 비슷하다. 이것은 추상적인 층과 CLI의 조합으로 전자는 클라우드 컴퓨팅을 간소화하는 데 사용되고 후자는 응용 프로그램을 테스트하고 배치하는 실용 프로그램을 가진다.
    Here's SAM CLI에 대한 공식 설치 지침입니다. 시스템에서 CLI를 전체적으로 설치합니다.SAM 사용yarn serverless invoke local --function post 파일은 응용 프로그램의 이름, 배치 위치와 방식, 그리고 samconfig.toml 파일은 응용 프로그램이 사용할 실제 자원을 설명한다.template.yml 형식은 CloudFormationtemplate anatomy 템플릿을 따르지만 a few added fields가 있습니다.어디 보자.
    // template.yml
    # Boilerplate to identify template as SAM template
    AWSTemplateFormatVersion: 2010-09-09
    Transform: AWS::Serverless-2016-10-31
    Description: sam-todonts
    
    Globals:
      Function:
        Runtime: nodejs14.x
        Environment: # Inject environment variables
          Variables:
            QUEUE_URL: 
              Ref: TodontsQueue
            TABLE_NAME:
              Ref: TodontsTable
    
    Parameters: # Parameters which can be filled by the CLI on deploy
      TableName: 
        Description: Name of DynamoDB table
        Type: String
        Default: sam-todonts-table
      QueueName:
        Description: Name of SQS queue
        Type: String
        Default: sam-todonts-queue
    
    Resources: 
      PostFunction:
        Type: AWS::Serverless::Function
        FunctionName: sam-todonts-post
        Properties:
          Handler: src/post.handler
          Events:
            Post: #  Invoke on post requests to /todonts
              Type: HttpApi
              Properties:
                Path: /todonts
                Method: post
          Policies:
            - SQSSendMessagePolicy: # Use predefined IAM policy
                QueueName:
                  Fn::GetAtt: [TodontsQueue, QueueName]
    
      ProcessFunction:
        Type: AWS::Serverless::Function
        Properties:
          Handler: src/process.handler
          Events:  # Consume SQS queue
            SQSQueueEvent:
              Type: SQS
              Properties:
                Queue:
                  Fn::GetAtt: [TodontsQueue, Arn]
          Policies: # Use predefined IAM policy
            - DynamoDBWritePolicy:
                TableName:
                  Ref: TodontsTable
    
      TodontsTable:
        Type: AWS::DynamoDB::Table
        Properties:
          TableName: sam-todonts-table
          AttributeDefinitions:
            - AttributeName: id
              AttributeType: S
          KeySchema:
            - AttributeName: id
              KeyType: HASH
          BillingMode: PAY_PER_REQUEST
    
      TodontsQueue:
        Type: AWS::SQS::Queue
        Properties:
          QueueName: sam-todonts-queue
    
    
    구성이 다소 지루하지만 다행히 CLI는 실행template.yml을 수행하고 계획 수립에 대한 질문에 답함으로써 시작점을 찾을 수 있습니다.
    우리는 sam init를 실행하여 samconfig.toml 파일을 생성하고 동시에 배치할 수 있다.
    마찬가지로 서버 프레임워크가 없는 CLI와 매우 비슷하며 SAM은 응용 프로그램을 테스트하고 디버깅하기 위해 유틸리티 기능을 탑재했다.sam deploy --guided Lambda 함수를 실행하거나 관리되는 함수를 실행하는 로컬 HTTP 서버를 시작할 수 있습니다.실행 sam local invoke [functionName] 을 통해 배치된 함수에서 로그를 쉽게 얻을 수 있습니다.
    응용 프로그램의 정의와 응용 프로그램을 두 개의 서로 다른 파일에 어떻게 구축하는가의 장점은 sam local start-api 파일을 매우 통용적으로 작성할 수 있기 때문에 공유와 중복 사용이 가능하고 프로젝트마다 다른 sam logs --name [functionName] 파일만 있으면 된다는 것이다.SAM은 청록색 배포를 위해 CodeBuild와도 잘 통합되어 있습니다.
    ➕ 찬성 의견
  • 템플릿 공유 및 재사용 지원
  • AWS 건조 파이프
  • 와 잘 통합
  • 뛰어난 디버깅 및 테스트 유틸리티
  • CDK
  • 와 함께 사용 가능
    ➖ 기만하다
  • 상세 구성
  • CLI에는 배포된 어플리케이션을 제거하는 것과 같은 일부 기능이 없습니다.
  • 리소스:
    Getting started with AWS SAM
    Serverless Application Repository
    Serverless Patterns Collection

    AWS CDK


    AWSCloud Development Kit (CDK)는 서버 없는 프로그램을 만드는 도구가 아니라 완전한 기초 구조인 코드 프레임워크로 설정이 아닌 코드를 사용하여 프로그램을 정의할 수 있습니다.
    실행template.yml을 통해 CDK CLI를 설치한 다음 실행samconfig.toml을 통해 초보자 프로젝트를 생성할 수 있습니다.init 명령을 실행하면 일련의 프로젝트 구성 파일과 템플릿 파일이 생성되지만 ToDont 응용 프로그램을 설명한 후 yarn global add aws-cdk 파일의 모양을 보여 줍니다.
    // lib/cdk-stack.ts
    import * as cdk from '@aws-cdk/core';
    import lambda = require('@aws-cdk/aws-lambda-nodejs');
    import sqs = require('@aws-cdk/aws-sqs');
    import dynamodb = require('@aws-cdk/aws-dynamodb');
    import { ApiEventSource, SqsEventSource } from '@aws-cdk/aws-lambda-event-sources';
    import { Runtime } from '@aws-cdk/aws-lambda';
    
    export class CdkStack extends cdk.Stack {
      constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
    
        // define our DynamoDB table
        const dynamoTable = new dynamodb.Table(this, 'cdk-todonts-table', {
          tableName: 'cdk-todonts-table',
          partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
        });
    
        // define our SQS buffer queue
        const sqsBuffer = new sqs.Queue(this, 'cdk-todonts-queue', {
          queueName: 'cdk-todonts-queue',
        });
    
        // define our processing lambda
        const processLambda = new lambda.NodejsFunction(this, 'cdk-todonts-process', {
          runtime: Runtime.NODEJS_14_X,
          handler: 'handler',
          entry: 'src/process.js',
          events: [new SqsEventSource(sqsBuffer)],
          environment: {
            TABLE_NAME: dynamoTable.tableName
          }
        });
    
        // grant write access for the processing lambda to our dynamo table
        dynamoTable.grantWriteData(processLambda);
    
        // define the lambda backing our API
        const postLambda = new lambda.NodejsFunction(this, 'cdk-todonts-post', {
          runtime: Runtime.NODEJS_14_X,
          entry: 'src/post.js',
          handler: 'handler',
          events: [new ApiEventSource('POST', '/todonts')],
          environment: {
            QUEUE_URL: sqsBuffer.queueUrl,
          }
        });
    
        // grant write access to the SQS buffer queue for our API lambda
        sqsBuffer.grantSendMessages(postLambda);
      }
    }
    
    
    CDK 응용 프로그램의 기본 구축 블록은 constructs이라고 불리는데 이것은 하나의 서비스 실례(예를 들어 SQS 대기열)든 구성 요소에 봉인된 서비스든 하나의'클라우드 구성 요소'를 대표한다.그 다음에 구조는 프로젝트 간에 공유하고 다시 사용할 수 있으며 아주 좋은 지역사회가 있습니다. 이 지역사회는 당신에게 대량의 고품질의 구성 요소를 만들어 놓았습니다.코드에서 응용 프로그램과 인프라를 완전하게 설명하는 것도 우리write actual tests가 우리의 설정에 대항할 수 있다는 것을 의미한다. 정말 멋있지 않니?
    첫 번째 응용 프로그램에 응용 프로그램을 배치하기 전에, CDK가 응용 프로그램을 배치하는 데 사용할 자원을 제공하기 위해서 bootstrap the AWS environment (계정과 지역 조합) 이 필요합니다.이후에 우리는 cdk init app --language --language typescript를 실행하여 우리의 응용 프로그램을 배치할 수 있다.
    CDK CLI는 SAM과 Serverless처럼 테스트와 디버깅에 같은 실용 프로그램을 제공하지 않지만, 이 격차를 메우는 데 도움을 줄 수 있다.또 하나의 새로운 구성원use the SAM CLI together with the CDK은 CDK의 확장으로 많은 테스트 실용 프로그램과 서버가 없는 특정한 구조를 가져왔다.
    ➕ 찬성 의견
  • 구성 요소 공유 및 재사용 지원
  • 대규모 도움말 커뮤니티
  • 인프라 테스트 가능

  • Serverless-Stack 어플리케이션 인프라를 실제 어플리케이션으로 정의
  • ➖ 기만하다
  • 배포된 기능의 로그를 호출하거나 인쇄하려면 SAM 또는 AWS CLI와 같은 추가 도구가 필요합니다.
  • 리소스:
    You can (likely) use the same programming language
    Getting started with the AWS CDK
    CDK Patterns

    CDK 일 마무리


    현재 이 분야에서 많은 일이 벌어지고 있다. 이 세 명이 현재 가장 걸출한 선수라고 생각하지만 좌우 양쪽에 대안이 나왔다.모든 프레임워크는 자신의 장점과 장점을 가지고 프로젝트에서 가장 효과적인 프레임워크를 선택할 때 오류나 정확한 부분이 드물다.
    어떤 것이 당신이 가장 좋아하는지, 왜!
    만약 당신이 이 글을 좋아하고 더 많은 것을 보고 싶다면 트위터에서 저를 주목해 주십시오. 저는 항상 그곳에서 서버가 없는 기술, AWS와 개발자의 생산력에 관한 글을 씁니다!

    좋은 웹페이지 즐겨찾기