Briswell Tech Blog

ブリスウェルのテックブログです

ローカル環境でS3とLambdaを実行するために、LocalStackを設定してみた

みな様こんにちは。
BriswellのSonと申します。

最近、以下の図に従ってLambdaをテストして実行するのに興味があります。

AWS環境では、上の処理の実行・テストが簡単ですが、localhostではファイルのアップやLambdaの起動などは難しいです。しかし、LocalStackを使用すると、簡単になります。

I. LocalStackとは

① 概要

  • ローカル環境でAWSのサービスのシミュレートするツールです。
  • AWSのリソースを使用せずにアプリケーションをテスト・開発できます。

参照先: https://docs.localstack.cloud/overview

② メリット

  1. ローカル開発への便利性
    AWSのリソースを実際に使用せずに、ローカル環境でアプリケーションを開発およびテストする環境を提供します。

  2. コスト削減
    AWSの実際のサービスを使用する必要がないため、開発およびテストにかかる費用を削減できます。

  3. 多くのAWSサービスのシミュレート
    S3、LambdaなどのさまざまなAWSサービスをシミュレートできる。これにより、さまざまなサービスを使用してアプリケーションをテストできます。

③ デメリット

  1. シミュレーションの制限
    AWSの一部のサービスを提供しますが、すべての機能が完全にシミュレートされているわけではありません。

  2. パフォーマンスの低下
    シミュレーション環境でのLocalStackのパフォーマンスは、AWSの実際の環境と比較して期待されるほど高くないことがあります。

  3. 複雑な設定
    設定は、新しいユーザーにとって複雑で理解しにくい場合があります。

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の発火できました。

最後まで読んでいただきありがとうございました。
疑問があれば、コメントをしてください。