署名バージョン4専用のS3エンドポイントを古いCLIで試してみた

はじめに

AWSチームのすずきです。

Amazon S3 のAPIリクエスト、署名バージョン 2(SigV2) は2019 年 6 月 24 日に廃止が予定されており、 S3を署名バージョン2で利用するシステムは、署名バージョン 4(SigV4) への切替が必要となります。

Amazon S3 における AWS 署名バージョン 2 の廃止

【超重要】対応しないと使えなくなるかも?!今、全S3ユーザがチェックすべき署名バージョン2の廃止について

今回、署名バージョン4のみをサポートするリージョンのS3のエンドポイントと、 S3を署名バージョン2で利用する 古いバージョンのAWS CLI を用いて、S3が利用出来ない状況を再現、 AWS CLIのアップグレードが回避策として有効な事を確認する機会がありましたので、紹介させて頂きます。

署名バージョン 2 の署名プロセス

次のリージョンでは、署名バージョン 2 はサポートされていません。これらのリージョンでは、署名バージョン 4 を使用して署名する必要があります。

米国東部 (オハイオ) リージョン カナダ (中部) リージョン アジアパシフィック (ムンバイ) リージョン アジアパシフィック (ソウル) リージョン 欧州 (フランクフルト) リージョン 欧州 (ロンドン) リージョン 中国 (北京) リージョン

【新リージョン】オハイオリージョンがオープンしました!

検証環境

OS

  • AMI: Amazon Linux AMI 2016.09.1.20170119 x86_64 HVM GP2
$ cat /etc/system-release
Amazon Linux AMI release 2016.09

AWS CLI

$ aws --version
aws-cli/1.11.29 Python/2.7.12 Linux/4.4.35-33.55.amzn1.x86_64 botocore/1.4.86

接続検証

東京(ap-northeast-1)

  • エンドポイントは https://s3-ap-northeast-1.amazonaws.comを利用しました。
  • s3api(get-bucket-location)を用いて、指定したS3バケットの情報を取得する事ができました。
aws --endpoint-url https://s3-ap-northeast-1.amazonaws.com s3api get-bucket-location --bucket access-ap-northeast-1-000

{
    "LocationConstraint": "ap-northeast-1"
}

オハイオ(us-east-2)

  • エンドポイントは https://s3-us-east-2.amazonaws.comを利用しました。
  • 署名バージョン4(SigV4) の利用を求めるエラーメッセージが出力され、有効な情報を得る事は出来ませんでした。
aws --endpoint-url https://s3-us-east-2.amazonaws.com s3api get-bucket-location --bucket access-us-east-2-000

An error occurred (InvalidRequest) when calling the GetBucketLocation operation: You are attempting to operate on a bucket in a region that requires Signature Version 4.  You can fix this issue by explicitly providing the correct region location using the --region argument, the AWS_DEFAULT_REGION environment variable, or the region variable in the AWS CLI configuration file.  You can get the bucket's location by running "aws s3api get-bucket-location --bucket BUCKET".
  • S3をハイレベルで利用する ls 等でも再現しました。
  • デバッグ出力より、認証エラーによる例外が発生している事が確認できました。
  • 2019年6月24日以降、古いAWSCLIでは東京リージョンのS3利用時に発生すると予想されます。
