💭

Go Lambda関数を書く

2022/01/23に公開

はじめに

今回も実務にてAWS Lambdaを使用することになったのでその際に簡単なサンプルを作成しました。
設定として、すぐ実行するものと、S3のイベントをトリガーにして関数が起動するものの二種類記述しました。
Lambdaの設定等は今回は省きます。

コード

では早速

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

/*
** $ GOOS=linux GOARCH=amd64 go build -o main lambda.go && zip main.zip main
 */

type MyEvent struct {
	FirstName string `json:"firstName"`
	LastName  string `json:"lastName"`
}

type Response struct {
	BucketName string `json:"bucketName"`
	Key        string `json:"key"`
	Size       int64  `json:"size"`
	StatusCode int    `json:"statusCode"`
}

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

func s3Lambda(ctx context.Context, event events.S3Event) (interface{}, error) {
	response := Response{}
	for _, record := range event.Records {
		response.BucketName = record.S3.Bucket.Name
		response.Key = record.S3.Object.Key
		response.Size = record.S3.Object.Size
	}
	response.StatusCode = 200
	log.Println("response: ", response)
	return response, nil
}

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

まずmain関数でLambdaを起動状態にします。

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

こちらが簡単に起動するものです。
テストで確認したのですがJSONで値を入力してやればログに「Hello (FirstName) (LastName)!」が出力されます。

func s3Lambda(ctx context.Context, event events.S3Event) (interface{}, error) {
	response := Response{}
	for _, record := range event.Records {
		response.BucketName = record.S3.Bucket.Name
		response.Key = record.S3.Object.Key
		response.Size = record.S3.Object.Size
	}
	response.StatusCode = 200
	log.Println("response: ", response)
	return response, nil
}

実用的なのはこちらかと思います。
event events.S3Eventを引数にS3のイベントをトリガーにして起動し、受け取ったevent.Recordsから詳細情報を取得します。
ここでは簡単に取得したイベント詳細を出力するのみですが、前回の画像リサイズやS3が受け取ったオブジェクトの編集などが実際に使われるのではないかと思います。

Lambdaにコードを読み込ませる

$ GOOS=linux GOARCH=amd64 go build -o main lambda.go && zip main.zip main

今回は記述したコードをzipファイルにして読み込ませるようにしました。
実行可能ファイルのLambda.go(今回のmain関数を記述したファイル)をmainという名前でコンパイルします。その後にmain.zipにパッケージ化してデプロイパッケージを作成します。

まとめ

初めてAWSを触って感じたのが、ドキュメントが日本語で出回っている資料も多く見受けられたので非常に簡単に設定など出来たと思います。
これからもS3やLambda以外も触ってみようと思います。

Discussion