はじめに
AWS SDK for Go v2のバージョン1.74.1から、S3クライアントのデフォルト動作が変更され、CRC32チェックサムがデフォルトで有効になった。これにより、S3互換ストレージを使用している環境で502エラーが発生した。
↓公式ドキュメントにも以下の記載がされている
Amazon S3 モジュールのバージョン v1.74.1 以降、SDK はアップロードのCRC32チェックサムを自動的に計算することで、デフォルトの整合性保護を提供します。事前計算されたチェックサム値を指定しない場合、または SDK がチェックサムの計算に使用するアルゴリズムを指定しない場合、SDK はこのチェックサムを計算します。
問題の詳細
発生したエラー現象
S3互換ストレージに対してSDKを利用してPUTしたところ、502 Bad Gateway Errorが発生
※S3互換ストレージはいくつか種類がある。もしかしたらストレージ側で対応済みでエラーが発生しないものもあるかも
解決策
S3クライアント作成時のオプションのRequestChecksumCalculationWhenRequiredとResponseChecksumValidationを指定してあげればよい
client := s3.NewFromConfig(cfg, func(o *s3.Options) {
o.RequestChecksumCalculation = aws.RequestChecksumCalculationWhenRequired
o.ResponseChecksumValidation = aws.ResponseChecksumValidationWhenRequired
})
こうすることで、必要な場合にのみチェックサムが計算されるようにすることができる
まとめ
AWS SDK for Go v2 S3モジュールのバージョン1.74.1以降では、S3クライアントのデフォルト動作としてCRC32チェックサムが有効になった。
S3互換ストレージを使用している場合、この変更によって502エラーが発生する可能性がある。
S3互換ストレージをSDKで操作してる場合は、ユニットテストを用意してパッケージのバージョンアップ前に必ず動作確認した方が良い。