AWS SAM CLI と localstack を利用して Lambda をローカル実行してみよう

はじめに

Lambda 開発する中で、動作確認をローカルで実行できないかと思ったことはありませんか?

そんな疑問も、AWSが提供している SAM CLI を活用することで、ローカル実行することができます。さらに、dockerを使ったlocalstack も使用することで、S3 や SecretsManager などのAWSリソースを、ローカル環境でエミュレートすることも可能です。

それでは、ローカル環境でLambdaの実行ができるように環境を作ってみましょう。

実施環境

・mac OS(10.14.5)

・SAM CLI(1.6.2)

・AWS CLI(2.0.59)

・python (3.7)

・docker-compose(1.25.4)

事前準備

dockerインストール
homebrewインストール
は割愛します。こちらは、AWSのSAM CLIドキュメントに記載されています。

  • SAM CLIインストール

  • AWS CLIインストール

localstackコンテナでのAWSリソースデータを作る際使うのでインストールしておきます。

  • AWS認証情報設定

localstack用プロファイルとしてダミー値で登録します。

設定入ったか確認します。

localstack profileとして登録されていますね。

Lambda モジュール作成

  • Lambda雛形作成

SAM CLIコマンドで、Lambda用のファイルの雛形が楽に作成できます。
今回はPythonで作ってみます。

今回はハローワールドとして作成してみます。(2つとも「1」を選択)
色々テンプレートが用意されているようですね。

そうすると下記のように雛形が作成されています。

このように雛形ファイルができてました。
Lambda 実行ファイルは、hello_world/app.py になります。

それでは各設定ファイルを設定していきましょう。

  • template.yaml

Lambdaの環境変数をここに定義します。Environmentのところを追加します。
コンソールにある環境変数の設定がこれに該当します。

  • requirements.txt

hello_worldフォルダ配下にファイルがあります。
こちらのファイルに、処理で使うpythonのモジュールを記載します。
AWSリソース使うため boto3 を入れます。

  • docker-compose.yml

こちらにlocalstackを設定します。雛形では作られないのでファイル作成して設定しましょう。

environment の SERVICES のところに起動したいサービス(上記は、s3/lambda/secretsmanager/logsを指定)を設定します。

それでは、docker-compose を起動してみましょう。

  • docker-compose 起動

下記URLでサービスが立ち上がったか見れます。(runningであれば起動済み)

http://localhost:4566/health

それでは、実際にデータ設定してみましょう。

テスト用データ作成

AWS CLIで、profileに「localstack」を指定、endpoint-urlに「http://localhost:4566」を指定して実行することで、localstackにデータ設定することができます。

  • S3バケット作成

  • S3ファイルアップロード

サンプルとしてtest.csvを用意し、アップロードします。

  • S3アップロード確認

S3にアップロードしたということをエミュレートできていいますね。

  • SecretsManagerキー作成

キーとしてサンプルファイルを用意して登録します。

  • SecretsManagerキー取得して確認

※キーファイルはサンプルなので下記のようにしています。
# sample
test key

コマンド結果のSecretStringの箇所に、設定したキーが確認できますね。

これでモックデータも作成できましたので、実際にLambdaのMain処理を用意します。

Lambda処理作成

雛形作成時に hello_world/app.py が作成されているので、こちらにコーディングします。

S3、SecretsManagerを使用する際、endpoint-urlに「http://localstack:4566」を指定することで localstackのデータを参照することができます。

これでソースも用意できたので実際に Lambda 実行してみましょう。

Lambda実行

  • ビルド

  • localstackネットワークID確認

NETWORK IDをメモしておきましょう。Lambda実行時に指定します。

  • Lambdaローカル実行

docker-network に上記でメモしました NETWORK ID を指定します。

log-file を指定すると実行ログがファイル出力できます。

これで、Lambdaをローカルで実行できました。

実行ログを見てみると正常に実行できていることが確認できます。

 

他にもS3 PUTトリガーなどのイベント情報設定も下記コマンドで作れます。

下記のようにeven.jsonができます。

いかがでしたでしょうか。Lambda処理をローカル環境にて実行できました。

SAM CLI とlocalstackを使用することで、AWSコンソールにデプロイせずとも、AWSリソースをエミュレートし、Lambda処理をローカル実行できるのは開発捗りますよね。

  • (補足)docker-compose 停止

終わったら起動したdocker-compose停止しておきましょう。

参考

SAM CLIインストールのドキュメント

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html

SAM CLIコマンドコマンドリファレンス

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html

localstackのgithub

https://github.com/localstack/localstack


--------------------------
システム開発のご要望・ご相談はこちらから

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です