使用本地栈(LocalStack)在指定目录中安装Lambda的软件包并打包为zip文件(使用Terraform版本)

介绍的内容

    • localstackでlambdaを作ります

localstackのdocker-entrypoint-initaws.dを使う。主にterraformを使います
ユーザーが指定したディレクトリにpackageをインストールします
インストールしたpackageをzipに固めます

總結

    • lambdaのpackageのインストールを別のdockerコンテナにしたら、いろんな言語のpackageインストールに対応できます

localstackのコンテナにpythonのvenvなどのバージョン管理ツールをインストールして使う手もあります。ですが、言語ごとにツールの使い方を思えるより、dockerの使い方を覚えて全言語をカバーする方が効率的だと思いました

別のdockerコンテナでterraformをインストールして実行するから、HOSTマシン(MACやwindows)にインストールされているterraformを気にしなくてもいいと思います。

localstackのdocker-entrypoint-initaws.dでterraformを使うことで開発環境プロビジョニングするコストが減ります

例えば本番環境用terraformを持っていたら、開発環境用に少し修正してlocalstackですぐ使えます

我要开始介绍了。

本文将介绍localstack。

这是一个可以在不使用实际的AWS情况下进行各种尝试的工具。从0.11.0版本开始有了重大变化。本文将使用0.11.0版本的localstack(https://github.com/localstack/localstack)。

介绍terraform

您可以使用代码来管理基础设施。访问https://www.terraform.io/。

目录结构

您可以在https://github.com/cheekykorkind/qiita-example/tree/master/localstack/0.11.0/init-by-terraform找到所有的源代码。

initaws.png

搭建本地堆栈

我将使用Docker Compose。

version: '3'

services:
  pip_installer:
    container_name: 'pip_installer'
    image: python:3.7-alpine3.10
    tty: true
    working_dir: /workspace/sam-lambda
    environment:
      LAMBDA_ZIP_PATH: /workspace/sam-lambda/hello_world/lambda.zip
      TERRAFORM_PATH: /workspace/terraform
    volumes:
      - ./sam-lambda:/workspace/sam-lambda
      - ./terraform:/workspace/terraform

  localstack:
    container_name: 'localstack-dev'
    image: localstack/localstack:0.11.0
    ports:
      - '4566:4566'
    environment:
      SERVICES: lambda,logs,dynamodb
      DEBUG: 1
      HOSTNAME_EXTERNAL: localstack
      EDGE_PORT: 4566
      PORT_WEB_UI: 8080

      AWS_ACCESS_KEY_ID: AKIAIOSFODNN7EXAMPLE
      AWS_SECRET_ACCESS_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
      AWS_DEFAULT_REGION: us-east-1
      LAMBDA_ZIP_PATH: /workspace/sam-lambda/hello_world/lambda.zip
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./initaws:/docker-entrypoint-initaws.d
      - ./tmp/localstack:/tmp/localstack

      - ./sam-lambda:/workspace/sam-lambda
    depends_on:
      - pip_installer

Docker Compose的卷(挂载)设置

localstackコンテナ

packageインストールやzipファイル共有するために、AWS SAMプロジェクトをマウントしておきます。

./sam-lambdaは絶対パスqitta-example/localstack/0.11.0/init-by-terraform/sam-lambdaと同じです

localstackのdocker-entrypoint-initaws.d機能を使うためにマウントして置きます

./initawsは絶対パスqitta-example/localstack/0.11.0/init-by-terraform/initawsと同じです

pip_installerコンテナ

packageインストールやzipファイル共有するために、AWS SAMプロジェクトをマウントしておきます。

./sam-lambdaは絶対パスqitta-example/localstack/0.11.0/init-by-terraform/sam-lambdaと同じです

terraformを使用するためにマウントしておきます

./terraformは絶対パスqitta-example/localstack/0.11.0/init-by-terraform/terraformと同じです

使用docker-compose进行环境变量的配置

localstackコンテナ

SERVICES、DEBUG、HOSTNAME_EXTERNAL、EDGE_PORT、PORT_WEB_UI はlocalstack固有の環境変数です。localstackを調べると理解できると思います

AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_DEFAULT_REGION はaws cliを便利に使うために設定しました

LAMBDA_ZIP_PATH はlambda生成に使うzipファイルの位置を書きました。コンテナ2つが連携して作業するから管理しやすくするために設定しました

pip_installerコンテナ

LAMBDA_ZIP_PATH はlambda生成に使うzipファイルの位置を書きました。コンテナ2つが連携して作業するから管理しやすくするために設定しました

TERRAFORM_PATH はterraformファイルのパスです。terraformコマンド実行するためにterraformファイルがいるところに移動する必要があります。便利な移動のために事前に指定しておきました

使用docker-compose up命令的工作流程

    1. 可以创建pip_installer容器。

因为localstack容器有depends_on依赖,所以会先创建localstack容器。

通过tty: true选项,可以保持创建后的up状态。

可以创建localstack容器。

在容器创建后,将执行localstack特定的初始化工作。

将在docker-entrypoint-initaws.d目录中按名称顺序执行sh文件。

这是localstack的特定功能。

在完成所有初始化工作后,将执行挂载的00_create_lambda_zip.sh位于qitta-example/localstack/0.11.0/init-by-terraform/initaws的文件。

00_create_lambda_zip.sh

进入等待中的pip_installer容器,使用docker命令。

将python的包指定为qitta-example/localstack/0.11.0/init-by-terraform/sam-lambda/hello_world/packages,并进行安装。

将python代码和安装的包压缩成zip文件,并放置在$LAMBDA_ZIP_PATH中。

安装terraform。

移动到$TERRAFORM_PATH中存在terraform文件的位置。

运行terraform init。

运行terraform apply。同时将lambda的zip路径($LAMBDA_ZIP_PATH)传递给terraform。

通过terraform创建lambda。

结束并删除pip_installer容器。

我将尝试使用在localstack上创建的lambda函数。

运行docker-compose up -d命令,并且附加到localstack-dev容器。

cd qitta-example/localstack/0.11.0/init-by-terraform
docker-compose up -d && docker attach localstack-dev
dockerComposeUp.png

安装Terraform

terraformInstall.png

python的包已经通过pip安装了。

pipInstall.png

安装完成之后,将其压缩为zip文件。

makeZip.png

进行Terraform初始化

terraformInit.png

lambda函数已经被创建(通过terraform apply)。

terraformApply.png

打开另一个控制台,并调用localstack中的lambda函数。

lambdaInvoke.png

lambda的代码使用requests包发送了一个GET请求。
qitta-example/localstack/0.11.0/init-by-terraform/sam-lambda/hello_world/app.py