$ aws --endpoint-url https://s3-us-east-2.amazonaws.com s3 ls --debug
2019-03-05 14:34:49,603 - MainThread - awscli.clidriver - DEBUG - CLI version: aws-cli/1.11.29 Python/2.7.12 Linux/4.4.41-36.55.amzn1.x86_64 botocore/1.4.86
2019-03-05 14:34:49,604 - MainThread - awscli.clidriver - DEBUG - Arguments entered to CLI: ['--endpoint-url', 'https://s3-us-east-2.amazonaws.com', 's3', 'ls', '--debug']
(略)
2019-03-05 14:34:49,658 - MainThread - botocore.endpoint - DEBUG - Sending http request: <PreparedRequest [GET]>
2019-03-05 14:34:49,658 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - INFO - Starting new HTTPS connection (1): s3-us-east-2.amazonaws.com
2019-03-05 14:34:50,326 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - DEBUG - "GET / HTTP/1.1" 400 None
2019-03-05 14:34:50,328 - MainThread - botocore.parsers - DEBUG - Response headers: {'x-amz-region': 'us-east-2', 'x-amz-id-2': '=', 'server': 'AmazonS3', 'transfer-encoding': 'chunked', 'connection': 'close', 'x-amz-request-id': '8D', 'date': 'Tue, 05 Mar 2019 14:34:49 GMT', 'content-type': 'application/xml'}
2019-03-05 14:34:50,328 - MainThread - botocore.parsers - DEBUG - Response body:
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidRequest</Code><Message>The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.</Message><RequestId>8D</RequestId><HostId>+=</HostId></Error>
(略)

対策

アップデート

AmazonLinuxの2018.03(latest)リポジトリより、最新版のAWS CLIにアップデートします。

リポジトリ確認

リリースバージョン、releaseverの設定値が「latest」「2018.03」である事を確認します。

$ cat /etc/yum.conf  | grep releasever=
releasever=latest
$ cat /etc/yum/vars/releasever
cat: /etc/yum/vars/releasever: No such file or directory

リリースバージョン「2017.09」以前を指定している場合には、利用リポジトリの変更が必要です。

Amazon Linuxのリリースバージョンを固定する

アップデート

  • 「aws-cli」をアップデートします。
sudo yum update aws-cli
  • 2016.09 環境では、依存関係を含む以下の4つのパッケージが更新されました。
(1/4): python27-jmespath-0.9.2-1.12.amzn1.noarch.rpm
(2/4): python27-botocore-1.12.92-2.69.amzn1.noarch.rpm
(3/4): aws-cli-1.16.102-1.50.amzn1.noarch.rpm
(4/4): python27-urllib3-1.24.1-1.6.amzn1.noarch.rpm
aws --version
1.16.102 Python/2.7.12 Linux/4.4.35-33.55.amzn1.x86_64 botocore/1.12.92

動作確認

  • 東京、オハイオのS3ポイントが利用可能になりました。
aws --endpoint-url https://s3-ap-northeast-1.amazonaws.com s3api get-bucket-location --bucket access-ap-northeast-1-000

{
    "LocationConstraint": "ap-northeast-1"
}
aws --endpoint-url https://s3-us-east-2.amazonaws.com s3api get-bucket-location --bucket access-us-east-2-000
{
    "LocationConstraint": "us-east-2"
}

まとめ

2019年6月24日以降、東京リージョンのS3も署名バージョン 2を利用する環境からは利用できなくなります。

署名バージョン2(SigV2)の利用が存在する場合、S3のサポートが終了する2019年6月24日までにAWS SDK、CLIの最新バージョンへの更新などのメンテナンスを実施して、署名バージョン4への切替を完了させる事をお薦めします。

Amazon S3 における AWS 署名バージョン 2 の廃止

署名バージョン 4 (SigV4) を使用するために必要な最低限のバージョンの SDK の一覧

