使用本地栈(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找到所有的源代码。
搭建本地堆栈
我将使用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命令的工作流程
-
- 可以创建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
安装Terraform
python的包已经通过pip安装了。
安装完成之后,将其压缩为zip文件。
进行Terraform初始化
lambda函数已经被创建(通过terraform apply)。
打开另一个控制台,并调用localstack中的lambda函数。
lambda的代码使用requests包发送了一个GET请求。
qitta-example/localstack/0.11.0/init-by-terraform/sam-lambda/hello_world/app.py