こんにちは!
本記事では、ServerlessFramework を LocalStack へデプロイする8つのステップ方法を紹介します!一つひとつのステップは難しいものではないので、AWS サーバーレスの環境をローカルでも使いたいと考えている方は必見です。
そもそも、Serverless Framework は、サーバーレスのインフラをコードとして管理するためのツールです。複数のクラウドプロバイダーで動作し、裏側には豊富なプラグインや強力な開発者コミュニティがあります。一方、AWS のサービスをローカルで実行できるようにするものが LocalStack です。サーバーレスのインフラを LocalStack にデプロイできれば、簡単にローカルでテスト・開発・デバッグできるようになります。
「なぜクラウドにデプロイし、そこでテストしないのか?」と考える方もいらっしゃると思いますが、それはコードが実際のクラウド環境でテストできるようになってからの話です。では、ローカルで開発するメリットを確認しておきましょう。
今回紹介する LocalStack へのデプロイ方法は全8ステップです。
早速、それぞれの詳細を見ていきましょう。
LocalStack の起動はとても簡単です。Commandeer アプリを開き、サイドバーで LocalStack を選択し、Start All
をクリックします。すべてのサービスが開始されたら、準備は完了です。
それでは、デプロイするプロジェクトのコードを確認しましょう。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"
}
}
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-localstack
と serverless-plugin-typescript
の2つです。
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 は、デフォルトで us-east-1 リージョンで実行されます。別のリージョンパラメータで LocalStack を起動した場合は、リージョンを変更する必要があります。ちなみに、東京は ap-northeast-1 、大阪は ap-northeast-3 です。
コードが書けたので、いよいよ実行に移します。まずはプラグインをインストールしましょう。リポジトリをクローンしてターミナルを開き、sample-apps/serverless-localstack
フォルダに移動します。そして、好みのパッケージマネージャの選択に応じて npm install
または yarn install
を実行します。
Commandeer を開き、サイドナビゲーションで Serverless -> Runner に移動します。ファイルの選択をクリックし、プロジェクト内の serverless.yml
ファイルを選択します。
次に、ステージをローカルに設定する必要があるので、serverless-localstack
プラグインを有効にします。Commandeer を開き、アカウントのドロップダウンからローカルアカウントを選択します。
その後、アカウントで編集を選択してサーバーレスパネルを展開するか、サーバーレスランナーのページで歯車のアイコンが付いた設定ボタンをクリックしてサーバーレス設定を開いてください。stage
のテキストフィールドに local
と入力し、保存をクリックします。
STEP.6 サーバーレスを実行する
Commandeer のサーバーレスランナーの実行ボタンをクリックすると、サーバーレスランナーの動作を見ることができます。ターミナルにログがいくつか表示されます。実行の最後には、実行の概要が表示されます。今回の場合、1つの Lambda を LocalStack にデプロイすることに成功しました。
Lambda のページに移動します。ローカルにデプロイされた最新の lambda が表示されます。リストで Lambda をクリックすると、Lambda の詳細が表示されます。
Lambda を起動して結果を見て、動作していることを確認したら、Invoke Lambda
をクリックします。受信する Lambda のペイロードは、自由にカスタマイズしてください。デフォルトのテストペイロードでも問題なく動作します。invoke をクリックして lambda が起動されると、予想通りイベントと結果メッセージが表示されます。
今回は、ServerlessFramework を LocalStack へデプロイする方法を紹介しました。
LocalStack は、AWS 環境をローカル環境でも実現できるソフトウェアです。ローカルで開発することで、開発速度が大幅に向上し、デバッグも容易になります。
ぜひ今回紹介した方法を参考に、ServerlessFramework を LocalStack へデプロイしてみてはいかがでしょうか。
サーバーレスに関する開発相談は、お気軽にお問い合わせください。
スモールスタート開発支援、サーバーレス・NoSQLのことなら
ラーゲイトまでご相談ください
低コスト、サーバーレスの
モダナイズ開発をご検討なら
下請け対応可能
Sler企業様からの依頼も歓迎