こんにちは。 バックエンド兼Androidアプリエンジニアの高橋です。
今回は最近担当したAmazon S3のAWS署名バーション2の廃止への対応について書こうと思います。
S3の署名バージョン2の廃止?
AWS公式のこちらのページに書いてある通りです。 docs.aws.amazon.com
Amazon S3 における署名バージョン 2 は廃止され、署名バージョン 2 の最終サポートは 2019 年 6 月 24 日に終了します。
どういう事かというと、古いaws-sdkを使っているとS3のリクエストにデフォルトで署名バージョン2を使うので、sdkのバージョンをあげないとS3にアクセスできなくなってしまうという事です。
2019 年 6 月 25 日以降は署名バージョン4のリクエストのみ受け付けるようになります。
対象のaws-sdkのバージョンは言語によって異なるので、上記リンク先をご覧ください。
aws sdk for rubyでいうと、v1、v2がデフォルトで署名バージョン2を使うので、v3に上げないといけません。
放っておくと致命的な話なのでまだ対応していない方は必ず対応しましょう。
(自分のプロジェクトが対象かどうかを調べる方法はGoolgeで検索すればたくさん出るので、割愛します。)
必要な対応
基本的にはaws-sdkのバージョンを上げるだけで問題無いですが、以下のようなケースもあるので要注意です。
- aws-sdkのデフォルトの署名バージョンを明示的に上書きしている。
- aws-sdkに依存している他のライブラリ等が最新版のaws-sdkに対応していない。
前者のケースについては、コード内で署名バージョンを明示的に指定している箇所を変更する必要があります。 署名バージョンの指定方法は以下が参考になります。 docs.aws.amazon.com
後者のケースについては、依存しているライブラリのバージョンも上げる必要があります。 それが難しい場合は、aws-sdkのバージョンは上げずに前者と同様にコード内で署名バージョンを明示的に指定する方法でもいいかと思います。
弊社の場合
弊社の一部のプロジェクト(Ruby on Rails)ではaws-sdkに依存しているライブラリのバージョンが古くなっているものがあり、バージョンを上げる事によって影響範囲がかなり大きくなってしまう状態でした。
なので暫定的にaws-sdkのバージョンは上げずに、コード内で署名バージョンを明示的に指定する方法をとりました。
具体的には、以下のコードが書かれたファイルを app/config/initializers
配下におくだけでOKです。
AWS.config( s3_signature_version: :v4 )
こうすることでS3クライアントのインスタンスを生成する時にデフォルトで署名バージョン4が使われるようになります。
ただし、上記のやり方はaws-sdk-v1のみで有効で、aws-sdk-v2では使えないようなので注意してください。
最後に
基本的にはaws-sdkのバージョンアップをするか、署名バージョンを明示的に指定するかの方法で対応することになると思います。 依存関係にあるライブラリのアップデートまでしてしまうと影響範囲が大きくなって検証が大変になってしまうので、そこは要考慮ポイントですね。
LCLではプロダクトのメンテナンスもやっていただける方を募集中です!ご興味のある方は、お気軽にご連絡ください! www.lclco.com