Serverless FrameworkとCDKの併用


人々が我々を通して働くのを手伝っている間Serverless Stack guide , 私たちは、ほとんどの人々は、彼らのAWSインフラストラクチャを定義するためにCloudFormationテンプレートを使用して本当に苦労していることに気づいた.そして、我々が本当に興奮していることは、驚きでありませんAWS CDK ! それはあなたが近代的なプログラミング言語を使用して任意のAWSインフラストラクチャを定義することができます.CDK,コードとして真のインフラストラクチャを作る
Serverless Framework 一方、AWS上のサーバレスアプリケーションを構築するのに最適です.一方、CDKで純粋にServerlessアプリを構築することができますが、それは偉大な開発者の経験を持っていません.フリップ側では、Serverlessフレームワークを使用すると、任意の非Serverless AWSインフラストラクチャを展開できます.しかし、YAMLまたはJSONで書かれたCloudFormationテンプレートを使用する必要があります.
これらの2つのフレームワークの間の重複はled folks to write アバウトwhy you should use one versus the other . しかし、我々は彼らがタンデムで一緒に使用されることを意図していると思います.そして、我々はそうするツールを作りました-Serverless Stack Toolkit ( SST ).両方の世界のベストを得ることができます!
これを詳しく見てみましょう.

背景


飛び込む前に、これらのフレームワークをいくつかのバックグラウンドですぐに取得しましょう.

Serverless Frameworkとは


Serverless Framework 2015年10月に発売された.それはあなたがローカルのサーバーレスアプリケーションを開発し、容易にそれらを展開することができます.それはAによって駆動されるserverless.yml 以下のような設定ファイルを示します:
service: serverless-example

provider:
  name: aws
  runtime: nodejs12.x

functions:
  hello:
    handler: handler.hello
ローカル関数をローカルで呼び出すことができます.
$ serverless invoke local -f hello
そして、
$ serverless deploy
Serverlessフレームワークは自動的にラムダ関数をパッケージし、AWSにアップロードします.
また、YAMLでCloudFormationテンプレートを使用して他のAWSインフラストラクチャを追加することもできます.たとえば、以下を使用してダイナモテーブルを追加できます.
Resources:
  NotesTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: ${self:custom.tableName}
      AttributeDefinitions:
        - AttributeName: userId
          AttributeType: S
        - AttributeName: noteId
          AttributeType: S
      KeySchema:
        - AttributeName: userId
          KeyType: HASH
        - AttributeName: noteId
          KeyType: RANGE
      BillingMode: PAY_PER_REQUEST

AWS CDKとは


AWS CDK クラウド開発キットreleased in Developer Preview back in August 2018 . それはあなたがtypescript、JavaScript、Javaを使用することができます.AWSインフラストラクチャを作成するためのネットとPython.
たとえば、ここでは、DynamoDBテーブルのCloudFormationテンプレートがCDKバージョンと比較される方法です.
- Resources:
-   NotesTable:
-     Type: AWS::DynamoDB::Table
-     Properties:
-       TableName: ${self:custom.tableName}
-       AttributeDefinitions:
-         - AttributeName: userId
-           AttributeType: S
-         - AttributeName: noteId
-           AttributeType: S
-       KeySchema:
-         - AttributeName: userId
-           KeyType: HASH
-         - AttributeName: noteId
-           KeyType: RANGE
-       BillingMode: PAY_PER_REQUEST


+ const table = new dynamodb.Table(this, "notes", {
+   partitionKey: {
+     name: 'userId', type: dynamodb.AttributeType.STRING,
+   },
+   sortKey: {
+     name: 'noteId', type: dynamodb.AttributeType.STRING,
+   },
+   billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
+ });
また、より高いコンストラクタを作成できます.これは、新しい再利用可能な構造体を作成するために低レベルリソースを結合して構成することができることを意味します.
Serverlessフレームワークと同様に、CDKアプリケーションを使用して配備できます.
$ cdk deploy
また、ラムダ関数を定義することもできます.
const helloSrc = fs.readFileSync('handler.js').toString();

const helloLambda = new lambda.Function(this, 'HelloLambda', {
  runtime: lambda.Runtime.NODEJS_12_X,
  handler: 'handler.hello',
  code: new lambda.InlineCode(helloSrc, {
    encoding: 'utf-8',
  })
});
しかし、それはあなたのラムダ関数のための素晴らしいローカル開発の経験を提供していません.

Serverless FrameworkとCDKの併用


要約すると、ここでどのようにServerlessフレームワークとCDKの比較です.
無セルフレームワーク
CDK
ラムダ関数に最適

〰️
他のインフラに最適
〰️

したがって、他のAWSインフラストラクチャを含むServerlessなアプリケーションを構築しているなら、あなたのラムダ関数とCDKのためのServerless Frameworkを使用して、残りの部分に対して意味のあるトンを作ります.
別に、他のインフラストラクチャからあなたのラムダ関数を分割する類似したデザインパターンはServerlessなコミュニティで一般的です、そしてwe recommend it over on Serverless Stack 同様に.
しかし、あなたが警戒する必要がある2つの間のデザインの違いのカップルがあります.

