aws-sdk-go の変更に対応した話 #aws #golang #jawsug

ちょっと前に↓なツールを作ってみたのですが

uchimanajet7.hatenablog.com

その後にAWSのBlogに↓な感じの記事が上がりました

Preview the Latest Updates in the Master Branch – AWS SDK for Go | AWS Official Blog

https://aws.amazon.com/jp/blogs/aws/preview-the-latest-updates-in-the-master-branch-aws-sdk-for-go/

当然ながらもうすぐ正式リリースが近いに違いない!と思い多いに喜んでいたわけですが・・・develop branchの内容ってすごい変更じゃないですかーヤダー

こちらも当然の結果になるのですが、今までままではビルドが通らない・・・よろしいならば修正だっ!ということで修正してみました。

github.com

まずは、構成が丸ごと変更になったのでimport文が全滅ですね・・・従来は

import (
   "github.com/awslabs/aws-sdk-go/aws"
   "github.com/awslabs/aws-sdk-go/gen/rds"
)

と書いてましたが、新しいものはgenではなくservice以下にすべて移動となっているので

import (
   "github.com/awslabs/aws-sdk-go/aws"
   "github.com/awslabs/aws-sdk-go/service/rds"
)

に変更しました。正直import文ぐらいなら何の問題もないんですが・・・今回の変更では構造体名称が変更になっているので、これが結構面倒な感じでした。例えば

message := &rds.DescribeDBInstancesMessage{
   DBInstanceIdentifier: aws.String(dbIdentifier),
}

となっているのを、新しいものでは*Messageが全部*Input変更になっていたので

input := &rds.DescribeDBInstancesInput{
   DBInstanceIdentifier: &dbIdentifier,
}

と、対応する形に変更しました。また、構造体のメンバーで今までは aws.String型という単純にポインタ型を再定義したものしか受け付けませんでしたが、これも単純にStringのポインタで問題なくなったので修正しました。

*Newも引数が以前はそれぞれで、クレデンシャルとリージョンを指定していましたが

aws_rds := rds.New(aws_creds, conf.Rds[name_flag].Region, nil)

新しいものではConfig構造体が用意され、その構造体にクレデンシャルとリージョンを指定すればよくなったので

aws_conf := aws.DefaultConfig
aws_conf.Credentials = conf.GetAWSCreds()
aws_conf.Region = conf.Rds[name_flag].Region

aws_rds := rds.New(aws_conf)

と、変更を行いました。毎回引数で個別に指定するよりは管理しやすくなった印象です。

で、今回一番ハマったのがテストコードで利用していたAWS APIのモック作成で使った以下のコードです。

// Override endpoints
// see also
// endpoints - GoDoc
// https://godoc.org/github.com/awslabs/aws-sdk-go/gen/endpoints#AddOverride
test_region := "rds-try-test-1"
endpoints.AddOverride("rds", test_region, server.URL)
aws_creds := aws.Creds("awsAccesskey1", "awsSecretKey2", "")
aws_rds := rds.New(aws_creds, test_region, httpClient)

新しくなった方ではそもそもendpoints.AddOverride自体がなくなっていて、さてどうしたものかと思ってましたが、以下のようにすることで従来より簡単に実現できるようになっていました。

// Override endpoints
test_region := "rds-try-test-1"
aws_conf := aws.DefaultConfig
aws_conf.Credentials = aws.Creds("awsAccesskey1", "awsSecretKey2", "")
aws_conf.Region = test_region
aws_conf.Endpoint = server.URL
aws_conf.HTTPClient = httpClient

aws_rds := rds.New(aws_conf)

このConfig構造体に値を設定するだけでコントロール可能なのは柔軟でいいですねー

という感じで、より使いやすい方向に改善されているawssdk−goの正式リリースが待ち遠しいですが、とりあえず現行最新版で動作するように変更できました。

同じ作業を行う方の参考になればと思います。