AWSGo で操作するライブラリ

aws-sdk-go-v2が2021-01-19にリリースされた。 AWS SDK for Go のバージョン 2 が一般公開されました

https://aws.amazon.com/jp/sdk-for-go/

AWS SDK for Go を使用すると、AWS の使用を迅速に開始できます。この SDK を使用して、Amazon S3、Amazon DynamoDB、Amazon SQS などの AWS の各種サービスと Go アプリケーションを簡単に統合できます。

  • モジュール化により使用するサービスごとにgo getでインストールして不要なサービスは除外できる
  • CPU およびメモリの使用率における顕著な改善
  • APIが簡潔になった
  • エラーハンドリングが強化された
  • pagination, waitが改善された
  • middlewareを使ってリクエスト時のカスタマイズが可能になった

インストール

https://github.com/aws/aws-sdk-go-v2

$ go get github.com/aws/aws-sdk-go-v2/aws
$ go get github.com/aws/aws-sdk-go-v2/config
 
# 使うサービスのみインストールする
$ go get github.com/aws/aws-sdk-go-v2/service/s3

リファレンス

https://pkg.go.dev/github.com/aws/aws-sdk-go-v2

使い方

import (
	"context"
	"fmt"
	"io/ioutil"
 
	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/s3"
	"golang.org/x/xerrors"
)
 
func RetrieveFile(ctx context.Context) ([]byte, error) {
	cfg, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
		return nil, xerrors.Errorf(": %w", err)
	}
 
	client = s3.NewFromConfig(cfg)
 
	input := &s3.GetObjectInput{
		Bucket: aws.String("sample-bucket"),
		Key:    aws.String("path/to/myfile"),
	}
 
	output, err := client.GetObject(ctx, input)
	if err != nil {
		return nil, xerrors.Errorf(": %w", err)
	}
 
	defer output.Body.Close()
	b, err := ioutil.ReadAll(output.Body)
	if err != nil {
		return nil, xerrors.Errorf(": %w", err)
	}
 
	fmt.Printf("body: %s\n", string(b))
 
	return b, nil
}

ユニットテスト

https://aws.github.io/aws-sdk-go-v2/docs/unit-testing/

v1には xxxiface パッケージ(例: sqsiface)があり、インターフェースが定義されていたがv2ではなくなっているので自分でinterfaceを定義してmockする。