AWS SDK for PHPのアップデート(S3 APIのv2署名→v4署名対応)

BPSの福岡拠点として一緒にお仕事させて頂いてます、株式会社ウイングドアの山浦です

最近暑くなってきました。体調を崩さないよう気をつけます。

まずはじめに

今回は表題の通り、AWS(Amazon Web Service)のサービスである、S3での対応について書かせていただこうと思います。

もうすでに多くの方々が記事にまとめて下さっている、「AWS S3 APIのv2署名が2019年6月24日で無効になるよ!」のお知らせが今回の記事を書くことに決めた理由です。

AWSのリクエスト認証である署名バージョン2が廃止されるよーというやつですね。

このアナウンスによりS3 APIにて署名バージョン2を使用している大勢の人々が対応を考えたことだと思います。

6月24日以降に今まで使用していたものが使えなくなるかもしれないですからね、大事です。

AWS Developer Forumsにも、6月24日に署名バージョン2のリクエストは受け付けなくなると書いてありました(2018年6月11日付の記事)

しかし!

そんな中、BPSのhachi8833さんが以下のような記事をまとめて下さっていました。

AWS S3 APIのv2署名は6/24に廃止されず、まだ使える?(続報あり)

「2019年6月24日でS3のv2署名のサポートを廃止」に相当する記述はなくなっています

どうやら日付の記述がなくなっているというのは本当のようです。
実際に公式ドキュメントを覗きましたが、6月24日に廃止される旨の記述はどこにも見当たりませんでした。

結局対応しないといけないの??? 気になる緊急度は・・・?

6月24日という期限がなくなり、廃止される日付が延長された(という解釈)ので、今回記述しようとしていた内容(署名バージョンアップデート)は、緊急度という意味では、高→中くらいに下がったような気がします。

なぜ期限が延長された今でも中レベルなのかと言いますと、

公式によると元々署名バージョン2は非推奨となっているからです。

セキュリティの面から見ましても、署名バージョン4への切り替えはしておいた方が良いと考えています。

※英語ドキュメントの「deprecated」の意味は、「廃止予定の、非推奨の」 という意味があります。
いずれ廃止される予定であるのであれば、早めに対応しておいた方が安心できますね。

hachi8833 さんも仰ってますが、実際の事情はAWSさんしかわかりません。

ですので、もしお詳しい方がいらっしゃいましたら、ぜひTechRachoまでご連絡お願いいたします。

以下、AWS for SDK PHP でのアップデート対応の内容です。

以下の記事はhachi8833さんの記事に気づく前に書かせていただいたものになります。

署名バージョン2の廃止は、6月24日の期限こそ延長された(はず)ものの、公式が非推奨と言っておりますので、もし署名バージョン4への移行をご検討をされている場合にご参考にしていただけると幸いです。

1) S3とは

データを色々出し入れできるストレージサービスです。

Amazon Simple Storage Serviceの頭文字のS3つをとって、S3と呼ばれることが多いです。

公式ページによりますと、

Amazon Simple Storage Service はインターネット用のストレージサービスです。また、ウェブスケールのコンピューティングを開発者が簡単に利用できるよう設計されています。
Amazon S3 のウェブサービスインターフェイスはシンプルで、いつでも、ウェブのどこからでも容量に関係なくデータを格納および取得できます。

Amazon S3 とは何ですか? - Amazon Simple Storage Serviceより

非常に便利なサービスですので、使用している方も多いのではないでしょうか。

署名バージョン

AWSに対してHTTPのリクエストを送る際に、リクエストに署名する必要があるのですが、AWSには2つの署名バージョンがあります。

署名バージョン 2 と署名バージョン 4 がこれに当てはまります。

署名バージョン 2 または署名バージョン 4 の署名プロセスは、Amazon S3 API リクエストを認証するために使用されます。リクエストの署名は、Amazon S3 によってリクエストの送信者を識別し、悪意のある人物からリクエストを保護することができるようになります。

Amazon S3 の AWS 署名バージョン 2 がオフ (廃止)より

この「署名バージョン2」の方が、近い将来廃止予定となっているのですね。

2) 対応方法

では実際に何を行えばよいのでしょうか。

私の場合は、AWS SDKでリクエスト認証に署名バージョン 2 を使用していたので、署名バージョン 4 に移行させたいと考えていました。

署名バージョン4を使用するには、最低限必要なSDKのバージョンがあり、公式によってその一覧が作成されています。

