aws-sdk-go-v2を使う時にアクセスキーをコード上で直指定する

はじめに

aws-sdkを使う場合、認証方法として環境変数、ローカルのcredentialsファイル、IAMRoleなどを使うことが一般的だが、 カジュアルな用途で使用する場合にはこれらの準備をすることが煩雑な場合もある。 こういった場合にaws-sdk-goのv1では credentials.NewStaticCredentials() を使うことができたのだが、v2になってCredentialの指定方法が刷新されたことによりこの方法が使えなくなったのでv2の方法をメモしておく。

※この記事はあくまでカジュアルに使う場合を想定しており、セキュアな環境下には適さないので注意してください。 アクセスキー管理のベストプラクティスは下記を参照してください。

https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-access-keys-best-practices.html

コード

aws-sdk-go-v2からは external.LoadDefaultAWSConfig() を使って aws.Config を生成し、各サービスのクライアントに渡して実行するようになっている。 external.LoadDefaultAWSConfig() の引数に external.WithCredentialsValue() を指定すると直接アクセスキー情報を指定した形のConfigが作れる。

package main

import (
    "context"
    "log"

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

    "github.com/aws/aws-sdk-go-v2/aws/external"
    "github.com/aws/aws-sdk-go-v2/service/ec2"
)

func main() {
    config, err := external.LoadDefaultAWSConfig(external.WithCredentialsValue(aws.Credentials{
        AccessKeyID:     "xxxx",
        SecretAccessKey: "xxxx",
    }))
    if err != nil {
        log.Fatal(err)
    }

        config.Region = endpoints.ApNortheast1RegionID

    ec2Client := ec2.New(config)
    req := ec2Client.DescribeInstancesRequest(&ec2.DescribeInstancesInput{})

    resp, err := req.Send(context.Background())
    if err != nil {
        log.Fatal(err)
    }
 
    log.Println(resp)
}

external.LoadDefaultAWSConfig() は引数無しでも実行できて、その場合は環境変数やローカルのファイルからよしなにCredentialsを探してきて、なければエラーを返す。というようになっている。 引数はデフォルトの挙動に対してオプションを指定するためのものとなっている。

所感

external.LoadDefaultAWSConfig() の引数に何が指定できるのかが分かりづらいのが注意点。 aws-sdk-go-v2自体はシンプルにはなったしリクエスト毎にcontextが指定できるようになったりしてめちゃ良さそうな印象でした!