ServerlessFrameworkをLocalStackへデプロイ!ローカル環境にAWSサーバーレス環境を再現して開発を効率化しましょう😎

ServerlessFrameworkをLocalStackへデプロイ!ローカル環境にAWSサーバーレス環境を再現して開発を効率化しましょう😎

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!

本記事では、ServerlessFramework を LocalStack へデプロイする8つのステップ方法を紹介します!一つひとつのステップは難しいものではないので、AWS サーバーレスの環境をローカルでも使いたいと考えている方は必見です。

想定する読者

  • ServerlessFramework を使っているヒト
  • AWS サーバーレスの環境をローカルでも使いたいヒト

はじめに

そもそも、Serverless Framework は、サーバーレスのインフラをコードとして管理するためのツールです。複数のクラウドプロバイダーで動作し、裏側には豊富なプラグインや強力な開発者コミュニティがあります。一方、AWS のサービスをローカルで実行できるようにするものが LocalStack です。サーバーレスのインフラを LocalStack にデプロイできれば、簡単にローカルでテスト・開発・デバッグできるようになります。

「なぜクラウドにデプロイし、そこでテストしないのか?」と考える方もいらっしゃると思いますが、それはコードが実際のクラウド環境でテストできるようになってからの話です。では、ローカルで開発するメリットを確認しておきましょう。

  • 複数の人が AWS の同じ開発環境を使っている場合でも、他の作業者に迷惑をかけずに済む
  • ローカルですべての問題に対処し、実際のクラウド環境に対する最終チェックとして、動作するコードのいくつかをロールアウトできる
  • ネットワーク経由でデータが転送されるのとは対照的に、すべてがローカルマシンで行われるため、ローカル環境へのデプロイはクラウドへのデプロイよりもはるかに高速になる

LocalStack へのデプロイ方法

今回紹介する LocalStack へのデプロイ方法は全8ステップです。

  1. LocalStack を起動する
  2. サーバーレスコードをウォークスルー
  3. サーバーレスプラグインをインストールする
  4. serverless.yml を選択する
  5. サーバーレスステージをローカルにセットする
  6. サーバーレスを実行する
  7. Lambda を見る
  8. Lambda を起動する

早速、それぞれの詳細を見ていきましょう。

STEP.1 LocalStack を起動する

LocalStack の起動はとても簡単です。Commandeer アプリを開き、サイドバーで LocalStack を選択し、Start All をクリックします。すべてのサービスが開始されたら、準備は完了です。

All LocalStack services are started in Commandeer
https://docs.getcommandeer.com/docs/Serverless/deploying-to-localstack/#start-localstack

STEP.2 サーバーレスコードをウォークスルー

それでは、デプロイするプロジェクトのコードを確認しましょう。Github のオープンソースレポにある sample-apps/serverless-localstack というフォルダーから、プロジェクト全体をクローンまたはダウンロードできます。以下は主なコンポーネント(モジュール)です。

{
  "dependencies": {
    "aws-sdk": "2.556.0"
  },
  "devDependencies": {
    "@types/aws-lambda": "8.10.24",
    "serverless-plugin-typescript": "1.1.7",
    "serverless-localstack": "0.4.21",
    "typescript": "3.6.4"
  }
}

ServerlessFrameworkプロジェクトの内容を確認

serverless.yml – メインのサーバーレス設定ファイル

serverless.yml ファイルには、CloudFormationやプラグインをはじめとしたクラウドへデプロイするリソース定義が集約されています。ServerlessFrameworkの強みは、強力な開発コミュニティに支えられている各種プラグインを利用し、最小限のコード量で様々な機能を実現できることです。

serverless.yml ファイルでは、ファイル上部の service へ名前空間の物理名を指定します。この名前空間は、CloudFormationスタック名のPrefixや、 Lambda関数のPrefixなどに使用されます。

# ./serverless.yml
service: commandeer-tanks

provider:
  name: aws
  runtime: nodejs10.x
  memorySize: 256
  region: us-east-1
  stage: ${opt:stage, 'development'}
  timeout: 30
  versionFunctions: false

plugins:
  - serverless-plugin-typescript
  - serverless-localstack

functions:
  tankHandler: ${file(./handlers/tankHandler.yml):tankHandler}

custom:
  localstack:
    stages:
      # list of stages for which the plugin should be enabled
      - local
# ./handlers/tankHandler.yml
tankHandler:
  handler: handlers/tankHandler.process
  timeout: 900
  tags:
    DEPARTMENT: MACHINERY
    ENVIRONMENT: DEV

plugin – プラグイン

