何?
Lambdaをテストする際、いちいちUPしてCloudWatchを確認して・・・とテストするのは辛いのでローカルでテストする環境を作る。
作ったメモ
検証環境
Mac: macOS Sierra
awscli: aws-cli/1.14.32 Python/2.7.13 Darwin/16.7.0 botocore/1.8.36
nodejs: v9.4.0
npm: 5.6.0
docker: Version 17.06.2-ce-mac27
ディレクトリ構成
.
├── docker-compose.yml
├── event.json
├── index.js
├── package.json
└── template.yml
aws-sam-localのインストール
npm i aws-sam-local -g
私はこいつはグローバルインストールしている
手順
作業ディレクトリの作成と移動
コマンド
mkdir test
cd test
npm install
npm init -y
npm i aws-sam-local aws-sdk --save-dev
sam-localが使用するYAMLの作成
template.yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
lambdaFunction:
Type: AWS::Serverless::Function
Properties:
Handler: index.handler
Runtime: nodejs6.10
localstack用のYAMLファイル作成
docker-compose.yml
version: '2.1'
services:
localstack:
image: localstack/localstack
ports:
- 4567-4583:4567-4583
- 8080:8080
スクリプトの用意
index.js
'use strict';
const AWS = require('aws-sdk');
const S3 = new AWS.S3({endpoint: 'http://<ローカル端末のIP>:4572', s3ForcePathStyle: true});
exports.handler = (event, context, callback) => {
console.log(`EVENT is ${event}`);
uploads3().then(() => {
callback()
});
};
const uploads3 = () => {
return new Promise((resolve, reject) => {
let param = {
Bucket: "xxxxxxxxxxxxxbbb",
Key: "test2.txt",
Body: "fugafuga"
};
console.log(param);
S3.putObject(param, (err, data) => {
if (err) {
console.log(err, err.stack);
} else {
console.log(data);
}
resolve();
});
});
};
ダミーイベント作成
コマンド
sam local generate-event dynamodb > event.json
local-stackの起動(バックグラウンド起動)
コマンド
docker-compose up -d
lambdaのローカル実行
コマンド
sam local invoke lambdaFunction -e event.json
- アップロード用のS3バケットのダミーは最初に作っておくこと。
- samが呼んでくるlambda動かすdockerからlocalstackへのネットワーク疎通が通らなかったからEndpointは端末のIP指定している。
ローカルでCLI使ってlocalstackは疎通出来るのに、docker上で動いてるLambdaスクリプトから接続ができなくてすっごいハマった。
追記 2018/02/06
会社で、dockerからmacへの通信は
docker.for.mac.host.internal
とすると出来るよ!とお聞きしました。
PG内での指定方法がよくわからないんですが、使えるかもしれません。
参考
[新ツール]AWS SAMをローカル環境で実行できるSAM Localがベータリリース
AWS SAM Local と LocalStack を使って ローカルでAWS Lambdaのコードを動かす