ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

localstackのローカル環境にAWS CDKでLambdaを配置してみた & Windows 10 でGolangのLambdaを作った

前回に続き、またlocalstackについてです。タイトルにある様にLambdaをデプロイしてみたのですが、Windows 10 で GolangのLambdaを作ったため、そこでも知らないことが出てきたのでメモ代わりに書いておきます。

localstackの起動

GitHub - localstack/localstack: 💻 A fully functional local AWS cloud stack. Develop and test your cloud & Serverless apps offline!

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