では、ウォークスルーしたソースコードのプラグインを確認しましょう。このServerlessプロジェクトで指定されているプラグインは、先程紹介した serverless-localstackserverless-plugin-typescript の2つです。

  1. serverless-plugin-typescript:サーバーレスのプロジェクトに Typescript のサポートを追加するためのもの
  2. serverless-localstack:LocalStack に対して サーバーレス を実行できるようにするもの

function – Lambda関数の指定

functions へ、Lambda関数を指定します。複数の関数がある場合は、ここに複数の関数を自由に追加します。この例では、./handlers/tankHandler.yml にあるファイルをインクルードし、コロンの後に tankHandler とハンドラ名を指定します。

custom – カスタム動作を設定

カスタム動作を設定できるカスタムセクションを指定します。この例では、serverless-localstack プラグインを有効にするステージのリストで設定します。local というステージをリストすることで、LocalStack のデプロイがローカルステージに対してのみ有効化されるようにします。

tankHandler.yml – ハンドラの設定

先程 functions へ指定したLambda関数の実装内容を確認しましょう。eventの型定義は実際のユースケースに応じて適切な型定義を設定しましょう。

import { Context, Handler } from 'aws-lambda';

const process: Handler = async (event: Record<string, unknown>, context: Context) => {
  try {
    const shot = {
      message: 'Serverless ⚡️⚡️',
      event,
    };
    context.succeed(shot);
  } catch (exception) {
    context.fail(exception);
  }
};
export { process };

LocalStackについて補足

LocalStack は、デフォルトで us-east-1 リージョンで実行されます。別のリージョンパラメータで LocalStack を起動した場合は、リージョンを変更する必要があります。ちなみに、東京は ap-northeast-1 、大阪は ap-northeast-3 です。

STEP.3 サーバーレスプラグインをインストールする

コードが書けたので、いよいよ実行に移します。まずはプラグインをインストールしましょう。リポジトリをクローンしてターミナルを開き、sample-apps/serverless-localstack フォルダに移動します。そして、好みのパッケージマネージャの選択に応じて npm install または yarn install を実行します。

STEP.4 serverless.ymlを選択する

Commandeer を開き、サイドナビゲーションで Serverless -> Runner に移動します。ファイルの選択をクリックし、プロジェクト内の serverless.yml ファイルを選択します。

Choosing your Serverless file in Commandeer
https://docs.getcommandeer.com/docs/Serverless/deploying-to-localstack/#choose-serverless-yml

STEP.5 サーバーレスステージをローカルにセットする

次に、ステージをローカルに設定する必要があるので、serverless-localstack プラグインを有効にします。Commandeer を開き、アカウントのドロップダウンからローカルアカウントを選択します。

その後、アカウントで編集を選択してサーバーレスパネルを展開するか、サーバーレスランナーのページで歯車のアイコンが付いた設定ボタンをクリックしてサーバーレス設定を開いてください。stage のテキストフィールドに local と入力し、保存をクリックします。

Setting stage to local in Serverless settings
https://docs.getcommandeer.com/docs/Serverless/deploying-to-localstack/#choose-serverless-yml

STEP.6 サーバーレスを実行する

Commandeer のサーバーレスランナーの実行ボタンをクリックすると、サーバーレスランナーの動作を見ることができます。ターミナルにログがいくつか表示されます。実行の最後には、実行の概要が表示されます。今回の場合、1つの Lambda を LocalStack にデプロイすることに成功しました。

Serverless deploy to LocalStack finished
https://docs.getcommandeer.com/docs/Serverless/deploying-to-localstack/#run-serverless

STEP.7 Lambda を見る

Lambda のページに移動します。ローカルにデプロイされた最新の lambda が表示されます。リストで Lambda をクリックすると、Lambda の詳細が表示されます。

Lambda got deployed to LocalStack
https://docs.getcommandeer.com/docs/Serverless/deploying-to-localstack/#see-the-lambda

STEP.8 Lambda を起動する

Lambda を起動して結果を見て、動作していることを確認したら、Invoke Lambda をクリックします。受信する Lambda のペイロードは、自由にカスタマイズしてください。デフォルトのテストペイロードでも問題なく動作します。invoke をクリックして lambda が起動されると、予想通りイベントと結果メッセージが表示されます。

Lambda invoked
https://docs.getcommandeer.com/docs/Serverless/deploying-to-localstack/#invoke-your-lambda

まとめ

今回は、ServerlessFramework を LocalStack へデプロイする方法を紹介しました。

LocalStack は、AWS 環境をローカル環境でも実現できるソフトウェアです。ローカルで開発することで、開発速度が大幅に向上し、デバッグも容易になります。

ぜひ今回紹介した方法を参考に、ServerlessFramework を LocalStack へデプロイしてみてはいかがでしょうか。

サーバーレスに関する開発相談は、お気軽にお問い合わせください。