まくろぐ
更新: / 作成:

何をするか?

ここでは、Go 言語用の AWS SDK V2 をセットアップして、各種 AWS サービス用の API を呼び出す準備をします。

Go 言語は Google が開発したプログラミング言語で、ライブラリインポートの手軽さや、生成された実行バイナリの実行速度に定評があるため、今後も利用ユーザーは増えていきそうです。

Go の実行環境は Go のインストーラー で簡単にインストールできます。 これ以降の説明では、Go の実行環境はインストール済みであると想定しています。

テスト用の Go プロジェクトを作成する

Go プロジェクト用に適当なディレクトリを作成し、その中で go mod init コマンドを実行して go.mod (依存関係などが保存されるファイル)を作成しておきます。 このファイルが存在するディレクトリを、Go はモジュールとして認識します。

$ mkdir aws-study
$ cd aws-study
$ go mod init aws-study

上記の例では、go mod init の引数(モジュールパス)を aws-study としましたが、GitHub リポジトリで管理する前提であれば、github.com/<user>/aws-study のようなモジュールパスを指定するようにしてください。 これで、Go 言語プロジェクトの準備完了です。

AWS SDK でコンフィグ情報を参照してみる

AWS SDK を使って AWS のサービスにアクセスするには、認証情報として IAM ユーザーの「アクセスキー ID」や「シークレットアクセスキー」などが必要になります。 これらは、一般的には AWS CLI の aws configure コマンドによって、~/.aws/credentials~/.aws/config に保存された情報です。

AWS SDK にはこれらの設定ファイルから認証情報(クレデンシャル情報)を読み取る API が用意されています。 まず、go get コマンドを実行して、設定情報を読み込むための github.com/aws/aws-sdk-go-v2/config パッケージ の依存情報を追加します。

$ go get github.com/aws/aws-sdk-go-v2/config

go get コマンドを実行すると、パッケージの依存情報が記載された go.modgo.sum ファイルが更新されるので、これらは忘れずに Git などにコミットするようにしてください。 下記のサンプルコードでは、AWS のコンフィグ情報を取得して、画面上に出力しています。

main.go
package main

import (
	"context"
	"fmt"

	"github.com/aws/aws-sdk-go-v2/config"
)

func main() {
	// 外部リソース(~/.aws/config など)からコンフィグ情報 (aws.Config) を生成
	cfg, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
		panic(fmt.Sprintf("failed loading config, %v", err))
	}

	// コンフィグ情報を表示
	fmt.Printf("Region = %s\n", cfg.Region)
	cred, err := cfg.Credentials.Retrieve(context.TODO())
	if err != nil {
		panic(fmt.Sprintf("failed retrieving credentials, %v", err))
	}
	fmt.Printf("AccessKeyID = %s\n", cred.AccessKeyID)
	fmt.Printf("SecretAccessKey = %s\n", cred.SecretAccessKey)
	fmt.Printf("SessionToken = %s\n", cred.SessionToken)
}

次のように実行してアクセスキーの情報が表示されれば、各種 AWS サービスの API を呼び出す準備は整っています。

実行例
$ go run main.go
Region = ap-northeast-1
AccessKeyID = TAZASBDCD4ASIAVTXAP4
SecretAccessKey = S2VmkhmfeN8n9TXe7G2L1XAOVhK80jui/eNcdgna
SessionToken = Ub7oU0AhI0k4NIGo3J(省略)D9f3YiTZ2xyyqi44w=

config.LoadDefaultConfig 関数 は、次のような外部リソースを情報源として AWS のコンフィグ情報 (aws.Config) を構築しています。 コンフィグ情報がうまく表示されないときは、これらの設定を確認すると原因が分かるかもしれません。

  • 環境変数
    • export AWS_REGION=ap-northeast-1
    • export AWS_ACCESS_KEY_ID=TAZASBDCD4ASIAVTXAP4
    • export AWS_SECRET_ACCESS_KEY=S2VmkhmfeN8n9TXe7G2L1XAOVhK80jui/eNcdgna
    • export AWS_SESSION_TOKEN=Ub7oU0AhI0k4NIGo3J(省略)D9f3YiTZ2xyyqi44w=
    • export AWS_PROFILE=default
  • Shared Credentials ファイル (~/.aws/credentials)
  • Shared Configuration ファイル (~/.aws/config)

AWS サービスの API を呼び出してみる

コンフィグ情報 (aws.Config) を取得できるようになったら、あとは各 AWS サービス(S3、API Gateway、DynamoDB など)の API を呼び出すだけです。 例としては何でもよいのですが、ここでは、S3 バケットの情報を取得してみます。

各 AWS サービス用のパッケージは github.com/aws/aws-sdk-go-v2/service/サービス名 という名前で提供されているので、これを go get しておきます。

$ go get github.com/aws/aws-sdk-go-v2/service/s3

下記のサンプルコードを実行すると、S3 バケットの一覧(作成日とバケット名)を出力します。

main.go
package main

import (
	"context"
	"fmt"

	"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() {
	cfg := loadAwsConfig()
	output := listS3Buckets(cfg)

	for _, bucket := range output.Buckets {
		created := bucket.CreationDate.Format("2006-01-02 15:04:05 Mon")
		fmt.Println(created + ": " + *bucket.Name)
	}
	fmt.Printf("Found %d buckets\n", len(output.Buckets))
}

// 外部リソース(~/.aws/config など)からコンフィグ情報 (aws.Config) を生成します。
func loadAwsConfig() aws.Config {
	cfg, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
		panic(fmt.Sprintf("failed loading config, %v", err))
	}
	return cfg
}

// S3 バケットの一覧を取得します。
func listS3Buckets(cfg aws.Config) *s3.ListBucketsOutput {
	client := s3.NewFromConfig(cfg)
	input := &s3.ListBucketsInput{}
	output, err := client.ListBuckets(context.TODO(), input)
	if err != nil {
		panic(fmt.Sprintf("failed listing S3 buckets, %v", err))
	}
	return output
}
実行例
$ go run main.go
2021-12-24 00:59:06 Fri: my-sample-bucket-name-1
2022-04-08 05:15:52 Fri: my-sample-bucket-name-2
2022-04-04 08:47:23 Mon: my-sample-bucket-name-3
2020-07-10 06:54:33 Fri: my-sample-bucket-name-4
Found 4 buckets

このサンプルコードでは S3 サービスの API を使用しましたが、他の AWS サービスに関しても同様に操作することができます。

関連記事

まくろぐ
サイトマップまくへのメッセージ