@aws-cdk/aws-lambda-goを使ってGoのLambdaをCDKでサクッとビルドする

2021.08.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ちょっと前になりますが、aws-cdk v1.103.0 (2021/05/11) で @aws-cdk/aws-lambda-go というモジュールがリリースされていたので紹介したいと思います。

@aws-cdk/aws-lambda-go とは

@aws-cdk/aws-lambda よりさらにhigher levelなモジュールで、 Goで書いたLambdaを簡単にAWSにデプロイしてくれるモジュールです。

v1.11以上のGo、または、Dockerがローカルにインストールされていれば、
それを使ってローカルビルドして、バイナリをAWSにデプロイしてくれます。

やってみた

TypeScriptのCDKで実際にデプロイしてみます。
(CDKもGoを使いたかったのですが、まだデベロッパープレビューだったので...)

コード

作成したファイルはこちら

test-lambda-go
├── lambda
│   ├── main.go
│   ├── go.mod
│   └── go.sum
└── cdk
    ├── bin
    │   └── cdk.ts
    ├── lib
    │   └── lambda-stack.ts
    └── (以下 cdk init で自動生成されるファイル)

main.go はこちらのコードを使用

package main

import (
    "fmt"
    "context"
    "github.com/aws/aws-lambda-go/lambda"
)

type MyEvent struct {
    Name string `json:"name"`
}

func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
    return fmt.Sprintf("Hello %s!", name.Name ), nil
}

func main() {
    lambda.Start(HandleRequest)
}

肝心の lambda-stack.ts はエントリポイントを設定するだけです。
ディレクトリ構成によっては、moduleDirの設定も必要になります。

import * as cdk from '@aws-cdk/core'
import * as lambda from '@aws-cdk/aws-lambda-go'

export class LambdaStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    new lambda.GoFunction(this, 'handler', {
        entry: '../lambda'
    })
  }
}

デプロイ

無事デプロイできました。
ランタイムがGo 1.xじゃなくて、Custom runtime on Amazon Linux2になっているのが気になりましたが、ローカルでビルドしてLinuxで動くバイナリをアップロードしているので、ランタイムがGoである必要はないですね、納得です。

テストも無事動きました。

まとめ

サクッとデプロイすることができました。
Lamdaのデプロイ方法は、SAMやserverlessなど、いろいろ迷いどころですが、選択肢の一つとしては使えそうかなと思いました。

備考

このモジュールはv1.116.0(2021/07/29)時点でEXPERIMENTALで、後方互換性のないアップデート等が発生する可能性があるのでご注意ください。
Go以外にもNode.jsやPython用に、@aws-cdk/aws-lambda-nodejs@aws-cdk/aws-lambda-pythonといったモジュールがあります。

参考

AWS CDKのbundlingオプションを使ってLambdaへのデプロイ前処理もCDKで管理する方法