みな様こんにちは。
BriswellのSonと申します。
最近、以下の図に従ってLambdaをテストして実行するのに興味があります。
AWS環境では、上の処理の実行・テストが簡単ですが、localhostではファイルのアップやLambdaの起動などは難しいです。しかし、LocalStackを使用すると、簡単になります。
I. LocalStackとは
① 概要
参照先: https://docs.localstack.cloud/overview
② メリット
ローカル開発への便利性
AWSのリソースを実際に使用せずに、ローカル環境でアプリケーションを開発およびテストする環境を提供します。コスト削減
AWSの実際のサービスを使用する必要がないため、開発およびテストにかかる費用を削減できます。多くのAWSサービスのシミュレート
S3、LambdaなどのさまざまなAWSサービスをシミュレートできる。これにより、さまざまなサービスを使用してアプリケーションをテストできます。
③ デメリット
シミュレーションの制限
AWSの一部のサービスを提供しますが、すべての機能が完全にシミュレートされているわけではありません。パフォーマンスの低下
シミュレーション環境でのLocalStackのパフォーマンスは、AWSの実際の環境と比較して期待されるほど高くないことがあります。複雑な設定
設定は、新しいユーザーにとって複雑で理解しにくい場合があります。
II. 使ってみる
① イメージ
以下は、LocalStackがソースコードをLambdaに直接マウントする方法を示すイラストです。
イラストにより、ローカル環境でソースコードを実行できるために、LocalStackとDockerを利用する必要があります。
② 環境構築
LocalStackのインストール
【macの場合】Terminalで下記のコマンドを実行する必要がある
brew install localstack/tap/localstack-cli brew install awscli-local
【他のプラットホーム】下記のリンクを参照できます。 https://docs.localstack.cloud/getting-started/installation/
インストールしたら、LocalStack CLIとLocalStack AWS CLIのバージョンを確認するために、下記のコマンドを実行する。
localstack --version awslocal --version
Dockerのインストール
docker: https://docs.docker.com/get-docker/
docker-compose (version 1.9.0+): https://docs.docker.com/compose/install/
実装
LocalStackとDockerを導入したら、以下の内容でdocker-compose.ymlファイルを作成します。
version: "3.8" services: localstack: container_name: localstack_test image: localstack/localstack:latest ports: - "127.0.0.1:4566:4566" # LocalStack Gateway - "127.0.0.1:4510-4559:4510-4559" # external services port range environment: - DEBUG=1 - LAMBDA_REMOTE_DOCKER=0 - LAMBDA_DOCKER_FLAGS=-e NODE_OPTIONS=--inspect-brk=0.0.0.0:9229 -p 9229:9229 - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR-} - DOCKER_HOST=unix:///var/run/docker.sock volumes: - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack" - "/var/run/docker.sock:/var/run/docker.sock"
Dockerコンテナを起動するために、次のコマンドを実行します。
docker-compose up -d
下の添付した画像により、ローカル環境の作成が完了しました。
③ ローカル環境の管理
常にAPIのコマンドでサービスを管理できますが、もっと簡単に管理するために、下記のURLでアカウントを登録して、コンソールで管理できます。
https://app.localstack.cloud/dashboard
④ ローカル環境でサービスの登録方法
Lambdaの作成方法
functiontestのLambda関数を作成するために、Terminalで下記のコマンドを実行する。
awslocal lambda create-function \ --function-name functiontest \ --region ap-northeast-1 \ --code S3Bucket="hot-reload",S3Key="$(pwd)/" \ --handler dist/function.handler \ --runtime nodejs18.x \ --timeout 300 \ --role arn:aws:iam::000000000000:role/lambda-role
上のコマンドにより、ソースコードが[dist]フォルダーの[function]ファイルにあります。
注意:Lambdaなどを作成・実行するために、Dockerを起動する必要があります。
Lambdaをチェックしたい時に、下記のリンクで参照できます。 https://app.localstack.cloud/inst/default/resources/lambda/functions
上の添付した画像により、functiontestのLambda関数の作成が完了しました。
S3バケットの作成方法
buckettestのS3バケットを作成するために、Terminalで下記のコマンドを実行する。
awslocal s3api create-bucket --bucket buckettest --create-bucket-configuration LocationConstraint=ap-northeast-1
S3バケットをチェックしたい時に、下記のリンクで参照できます。
https://app.localstack.cloud/inst/default/resources/s3
上の添付した画像により、buckettestのS3バケットの作成が完了しました。
S3からLambda実行を発火の設定方法
buckettestのS3バケットからfunctiontestのLambdaを発火するために、Terminalで下記のコマンドを実行する。
awslocal s3api put-bucket-notification-configuration \ --bucket buckettest \ --notification-configuration '{ "LambdaFunctionConfigurations": [ { "Id": "1", "LambdaFunctionArn": "arn:aws:lambda:ap-northeast-1:000000000000:function:functiontest", "Events": ["s3:ObjectCreated:*"] } ] }'
LambdaFunctionArnは、作成したLambdaの[Function Arn]です。
LambdaのDebugするために、[Visual Studio Code]の設定方法
プロジェクトの下に.vscodeのフォルダーを作成して、.vscodeの下に2つのファイルを作成する必要がある。
*launch.jsonファイル
{ "version": "0.2.0", "configurations": [ { "address": "127.0.0.1", "localRoot": "${workspaceFolder}", "name": "Attach to Remote Node.js", "port": 9229, "remoteRoot": "/var/task/", "request": "attach", "type": "node", "preLaunchTask": "Wait Remote Debugger Server" }, ] }
*tasks.jsonファイル
{ "version": "2.0.0", "tasks": [ { "label": "Wait Remote Debugger Server", "type": "shell", "command": "while [[ -z $(docker ps | grep :9229) ]]; do sleep 1; done; sleep 1;" } ] }
ローカル環境でS3とLambdaを実行してみましょう
発火を確認するためにはブレークポイントを設定した方が良いです。
ブレークポイントを設定したら、[Visual Studio Code]の[デバッグの開始(F5)]ボタンを押下する。
LocalStackのコンソールのS3管理画面でファイルをアップロードして、[Visual Studio Code]側でアップしたファイルの情報が表示されます。
上記の画像により、ローカル環境でS3からLambdaの発火できました。
最後まで読んでいただきありがとうございました。
疑問があれば、コメントをしてください。