Amazon S3のAWS署名バーション2が2019年6月24日に廃止されます。
現在使用しているツールが署名バージョン2のリクエストを送信しているのか?
それとも署名バージョン4のリクエストを送信しているのか?
確認する方法に関して記述します。
スポンサーリンク
AWS SDK for .net、言語はVB.netで試しましたが、他のSDK、言語でも共通して試すことができる方法です。
試すまでもなく、AWS CLIやSDKのバージョンによって影響を受けるかどうか確認することができますが、実際に試して、動かしてみないとプログラムの修正の効果があったのかどうかがわからなくて心配です。
すべてのアプリケーションが影響を受けるわけではない
Amazon S3のリージョンには、署名バージョン4のみをサポートするリージョンと両方共サポートするリージョンがあります。
今回影響を受けるのは、両方共サポートするエンドポイントに対してリクエストを送信しているアプリケーションです。
ということで、署名バージョン4のみをサポートするリージョンにリクエストを投げてみることで、プログラム修正の効果の確認が可能です。
署名バージョン4のみをサポートするリージョンは以下です。
カナダ (中部)
アジアパシフィック (ムンバイ)
アジアパシフィック (ソウル)
欧州 (フランクフルト)
欧州 (ロンドン)
中国 (北京)
Amazon S3に署名バージョン2廃止 ツール修正効果の確認方法
署名バージョン4のみをサポートするリージョンとバージョン4、2両方共サポートするリージョンにバケットを作成し、修正前後のプログラムでファイルを送信してみれば修正の効果があったかどうかがわかります。
今回は以下の条件でテストしました。
準備したバケット
-署名バージョン4のみをサポートするリージョンのバケット
バケット名:v4-bucket
リージョン:米国東部 (オハイオ)
-両方共サポートするリージョンのバケット
バケット名:both-bucket
リージョン:アジアパシフィック (東京)
-修正前のプログラム
AWS SDK for .net バージョン1
-修正後のプログラム
AWS SDK for .net バージョン3
エラー内容「The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.」
修正前のプログラムでboth-bucketにPutObjectしたら成功
修正後のプログラムでboth-bucketにPutObjectしたら成功
AWS SDK for .net の場合、バージョン3にすれば良いということがわかります。
AWS SDK for .net バージョン1では、AmazonS3ClientをNewするときにリージョンを指定する必要はなかったのですが、バージョン3では必須です。
試しに、リージョンを間違えてみました。
修正後のプログラムでv4-bucketにリージョンアジアパシフィック (東京)を指定してPutObjectするとエラー発生
エラー内容「The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.」
修正後のプログラムでboth-bucketにリージョン米国東部 (オハイオ)を指定してPutObjectするとエラー発生
エラー内容「The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.」
なぜかクライアントに米国東部(バージニア北部)を指定するとアジアパシフィック (東京)と米国東部 (オハイオ)のどちらにも書き込みできます。
修正後のプログラムでv4-bucketに「Amazon.AWSConfigsS3.UseSignatureVersion4 = False」としてPutObjectしたら成功してしまいます。
UseSignatureVersion4 プロパティが無視されているようです。
こちらの記事によると「AWSSDK.S3 3.3.6.2 and AWSSDK.Core 3.3.14.1」で修正されたと書いてありますが、「AWSSDK.S3 3.3.102.11」で試した見たところ同じ問題が発生しています。