DynamoDBStream+Lambda(Golang)でProblem Function call failedエラーで1時間くらいハマった

ハマったのでメモ。

ちゃんと設定できているように見えるのに、

こんな感じで、 PROBLEM: Function call failed のエラーが出る。

一応、更新があるとエラーが出るので、動いているようですが、ログ見てもeventがnilって情報が出ているだけで、そもそもHandlerの中のロガーすら呼ばれていない状態。権限やら何やら間違っているか1時間ほどハマりました。

対策

対策というより私が見逃していただけなのですが、golangでLambdaのイベントを受け取る時に何かのサンプルに書いてあった汎用的な以下の型で受け取っていたことが原因でした。

type Event map[string]interface{}

DynamoDBStream受けるには、専用の型があってそれで受けてやる必要があるようでした。

以下、ドキュメントからの抜粋です。

import (
    "context"
    "fmt"

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

func handleRequest(ctx context.Context, e events.DynamoDBEvent) {

    for _, record := range e.Records {
        fmt.Printf("Processing request data for event ID %s, type %s.\n", record.EventID, record.EventName)

        // Print new values for attributes of type String
        for name, value := range record.Change.NewImage {
            if value.DataType() == events.DataTypeString {
                fmt.Printf("Attribute name: %s, value: %s\n", name, value.String())
            }
        }
    }

他のイベントにも、Lambda(Golang)でイベントトリガで動かす時には、以下に纏まっているので確認しておいた方が良さそうです。

https://github.com/aws/aws-lambda-go/tree/master/events