🔖
SAM と LocalStack を利用して Lambda をローカルで実行したい
はじめに
LocalStack 内の EC2 を sam local invoke
で実行する Lambda からごにょごにょしたい。
前提
以下はインストール、設定済。
- AWS CLI
- AWS SAM CLI
- Docker
- LocalStack
三行
- docker-compose.yaml で hostname を設定し、Lambda 内で endpoint として使用する。
- いちいち
docker network ls
で調べるのが面倒なので、 docker-compose.yaml でネットワーク名を明示しておく。 -
sam local invoke
の--docker-network
オプションに上記で設定したネットワークを指定する。
実行例
docker-compose.yaml
version: "3.8"
services:
localstack:
container_name: sam-localstack
image: localstack/localstack:latest
hostname: localstack.local
networks:
- container-link
ports:
- 4566:4566
networks:
container-link:
name: localstack.internal
実行中の EC2 インスタンスの ID を表示する Lambda 関数。(HelloEc2Function)
app.js
const { EC2Client, DescribeInstancesCommand } = require('@aws-sdk/client-ec2');
const config = {
endpoint: 'http://localstack.local:4566',
region: 'us-east-1'
};
const client = new EC2Client(config);
const filters = {
Filters: [
{
Name: 'instance-state-name',
Values: [
'running'
],
}
]
};
exports.lambdaHandler = async (event, context) => {
try {
const command = new DescribeInstancesCommand(filters);
const res = await client.send(command);
for (const reservation of res.Reservations) {
const instance = reservation.Instances[0];
console.log(instance.InstanceId);
}
} catch (err) {
console.log(err);
}
};
LocalStack で EC2 起動して、
% aws ec2 run-instances --profile localstack --endpoint-url "http://localhost:4566"
HelloEc2Function というリソース名の Lambda を実行する。
% sam local invoke HelloEc2Function --docker-network localstack.internal
環境
% sw_vers
ProductName: macOS
ProductVersion: 12.4
BuildVersion: 21F79
% aws --version
aws-cli/2.7.12 Python/3.10.5 Darwin/21.5.0 source/arm64 prompt/off
% sam --version
SAM CLI, version 1.53.0
% docker --version
Docker version 20.10.17, build 100c701
% docker exec -it sam-localstack /opt/code/localstack/bin/localstack --version
0.14.5.dev
Discussion