[aws-sdk-go]dynamodb、Sendメソッドでnot enough argumentsエラーが発生した

[aws-sdk-go]dynamodb、Sendメソッドでnot enough argumentsエラーが発生した

aws-sdk-go-v2を使用してDynamoDBにデータをPUTしようと試みたところ、ビルド時にSendメソッドでエラーが発生しました。

エラー内容

go build時のエラーメッセージの内容は以下です。

not enough arguments in call to req.Send
    have ()
    want (context.Context)

エラーが発生したコードは以下です。

func insertItem(cfg aws.Config, item Item) error {
	item, err := dynamodbattribute.MarshalMap(item)
	if err != nil {
		return err
	}

	svc := dynamodb.New(cfg)
	req := svc.PutItemRequest(&dynamodb.PutItemInput{
		TableName: aws.String("items"),
		Item:      item,
	})
	_, err = req.Send()
	if err != nil {
		return err
	}
	return nil
}

解決方法

want (context.Context)を頼りに調査した結果、以下の記事を見つけました。

v2 AWS SDK for Goはv0.8.0 (2019-04-25)にてSend及びページネイトのNextメソッドについてcontext.Contextを引数に追加する破壊的変更を実施したとのこと。

以下のように修正することで問題を解決しました。

  • import "context"を追加。
  • Sendメソッドの引数にcontext.Background()を追加。
import "context"

func insertItem(cfg aws.Config, item Item) error {
	item, err := dynamodbattribute.MarshalMap(item)
	if err != nil {
		return err
	}

	svc := dynamodb.New(cfg)
	req := svc.PutItemRequest(&dynamodb.PutItemInput{
		TableName: aws.String("items"),
		Item:      item,
	})
	_, err = req.Send(context.Background())
	if err != nil {
		return err
	}
	return nil
}

ハマったポイント

最初は上記リンクのサンプルコードを参考にreq.SetContext(context.Background())を追加しましたが、エラーが解決しませんでした。

Sendメソッドの引数に直接context.Background()を指定したところエラーが解決しました。