🐕

AWS を Go で試してみよう!(S3に保存するファイル一覧を取得する)

2022/02/15に公開

はじめに

AWS は言わずと知れたクラウドサービスであり、今日エンジニアとして一度は触れておかなてくはいかないサービスかと思っています。そんな AWS は CLI から操作することが可能な API が提供されています。
今回はこの API を Go 言語から使ってみるための方法をまとめたいと思います。

AWS の準備

Go 用に IAM の作成

Go から AWS を利用するには IAM ユーザを作成し、アクセストークンの発行が必要になります。ここでは、その IAM ユーザ作成手順をまとめます。

  1. AWS コンソールにログインし、IAM にアクセスします。

  2. IAM の左ペインにあります「User groups」を選択し、新規作成します。

なお、私の場合は「golang」という名前で role はひとまずadmin権限にて設定してみました。
(お時間がある方は、セキュリティのことを考えて最小権限で設定してみてください。)

  1. 続いて新規に IAM ユーザを作成します。左ペインの「Users」を選択し、「Add Users」をクリックします。

  2. ユーザ名を任意で入力します。私はここでは「golang_api」という名前にしています。また、credential typeは「Access Key」を選択します。

  3. 次に IAM ユーザのグループとして先ほど作成した「golang」を選択します。

  4. この後は特に設定は不要で、最後まで進み作成します。

  5. 作成が完了すると、以下の画像のように AccessトークンとSecretトークンが発行されるので、忘れないようにメモをしておきましょう。なお、画像の「Download .csv」をクリックすることで、csv形式でトークン情報をファイルとしてダウンロードできますので、念の為ダウンロードすることもお勧めします。

ここまでで IAM として必要な設定は完了です。
次からは、API で情報を確認する際のテスト目的で S3 にファイルを配置してみたいと思います。

S3 の設定

では、ここからは Go で API を実行した時のテスト用に S3 を設定してみたいと思います。既に bucket などがある方は本手順をスキップし、そちらを利用するでも問題ありません。

  1. AWSコンソールにログインし、S3サービスにアクセス

  2. 新規で bucket を作成するため、「Create bucket」をクリック

  3. bucket名とリージョンの設定を行い、bucketを作成(他設定は基本的にデフォルト)

    なお、後ほど使うので、bucket名とリージョンをメモしておきます

  4. 作成した bucket を選択し、object タブにてなにか適当なファイルをアップロード

上記例では、profile.jpg をアップロードしています

Go で AWS を操作

ここからはとうとう Go に関連する操作をしていきます。

事前に aws cli のインストール

まずは Go ではなく、aws cli のインストールが必要になります。

  1. こちらをクリックし、aws cli のインストーラがダウンロード
  2. ダウンロードしたインストーラを実行し、インストーラを完了する
  3. ターミナルを起動し、以下コマンド実行でコマンドが正常にインストールされていることを確認
> which aws

aws cli にて トークンなどを設定

aws コマンドから操作できるようにするため、以下の情報をコマンドラインに設定します。

  • アクセスキー ID
  • シークレットアクセスキー
  • AWS リージョン
> aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: us-west-2
Default output format [None]: json

Go で S3 オブジェクトの取得

いよいよ、Go を使って AWS を触ってみたいと思います。

  1. Go のプロジェクトの準備
> go mod init <project_name>
  1. aws 操作で必要なライブラリのインストール
go get github.com/aws/aws-sdk-go-v2
go get github.com/aws/aws-sdk-go-v2/config
go get github.com/aws/aws-sdk-go-v2/service/s3

上手くインストールされれば、go.mod や go.sum が作成されているかと思います。

  1. main.goという名前でファイルを作成し、以下を記載
package main

import (
	"context"
	"log"
	"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"
)

func main() {
	// Load the Shared AWS Configuration (~/.aws/config)
	cfg, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
		log.Fatal(err)
	}

	// Create an Amazon S3 service client
	client := s3.NewFromConfig(cfg)

	// Get the first page of results for ListObjectsV2 for a bucket
	output, err := client.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
		Bucket: aws.String("my-bucket"),
	})
	if err != nil {
		log.Fatal(err)
	}

	log.Println("first page results:")
	for _, object := range output.Contents {
		log.Printf("key=%s size=%d", aws.ToString(object.Key), object.Size)
	}
}

1点注意なのが、my-bucketとコード内で記載する箇所はご自身で事前に作成された bucket 名を指定する必要があります。

  1. 最後に実行
> go run main.go
2022/02/15 08:50:31 first page results:
2022/02/15 08:50:31 key=What is Golang.md size=291
2022/02/15 08:50:31 key=profile.jpg size=133505

上記のような結果が出ていれば上手く動作しています。

参考文献

Discussion