参考: 署名バージョン 2 から署名バージョン 4 への移行

こちらの一覧と、実際に使用しているSDKバージョンを確認し、署名バージョン4を使用する環境が必要でなければアップデートをする必要があります。

3) バージョン確認

さて、実際に自分が扱っているシステムがS3のどの署名バージョンを使用しているのか、また使用しているSDKのバージョンを確認しようと思います。

ですので、実際に行なったバージョン確認の方法を記載します。

確認方法

  • CloudTrailのログを確認し現在使っているバージョンを把握
"SignatureVersion": "SigV2"
"userAgent": "[aws-sdk-php/1.5.6.2 PHP/5.6.19 (以下略)

この確認によって、AWS SDK for PHPのバージョン1系を使用していることと、署名バージョン2が使用されていることが確認できました。

※SigV2は、SignatureVersion2の略です。

CloudTrailは、AWSのイベントのログを残すことができます。

ユーザー、ロール、または AWS のサービスによって実行されたアクションは、CloudTrail にイベントとして記録されます。イベントには、AWS マネジメントコンソール、AWS Command Line Interface、および AWS SDK と API で実行されたアクションが含まれます。
AWS CloudTrail とは - AWS CloudTrailより

先述の最低限必要なSDKのバージョン一覧では、AWS SDK for PHP v1は

最新バージョンの PHP、または少なくとも S3 クライアントの設定で署名パラメータを v4 に設定した v2.7.4 にアップグレードすることをお勧めします。
署名バージョン 2 から署名バージョン 4 への移行より

とありますので、今回SDKを最新のものへと変更を行うことにしました。

4) SDKアップデート

AWS SDK for PHP v3へのアップデート

Composer を使って AWS SDK for PHP をアップデートします。
Composerがグローバルインストールされているのであれば、下記のコマンドでインストールできます。

composer require aws/aws-sdk-php

インストールされていないのであれば、こちらになります。

php -d memory_limit=-1 composer.phar require aws/aws-sdk-php

5) s3.phpの記述

AmazonS3クラスをインスタンス化する際の記述です。

  • version1

今回は、version1→version3へとSDKのバージョンをアップデートしましたので、S3クライアントインスタンス化の記述が変更となりました。

$this->s3 = new AmazonS3([
    'key' => 'AWS_ACCESS_KEY',
    'secret' => 'AWS_SECRET_ACCESS_KEY',
]);
  • version3
<?php $s3="new" awss3s3client([="" 'key'=""?> 'AWS_ACCESS_KEY',
    'secret' => 'AWS_SECRET_ACCESS_KEY',
    'version' => 'latest',
    'region' => 'YOUR-REGION'
]);

v3では、インストール時に 'version''region' オプションが必須となりました。v3ではデフォルトで署名バージョン4を利用しているため、これできちんとS3アクセス時に署名バージョンが確認できれば問題はないはずです。

※2016 年 5 月以前にリリースされた AWS SDK を使用する場合、署名バージョン 4 のリクエストが必要になることがあります。

※また、AWS SDK for PHP v3はPHP5.5以上が必須ですので、アップデートする際は確認が必要です。

AWS SDK for PHP を使用するには、PHP バージョン 5.5.0 以降を使用する必要があります。
AWS SDK for PHP バージョン 3 の要件と推奨事項より

6) きちんとS3アクセスできている!

動作確認として、S3へのアップロード・削除等行えることを確認してきました。

また、AWS CloudTrailを使用し、ログファイルを確認したところ、きちんと署名バージョンが4になっている事も確認できました。

"SignatureVersion":"SigV4"
      .
      .
      .
"userAgent":"[aws-sdk-php/3.90.10 GuzzleHttp/6.3・・・・・・・・・・

7) 公式のお知らせのチェックを怠らない!!

今回は期限が変更される前に対応ができましたが、もしその知らせすら気づいていなかったらと考えると少し焦ります。

普段から公式のドキュメントやお知らせに目を配る様にしたいと思います。


株式会社ウイングドアでは、Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、
スマホアプリや業務系システムなど様々なシステム開発を承っています。

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

wingdoor

株式会社ウイングドアは福岡のシステム開発会社です。Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、 スマホアプリや業務系システムなど様々なシステム開発を承っています。 中途採用を絶賛募集しています! https://wingdoor.co.jp/

wingdoorの書いた記事

夏のTechRachoフェア2019

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