LoginSignup
0
1

localstackについて理解する(lambda版)

Last updated at Posted at 2024-05-16

ローカルスタックとは

localstcakとは、AWSのクラウドサービスをローカル環境でエミュレートするためのツールです。

例えば,AWSを使用したサービスを開発している際に,AWSを使用したapiなどのテストを行いたい時があります.その時に,実際にAWSのサービスを使用するとコストがかかってしまうため,ローカル環境でAWSのサービスをエミュレートすることで,コストを抑えることができます.

mockとやっていることは同じなので,コスト削減以外にもテストを行う際は使うと便利です!!

ローカルスタックの構成

ローカルスタックは,数多くのAWSサービスをエミュレートすることができます.
今回はlambdaに関してやっていこうと思います.

s3のみを使う場合ではminioを使う方が便利かも知れません.

まずはこのドキュメントを参考にして,作っていきます.
環境はdockerを使って構築します.

ローカルで動くlambda関数の作成

コードファイルの作成

まずはlocalで動くlambda関数を作成します.
今回はテストを想定しているので,モックとしてレスポンスさえくれば良いという感じにします.
この関数はドキュメントにあったものですが,内容としては2つの数字を受け取って,その積を返す関数です.

exports.handler = async (event) => {
    let body = JSON.parse(event.body)
    const product = body.num1 * body.num2;
    const response = {
        statusCode: 200,
        body: "The product of " + body.num1 + " and " + body.num2 + " is " + product,
    };
    return response;
};

これはjavascriptで書かれたlambda関数ですが,もちろん他の言語でも書くことができます.しかし,実際に開発で使っている言語と関係がないのでjavascriptでいいと思います.

zipファイルに圧縮

以下のコマンドでzipファイルに圧縮します.

zip function.zip index.js

localstackでlambdaの起動

docker-compose.ymlの作成

docker-composeを使ってlocalstackを起動します.

version: "3.8"
services:
    localstack:
        container_name: "localstack"
        image: localstack/localstack
        hostname: localstack
        ports:
        - "4566:4566"
        environment:
        - SERVICES=lambda
        - DOCKER_HOST=unix:///var/run/docker.sock
        - HOST_TMP_FOLDER=${TMPDIR}
        - HOSTNAME_EXTERNAL=localstack
        volumes:
        - "/var/run/docker.sock:/var/run/docker.sock"
        networks:
        - backend_network
networks:
  backend_network:
volumes:
  sample-data:

docker-compose.ymlというファイルを作成して,以下のコマンドでlocalstackを起動します.

docker-compose up

これでlocalstackが起動します.

これはlocalstackを起動しただけで,lambda関数は起動していないことに注意してください.localstackというサーバーにlambda関数をデプロイする必要があります.

lambda関数のデプロイ

以下のコマンドでlambda関数をデプロイします.

aws --endpoint-url=http://localhost:4566 lambda create-function \
	--function-name lambda-function-name \
	--runtime nodejs12.x \
	--zip-file fileb://function.zip \
	--handler index.handler \
	--role arn:aws:iam::000000000000:role/lambda-role

function-nambeは自分で指定してください.lambda関数は先ほど作成したzipファイルを読み込んでいます.
iamの部分はこのままにしておきましょう.変更するとエラーが出ることがあります.

これでlocalstackにlambda関数がデプロイされました.

lambda関数の実行

以下のコマンドでlambda関数を実行(invoke)します.

curl -X POST \
    'http://localstack:4566.lambda-url.us-east-1.localhost.localstack.cloud:4566/' \
    -H 'Content-Type: application/json' \
    -d '{"num1": "10", "num2": "10"}'

エラー集

awsのregionを指定してください

lambda関数をデプロイする際に,awsのregionを指定してくださいとエラーが出ることがあります.
どうやら,localstackはus-east-1をデフォルトで使っているようなので,あわしてあげると良いです.

aws-localとの違い

ドキュメントはaws-localを使っています.
これはpythonのライブラリでregionなどを環境ごとに指定することができるそうです.

awsコマンドを指定する場合は,awsのregionなどを指定するようにしてください.

もし,makefileなどで指定している場合は,以下のようにしてください.

set -a; source .env.local; set +a; aws --endpoint-url=http://localhost:4566 lambda create-function \
		--function-name lambda-function-name \
		--runtime nodejs12.x \
		--zip-file fileb://function.zip \
		--handler index.handler \
		--role arn:aws:iam::000000000000:role/lambda-role
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1