🔖

SAM と LocalStack を利用して Lambda をローカルで実行したい

2022/07/05に公開

はじめに

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