SDK SDKのアップグレード要否 アプリケーションコードの修正要否
AWS SDK for Java v1 Java 1.11.x あるいは v2 in Q4 2018 にアップグレード。 はい
AWS SDK for Java v2 (プレビュー) SDK のアップグレードは不要です。 いいえ
AWS SDK for .NET v1 3.1.10 以降にアップグレード。 はい
AWS SDK for .NET v2 3.1.10 以降にアップグレード。 いいえ
AWS SDK for .NET v3 SDK のアップグレードは不要です。 はい
AWS SDK for JavaScript v1 現在のところ、何もする必要はありません。主要バージョン V3 in Q3 2019 にアップグレード。 はい
AWS SDK for JavaScript v2 2.68.0 以降にアップグレード。 はい
AWS SDK for JavaScript v3 現在のところ、何もする必要はありません。主要バージョン V3 in Q3 2019 にアップグレード。 いいえ
AWS SDK for PHP v1 主要バージョン V3 にアップグレード。 はい
AWS SDK for PHP v2 主要バージョン V3 にアップグレード。 はい
AWS SDK for PHP v3 SDK のアップグレードは不要です。 いいえ
Boto2 Boto2 v2.49.0 にアップグレード。 はい
Boto3 1.5.71 (Botocore)、1.4.6 (Boto3) にアップグレード。 はい
AWS CLI 1.11.108 にアップグレード。 はい
AWS CLI v2 (プレビュー) SDK のアップグレードは不要です。 いいえ
AWS SDK for Ruby v1 Ruby V3 にアップグレード。 はい
AWS SDK for Ruby v2 Ruby V3 にアップグレード。 はい
AWS SDK for Ruby v3 SDK のアップグレードは不要です。 いいえ
Go SDK のアップグレードは不要です。 いいえ
C++ SDK のアップグレードは不要です。 いいえ

Amazon S3の 署名バージョン2(SigV2)の利用は、CloudTrailのデータイベントとして記録されます。 署名バージョン2を利用したS3接続を監視、通知する方法は以下の記事を参考にして下さい。

廃止予定のS3署名バージョン2API利用をCloudWatchEventで検出してみた

追加確認

古いAmazon Linux 2013.03 を利用して追試、CLIの更新によりオハイオリージョンの利用が可能な事を確認できました。

  • 環境情報
