Shogo's Blog

Sep 20, 2022 - 2 minute read - aws go golang gcp

AWS SDK v2 for Goが壊れた、Googleお前もか

何もしていないのに壊れました。(ライブラリのアップデートはした)

AWS SDK v2 for Goが壊れた

該当のプルリクエストはこちら:

true*bool 型に変換できないと怒られてしまいました。

./main.go:305:19: cannot use true (untyped bool constant) as *bool value in struct literal

どうやらAWS SDK v2のこのコミットの影響でビルドが通らなくなったようです: aws/aws-sdk-go-v2@a13b7a4

diff --git a/service/ssm/api_op_GetParameter.go b/service/ssm/api_op_GetParameter.go
index c7617dcfd0e..f58354b6528 100644
--- a/service/ssm/api_op_GetParameter.go
+++ b/service/ssm/api_op_GetParameter.go
@@ -39,7 +39,7 @@ type GetParameterInput struct {
 
 	// Return decrypted values for secure string parameters. This flag is ignored for
 	// String and StringList parameter types.
-	WithDecryption bool
+	WithDecryption *bool
 
 	noSmithyDocumentSerde
 }

なんでこんなひどいことするの 😭

公開している構造体の bool*bool に変えたら、そりゃ壊れます。 これだからAWS SDK v2は・・・。

修正自体は簡単で true と書いていたところを aws.Bool(true) に変えるだけです。

Google APIも壊れた

別件でgoogle.golang.org/apiv0.93.0からv0.96.0 にあげたところ、こちらも見事に壊れました。

# cloud.google.com/go/storage
Error: ../../../../go/pkg/mod/cloud.google.com/go/storage@v1.22.1/bucket.go:1504:30: cannot use r.Condition.AgeInDays (variable of type int64) as type *int64 in struct literal
Error: ../../../../go/pkg/mod/cloud.google.com/go/storage@v1.22.1/bucket.go:1592:30: cannot use rr.Condition.Age (variable of type *int64) as type int64 in struct literal

Google… お前もか。

From 5d5097861f632634915858d88a0cb8c9c4fe4b05 Mon Sep 17 00:00:00 2001
From: Frank Natividad <franknatividad@google.com>
Date: Wed, 22 Jun 2022 12:44:00 -0700
Subject: [PATCH] fix(storage): *int64 instead of int64 for Age cond

---
 google-api-go-generator/gen.go | 1 +
 storage/v1/storage-gen.go      | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/google-api-go-generator/gen.go b/google-api-go-generator/gen.go
index 3dc26090268..4e26623dcb1 100644
--- a/google-api-go-generator/gen.go
+++ b/google-api-go-generator/gen.go
@@ -1011,6 +1011,7 @@ var pointerFields = []fieldName{
 	{api: "sqladmin:v1beta4", schema: "Settings", field: "StorageAutoResize"},
 	{api: "sqladmin:v1", schema: "Settings", field: "StorageAutoResize"},
 	{api: "storage:v1", schema: "BucketLifecycleRuleCondition", field: "IsLive"},
+	{api: "storage:v1", schema: "BucketLifecycleRuleCondition", field: "Age"},
 	{api: "storage:v1beta2", schema: "BucketLifecycleRuleCondition", field: "IsLive"},
 	{api: "tasks:v1", schema: "Task", field: "Completed"},
 	{api: "youtube:v3", schema: "ChannelSectionSnippet", field: "Position"},
diff --git a/storage/v1/storage-gen.go b/storage/v1/storage-gen.go
index 0b01f8557c3..37930cd5e16 100644
--- a/storage/v1/storage-gen.go
+++ b/storage/v1/storage-gen.go
@@ -822,7 +822,7 @@ func (s *BucketLifecycleRuleAction) MarshalJSON() ([]byte, error) {
 type BucketLifecycleRuleCondition struct {
 	// Age: Age of an object (in days). This condition is satisfied when an
 	// object reaches the specified age.
-	Age int64 `json:"age,omitempty"`
+	Age *int64 `json:"age,omitempty"`
 
 	// CreatedBefore: A date in RFC 3339 format with only the date part (for
 	// instance, "2013-01-15"). This condition is satisfied when an object

こちらは cloud.google.com/go/storage@v1.23.0 で修正されたようです。

まとめ

いずれもdependabotの作成したプルリクエストで気が付きました。 壊れないような安定したライブラリを使う&自分のライブラリでは互換性を壊さないようにするのがベターですが、残念ながら、まれによく壊れます。 こういう修正がまとめてどかっとくると心が折れるので、dependabotのようなツールを使って、定期的に依存パッケージを更新するようにしておくと安心ですね。

@furusax「Why do you do sonna hidoi koto ?」