サーバレスフレームワークとCDKの間の設計差異


Serverlessアプリは、複数のサービスで構成され、全体としてアプリケーションは、同じ環境に展開されます.

各サービスは、ターゲットAWSアカウントにCloudFormationスタックとして展開されます.これをカスタマイズするには、ステージ、領域、およびAWSプロファイルを指定することができます.
 $ AWS_PROFILE=development serverless deploy --stage dev --region us-east-1
The --stage ここでプレフィックスは、ステージ名でスタック名をプレフィックスします.したがって、同じAWSアカウントに複数の段階を展開している場合、リソース名はスラッシュしません.
これは簡単に複数の環境にあなたのServerlessアプリを展開することができます.たとえ彼らが同じAWS口座にいるとしても.

AWSのCDKアプリは、複数のスタックで構成されています.そして、各々のスタックは、クラウド形成スタックとして標的AWSアカウントに配備される.しかし、Serverlessアプリとは異なり、各スタックは別のAWSのアカウントや地域に展開することができます.

これは、あなたのCDKアプリを展開するたびに、潜在的に複数の環境でスタックを作成する可能性があることを意味します.この重要なデザインの違いは、私たちのServerlessサービスと一緒にCDKアプリを使用するのを防ぎます.
このポストで概説されるように、あなたはあなたのCDKアプリの特定の慣例に従うことによって、この問題を解決することができます.しかし、これらの規則が施行されるならば、これは効果的です.

サーバーなしスタックツールキット


これを修正するためにServerless Stack Toolkit ( SST ).
SSTは、Serverlessのフレームワークと同じ規則に従うことができます.つまり、以下の関数を使用してラムダ関数を展開できます.
$ AWS_PROFILE=production serverless deploy --stage prod --region us-east-1
また、他のAWSインフラストラクチャにCDKを使用します.
$ AWS_PROFILE=production npx sst deploy --stage prod --region us-east-1
Serverlessフレームワークと同じように、あなたのCDKアプリのスタックは、ステージ名でプリフィックスされます.今、あなたはServerlessフレームワークとCDKを一緒に使用することができます!次のようにします.

以下のように、AWSアカウントまたは領域をCDKスタックの一部として定義する場合は、次のようにします.
new MyStack(app, "my-stack", { env: { account: "1234", region: "us-east-1" } });
間違いがありますよ.
Error: Do not directly set the environment for a stack

そして、もっと!


SSTはまた、いくつかの他の重要な利点があります.

  • 同時配備
    AWS CDK展開は現在非常に遅いです.CDKはあなたのCloudFormationスタックを順番に展開します.展開のためのCloudFormationテンプレートを提出して、それが完了するまで待ちます、次のものを始める前に.これは、大きなアプリケーションのCDK展開が簡単に少なくとも30分かかることを意味します.SSTはあなたのCloudFormationスタックを同時に展開することによってこれを修正します.

  • 非同期展開
    SSTはまた、非同期的にあなたのCloudFormationスタックを展開することをサポートします.だから、CCIのビルド分を完全にCloudformationを待って廃棄する必要はありません.Seed natively supports concurrent asynchronous deployments for your SST apps. ほぼ5倍速く、実質的に展開する無料!
  • ボックスからES 6をサポートします
  • あなたのCDKコードを自動的にlinlint
  • SSTとCDKの違い


    sstはcdkの単純な拡張であり,いくつかのマイナーな違いがある.

  • ないcdk.json代わりにsst.json あなたのステージと地域のためのデフォルトで.
    {
      "name": "my-sst-app",
      "type": "@serverless-stack/resources",
      "stage": "dev",
      "region": "us-east-1"
    }
    

  • ないbin/*.js代わりにlib/index.js それはあなたのスタックを追加できるデフォルトのエクスポート機能を持っています.sstはアプリケーションオブジェクトを作成します.
    import MyStack from "./MyStack";
    
    export default function main(app) {
      new MyStack(app, "my-stack");
    
      // Add more stacks
    }
    

  • スタック拡張sst.Stackスタッククラスsst.Stack の代わりにcdk.Stack . これにより、SSTは、展開しているステージでスタック名をプレフィックスすることができます.
    import * as sst from "@serverless-stack/resources";
    
    export default class MyStack extends sst.Stack {
      constructor(scope, id, props) {}
    }
    
  • あなたはもっと読むことができますmoving a CDK app to SST here . ですから、SSTを使用したいが、既存のCDKアプリを持っている場合は、簡単な手順のカップルに従って行うことができます.

    概要


    我々は考えるAWS CDK YAMLまたはJSONで書かれているCloudFormationテンプレートの上に、大きな改善はあります.との組み合わせServerless Framework とCDKは、両方の世界の最高を活用することができます.Serverless Frameworkを使用してラムダ関数を展開し、展開し、残りのAWSインフラストラクチャをCDKで定義します.あなたが一緒に2つを使用できることを確認するには、我々はServerless Stack Toolkit ( SST ).CDKアプリをあなたのServerless Frameworkサービスと一緒に展開することができるCDKの単純な拡張子!