$ cat /etc/system-release
Amazon Linux AMI release 2013.03
$ cat /etc/yum.conf  | grep releasever=
releasever=latest
$ aws --version
aws-cli/0.8.2 Python/2.6.9 Linux/3.4.37-40.44.amzn1.x86_64
  • 依存関係を含む以下のパッケージがインストールされました。
    sudo yum update aws-cli -y
    (略)
    (1/102): audit-2.6.5-3.28.amzn1.x86_64.rpm
    (2/102): audit-libs-2.6.5-3.28.amzn1.i686.rpm
    (3/102): audit-libs-2.6.5-3.28.amzn1.x86_64.rpm
    (4/102): authconfig-6.2.8-30.31.amzn1.x86_64.rpm
    (5/102): aws-cfn-bootstrap-1.4-31.22.amzn1.noarch.rpm
    (6/102): aws-cli-1.16.102-1.50.amzn1.noarch.rpm
    (7/102): checkpolicy-2.1.10-1.9.amzn1.x86_64.rpm
    (8/102): chkconfig-1.3.49.3-2.14.amzn1.x86_64.rpm
    (9/102): curl-7.61.1-7.91.amzn1.x86_64.rpm
    (10/102): expat-2.1.0-10.21.amzn1.x86_64.rpm
    (11/102): glibc-2.17-260.175.amzn1.i686.rpm
    (12/102): glibc-2.17-260.175.amzn1.x86_64.rpm
    (13/102): glibc-common-2.17-260.175.amzn1.x86_64.rpm
    (14/102): libcap-ng-0.7.5-4.15.amzn1.i686.rpm
    (15/102): libcap-ng-0.7.5-4.15.amzn1.x86_64.rpm
    (16/102): libcgroup-0.40.rc1-5.11.amzn1.x86_64.rpm
    (17/102): libcurl-7.61.1-7.91.amzn1.x86_64.rpm
    (18/102): libffi-3.0.13-16.5.amzn1.x86_64.rpm
    (19/102): libicu-50.1.2-11.12.amzn1.x86_64.rpm
    (20/102): libidn2-0.16-1.2.amzn1.x86_64.rpm
    (21/102): libjpeg-turbo-1.2.90-5.14.amzn1.x86_64.rpm
    (22/102): libnghttp2-1.21.1-1.4.amzn1.x86_64.rpm
    (23/102): libpsl-0.6.2-1.2.amzn1.x86_64.rpm
    (24/102): libpwquality-1.2.3-4.8.amzn1.x86_64.rpm
    (25/102): libselinux-2.1.10-3.22.amzn1.i686.rpm
    (26/102): libselinux-2.1.10-3.22.amzn1.x86_64.rpm
    (27/102): libselinux-utils-2.1.10-3.22.amzn1.x86_64.rpm
    (28/102): libsemanage-2.1.6-3.13.amzn1.x86_64.rpm
    (29/102): libunistring-0.9.3-6.1.amzn1.x86_64.rpm
    (30/102): libxml2-2.9.1-6.3.52.amzn1.x86_64.rpm
    (31/102): libxml2-python27-2.9.1-6.3.52.amzn1.x86_64.rpm
    (32/102): newt-0.52.11-3.11.amzn1.x86_64.rpm
    (33/102): newt-python26-0.52.11-3.11.amzn1.x86_64.rpm
    (34/102): newt-python27-0.52.11-3.11.amzn1.x86_64.rpm
    (35/102): nspr-4.19.0-1.43.amzn1.x86_64.rpm
    (36/102): nss-softokn-freebl-3.36.0-5.42.amzn1.i686.rpm
    (37/102): nss-softokn-freebl-3.36.0-5.42.amzn1.x86_64.rpm
    (38/102): nss-util-3.36.0-1.54.amzn1.x86_64.rpm
    (39/102): ntsysv-1.3.49.3-2.14.amzn1.x86_64.rpm
    (40/102): openssl-1.0.2k-16.146.amzn1.x86_64.rpm
    (41/102): policycoreutils-2.1.12-5.25.amzn1.x86_64.rpm
    (42/102): python26-2.6.9-2.89.amzn1.x86_64.rpm
    (43/102): python26-argparse-1.2.1-2.8.amzn1.noarch.rpm
    (44/102): python26-backports-1.0-3.14.amzn1.x86_64.rpm
    (45/102): python26-backports-ssl_match_hostname-3.4.0.2-1.12.amzn1.noarch.rpm
    (46/102): python26-iniparse-0.3.1-2.1.9.amzn1.noarch.rpm
    (47/102): python26-jmespath-0.9.2-1.12.amzn1.noarch.rpm
    (48/102): python26-libs-2.6.9-2.89.amzn1.x86_64.rpm
    (49/102): python26-ply-3.4-3.12.amzn1.noarch.rpm
    (50/102): python26-pycurl-7.19.0-17.12.amzn1.x86_64.rpm
    (51/102): python26-pygpgme-0.3-9.12.amzn1.x86_64.rpm
    (52/102): python26-pyliblzma-0.5.3-11.6.amzn1.x86_64.rpm
    (53/102): python26-pystache-0.5.3-2.8.amzn1.noarch.rpm
    (54/102): python26-pyxattr-0.5.0-1.6.amzn1.x86_64.rpm
    (55/102): python26-setuptools-36.2.7-1.33.amzn1.noarch.rpm
    (56/102): python26-urlgrabber-3.10-8.16.amzn1.noarch.rpm
    (57/102): python27-2.7.15-1.124.amzn1.x86_64.rpm
    (58/102): python27-PyYAML-3.10-3.10.amzn1.x86_64.rpm
    (59/102): python27-backports-1.0-3.14.amzn1.x86_64.rpm
    (60/102): python27-backports-ssl_match_hostname-3.4.0.2-1.12.amzn1.noarch.rpm
    (61/102): python27-botocore-1.12.92-2.69.amzn1.noarch.rpm
    (62/102): python27-chardet-2.0.1-7.7.amzn1.noarch.rpm
    (63/102): python27-colorama-0.2.5-1.7.amzn1.noarch.rpm
    (64/102): python27-daemon-1.5.2-1.5.amzn1.noarch.rpm
    (65/102): python27-dateutil-2.1-1.3.amzn1.noarch.rpm
    (66/102): python27-docutils-0.11-1.15.amzn1.noarch.rpm
    (67/102): python27-futures-3.0.3-1.3.amzn1.noarch.rpm
    (68/102): python27-imaging-1.1.6-19.9.amzn1.x86_64.rpm
    (69/102): python27-iniparse-0.3.1-2.1.9.amzn1.noarch.rpm
    (70/102): python27-jmespath-0.9.2-1.12.amzn1.noarch.rpm
    (71/102): python27-kitchen-1.1.1-5.6.amzn1.noarch.rpm
    (72/102): python27-libs-2.7.15-1.124.amzn1.x86_64.rpm
    (73/102): python27-lockfile-0.8-3.5.amzn1.noarch.rpm
    (74/102): python27-ply-3.4-3.12.amzn1.noarch.rpm
    (75/102): python27-pyasn1-0.1.7-2.9.amzn1.noarch.rpm
    (76/102): python27-pycurl-7.19.0-17.12.amzn1.x86_64.rpm
    (77/102): python27-pygpgme-0.3-9.12.amzn1.x86_64.rpm
    (78/102): python27-pyliblzma-0.5.3-11.6.amzn1.x86_64.rpm
    (79/102): python27-pystache-0.5.3-2.8.amzn1.noarch.rpm
    (80/102): python27-pyxattr-0.5.0-1.6.amzn1.x86_64.rpm
    (81/102): python27-rsa-3.4.1-1.8.amzn1.noarch.rpm
    (82/102): python27-setuptools-36.2.7-1.33.amzn1.noarch.rpm
    (83/102): python27-six-1.8.0-1.23.amzn1.noarch.rpm
    (84/102): python27-urlgrabber-3.10-8.16.amzn1.noarch.rpm
    (85/102): python27-urllib3-1.24.1-1.6.amzn1.noarch.rpm
    (86/102): rpm-4.11.3-21.75.amzn1.x86_64.rpm
    (87/102): rpm-build-libs-4.11.3-21.75.amzn1.x86_64.rpm
    (88/102): rpm-libs-4.11.3-21.75.amzn1.x86_64.rpm
    (89/102): rpm-python26-4.11.3-21.75.amzn1.x86_64.rpm
    (90/102): rpm-python27-4.11.3-21.75.amzn1.x86_64.rpm
    (91/102): sqlite-3.7.17-8.14.amzn1.x86_64.rpm
    (92/102): ustr-1.0.4-9.1.6.amzn1.x86_64.rpm
    (93/102): xz-5.1.2-12alpha.12.amzn1.x86_64.rpm
    (94/102): xz-libs-5.1.2-12alpha.12.amzn1.x86_64.rpm
    (95/102): xz-lzma-compat-5.1.2-12alpha.12.amzn1.x86_64.rpm
    (96/102): yum-3.4.3-150.70.amzn1.noarch.rpm
    (97/102): yum-metadata-parser-1.1.4-10.20.amzn1.x86_64.rpm
    (98/102): yum-metadata-parser-python26-1.1.4-10.20.amzn1.x86_64.rpm
    (99/102): yum-plugin-priorities-1.1.31-46.30.amzn1.noarch.rpm
    (100/102): yum-plugin-upgrade-helper-1.1.31-46.30.amzn1.noarch.rpm
    (101/102): yum-python26-3.4.3-150.70.amzn1.noarch.rpm
    (102/102): yum-utils-1.1.31-46.30.amzn1.noarch.rpm
    

  • オハイオリージョンのS3エンドポイントが利用できました。

$ aws --version
aws-cli/1.16.102 Python/2.7.15 Linux/3.4.37-40.44.amzn1.x86_64 botocore/1.12.92

$ aws --endpoint-url https://s3-us-east-2.amazonaws.com s3api get-bucket-location --bucket access-us-east-2-000

{
    "LocationConstraint": "us-east-2"
}