この記事は公開されてから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といったモジュールがあります。