서버 프레임워크 vs SAM vs AWS CDK 없음
34768 단어 tutorialawscdkserverless
모든 옵션의 장단점을 이해하기 위해서, 나는 이 세 가지 옵션 중에서 같은 예시 응용 프로그램을 구축하고, 이러한 방법을 비교하기로 결정했다.
이 글의 마지막 부분에서 나는 네가 서버 프레임워크가 없고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
서버 프레임워크 없음
Serverless 프레임워크(이하 "Serverless")는 이미 오랫동안 존재해 왔고 오랫동안 대부분의 지역사회의 첫 번째 프레임워크가 되었다.CloudFormation의 더 나쁜 부분을 추상적으로 간소화하고 응용 프로그램의 테스트와 배치를 간소화하는 간단한 도구입니다.
서버 없는 CLI를 실행하는 첫 번째 방법은 실행
yarn add serverless -D
을 통해 프로젝트에 (dev) 의존항으로 설치한 다음, 응용 프로그램과 기초 구조를 정의하는 데 사용되는 파일 하나만 serverless.yml
을 실행하는 것이다.전체 구성 참조here를 찾을 수 있지만 간단히 말해서 서버가 없습니다.yml은 두 부분으로 구성되어 있습니다.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
을 통해 이를 실현할 수 있습니다.➕ 찬성 의견
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와도 잘 통합되어 있습니다.➕ 찬성 의견
➖ 기만하다
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 어플리케이션 인프라를 실제 어플리케이션으로 정의
You can (likely) use the same programming language
Getting started with the AWS CDK
CDK Patterns
CDK 일 마무리
현재 이 분야에서 많은 일이 벌어지고 있다. 이 세 명이 현재 가장 걸출한 선수라고 생각하지만 좌우 양쪽에 대안이 나왔다.모든 프레임워크는 자신의 장점과 장점을 가지고 프로젝트에서 가장 효과적인 프레임워크를 선택할 때 오류나 정확한 부분이 드물다.
어떤 것이 당신이 가장 좋아하는지, 왜!
만약 당신이 이 글을 좋아하고 더 많은 것을 보고 싶다면 트위터에서 저를 주목해 주십시오. 저는 항상 그곳에서 서버가 없는 기술, AWS와 개발자의 생산력에 관한 글을 씁니다!
Reference
이 문제에 관하여(서버 프레임워크 vs SAM vs AWS CDK 없음), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tastefulelk/serverless-framework-vs-sam-vs-aws-cdk-1g9g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)