AWS を Go で試してみよう!(S3に保存するファイル一覧を取得する)
はじめに
AWS は言わずと知れたクラウドサービスであり、今日エンジニアとして一度は触れておかなてくはいかないサービスかと思っています。そんな AWS は CLI から操作することが可能な API が提供されています。
今回はこの API を Go 言語から使ってみるための方法をまとめたいと思います。
AWS の準備
Go 用に IAM の作成
Go から AWS を利用するには IAM ユーザを作成し、アクセストークンの発行が必要になります。ここでは、その IAM ユーザ作成手順をまとめます。
-
AWS コンソールにログインし、IAM にアクセスします。
-
IAM の左ペインにあります「User groups」を選択し、新規作成します。
なお、私の場合は「golang」という名前で role はひとまずadmin権限にて設定してみました。
(お時間がある方は、セキュリティのことを考えて最小権限で設定してみてください。)
-
続いて新規に IAM ユーザを作成します。左ペインの「Users」を選択し、「Add Users」をクリックします。
-
ユーザ名を任意で入力します。私はここでは「golang_api」という名前にしています。また、credential typeは「Access Key」を選択します。
-
次に IAM ユーザのグループとして先ほど作成した「golang」を選択します。
-
この後は特に設定は不要で、最後まで進み作成します。
-
作成が完了すると、以下の画像のように AccessトークンとSecretトークンが発行されるので、忘れないようにメモをしておきましょう。なお、画像の「Download .csv」をクリックすることで、csv形式でトークン情報をファイルとしてダウンロードできますので、念の為ダウンロードすることもお勧めします。
ここまでで IAM として必要な設定は完了です。
次からは、API で情報を確認する際のテスト目的で S3 にファイルを配置してみたいと思います。
S3 の設定
では、ここからは Go で API を実行した時のテスト用に S3 を設定してみたいと思います。既に bucket などがある方は本手順をスキップし、そちらを利用するでも問題ありません。
-
AWSコンソールにログインし、S3サービスにアクセス
-
新規で bucket を作成するため、「Create bucket」をクリック
-
bucket名とリージョンの設定を行い、bucketを作成(他設定は基本的にデフォルト)
なお、後ほど使うので、bucket名とリージョンをメモしておきます -
作成した bucket を選択し、object タブにてなにか適当なファイルをアップロード
上記例では、profile.jpg をアップロードしています
Go で AWS を操作
ここからはとうとう Go に関連する操作をしていきます。
事前に aws cli のインストール
まずは Go ではなく、aws cli のインストールが必要になります。
- こちらをクリックし、aws cli のインストーラがダウンロード
- ダウンロードしたインストーラを実行し、インストーラを完了する
- ターミナルを起動し、以下コマンド実行でコマンドが正常にインストールされていることを確認
> 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 を触ってみたいと思います。
- Go のプロジェクトの準備
> go mod init <project_name>
- 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 が作成されているかと思います。
-
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 名を指定する必要があります。
- 最後に実行
> 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