localstackのローカル環境にAWS CDKでLambdaを配置してみた & Windows 10 でGolangのLambdaを作った
前回に続き、またlocalstackについてです。タイトルにある様にLambdaをデプロイしてみたのですが、Windows 10 で GolangのLambdaを作ったため、そこでも知らないことが出てきたのでメモ代わりに書いておきます。
localstackの起動
localstackをgitでcloneし、以下のコマンドで起動しておきます。
$ git clone https://github.com/localstack/localstack
$ cd localstack
$ docker-compose up
CDKのプロジェクトの構成
aws cdk でGolangのLambdaをデプロイしてみる - ソースコードから理解する技術-UnderSourceCode
この時に書いたときと同じ構成ですが、後に書くlambdaのビルド用バッチファイルを「main.go」と同階層に置きました。以下のような構成となります。
- lambda/ ・・・ 新規で作るフォルダ - bin/ - main ・・・ main.goをビルドしたバイナリ。後述します。 - main.go ・・・ Lambdaのソース - build.bat ・・・ Lambdaビルド用バッチファイル - lib/ - cdk-lambda-stack.ts - node_modules/ - README.md
Lambda本体である「main.go」は、先の記事と同じものです。
lambdaのビルド
先に書いたようにWindows 10 で GolangのLambdaを作ったのですが、以下を参考に「build-lambda-zip」を使って圧縮してやる必要があるようでした。
Go の AWS Lambda デプロイパッケージ - AWS Lambda
「build-lambda-zip」を go get~で取得したあと、以下のようなバッチファイルをつくり、Lambdaのビルドは一発でできるようにしました。
build.bat
env GOOS=linux go build -o bin/main main.go cd bin build-lambda-zip.exe -output main.zip main
CDK
CDKについてはlambdaのビルド時に圧縮したzipをデプロイできるよう、「lib/cdk-lambda-stack.ts」を以下のようにしました。
lib/cdk-lambda-stack.ts
import * as cdk from '@aws-cdk/core'; import * as lambda from '@aws-cdk/aws-lambda'; export class CdkLambdaStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // The code that defines your stack goes here new lambda.Function( this, 'GoFunction', { functionName: 'GoFunction', runtime: lambda.Runtime.GO_1_X, handler: 'main', code: lambda.Code.fromAsset('./lambda/bin/main.zip') }) } }
デプロイと動作確認
localstackにデプロイするので、「cdklocal」コマンドを使用します。「cdklocal」については前回などを参考にしてください。以下のようなコマンドとなります。
# デプロイ $ cdklocal bootstrap --endpoint-url=http://localhost:4566 --profile=localstack $ cdklocal deploy --endpoint-url=http://localhost:4566 --profile=localstack # Lambdaの動作確認 $ aws lambda invoke --function-name GoFunction --endpoint-url http://localhost:4566 --profile localstack response.json