ローカルスタックとは
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