S3の署名バージョン2 廃止にAWS CLIやSDKをバージョンアップせずに対応する方法を調べてみた

記事タイトルとURLをコピーする

S3における「署名バージョン2」が2019年6月24日に廃止されます

下記リンクに記載があるとおり、S3へのAPIリクエスト時の「署名バージョン2」が廃止され、「署名バージョン4」のリクエストのみを受け付けるようになります。

Amazon S3 における署名バージョン 2 は廃止され、署名バージョン 2 の最終サポートは 2019 年 6 月 24 日に終了します。2019 年 6 月 24 日以降、Amazon S3 は署名バージョン 4 を使用して署名された API リクエストのみを受けつけます。

AWS CLIやAWS SDKのバージョンによっては、S3へのAPIリクエスト時のデフォルトの署名バージョンが「署名バージョン2」になっているものがあり、2019年6月24日以降、S3側で「署名バージョン2」のAPIリクエストの受付が廃止されると、APIリクエストに失敗するようになります。

S3における「署名バージョン2」廃止により影響を受けるケース

S3における「署名バージョン2」廃止により影響を受けるのは下記のケースになります。

  • 古いAWS CLI、またはAWS SDKを利用している

具体的には下記リンクに記載されているバージョンのCLIやSDKが影響を受けます。

例えば、AWS CLIであれば、「1.11.108」より古いバージョンの場合、AWS Java SDKであれば「1.11.x」より古いバージョンの場合、デフォルトのS3へのAPIリクエストが「署名バージョン2」になっています。

スクリプト内でAWS CLIを利用しS3にオブジェクトをアップロードしたり、プログラムからAWS SDKを利用してS3上のオブジェクトを操作しているようなケースがあるかと思いますが、その中で古いバージョンのAWS CLIやAWS SDKを利用している場合に影響を受ける可能性がありますので、念のためバージョンをチェックされることをお勧めします。

また、サードパーティ製のツールやソフトウェアが内部的にAWS SDKを利用している場合も同様に、影響を受ける可能性がありますので確認が必要です。

S3にアクセスするサードパーティ製ツールの影響については下記の記事もご参考ください

関連記事:「S3の署名バージョン2 廃止に対応する方法を調べてみた(Embulk S3プラグイン編)
関連記事:「ETLツール「Talend」でS3署名バージョン2廃止に対応する方法

S3へのAPIリクエストを「署名バージョン2」から「署名バージョン4」へ移行する方法

を見ると「古いAWS CLIやAWS SDKを利用している場合はバージョンアップが必要」のように読み取れますが、

古いAWS CLIやAWS SDKでも、署名バージョンの指定をすることで、「署名バージョン4」でAPIリクエストをすることができるようになっていました。

CLIやSDKでの署名バージョンの指定方法は下記に記載されています。

念のためAWSサポートにも確認しましたが、「署名バージョン4」への移行方法は、例えばAWS Java SDKの場合、下記の2通りがあるとのことでしたので、必ずしもCLIやSDKをバージョンアップする必要はなさそうです。

AWSサポートからの回答

次の「いずれか」の方法で署名バージョン4にご対応いただくことができます。
  • ご利用いただくAWS Java SDKを 1.11.x にバージョンアップする。
  • AWS Java SDKとして 1.6.10 以降のバージョンをご利用いただいた上で、javaコマンドの引数として「-Dcom.amazonaws.services.s3.enableV4」を指定する。

だだし「CLIやSDKは常にバージョンアップしており他の機能改善等も行われているため、アップデートによる対応も検討ください」とのことでした。

S3の署名バージョン2 廃止にAWS CLIやSDKをバージョンアップせずに対応する方法

AWS CLIやAWS SDKをバージョンアップするのには、それなりに修正やリスクが伴う可能性があります。

これらのバージョンアップが容易に行えない環境では、署名バージョンを指定する方法があります。

リクエスト認証での署名バージョンの指定」の内容に従って、いくつかの古いCLIバージョン、各言語の古いSDKで試してみました。

※ 以下に記載している方法は、SDKなどのバージョンによって挙動が異なる可能性もありますので、実際に動作をご検証のうえご利用ください。

AWS CLIの場合

AWS CLIの場合は、 aws configure set default.s3.signature_version s3v4 コマンドで、予めプロファイルのS3へのAPIリクエスト時の署名バージョンを指定しておくことで、「署名バージョン4」でリクエストをすることが可能でした。

動作確認したバージョン:「aws-cli/1.6.10」および「aws-cli/1.10.8」

※「aws-cli/1.6.3」から指定が可能になっているとのことです。

https://github.com/aws/aws-cli/blob/develop/CHANGELOG.rst#163

1.6.3 ・bugfix:Signature Version 4: You can enable Signature Version 4 for Amazon S3 commands by running aws configure set default.s3.signature_version s3v4 (issue 1006, botocore issue 382)
■ そのまま aws s3 ls コマンドを実行した場合
$ aws --version
aws-cli/1.6.10 Python/2.6.9 Linux/3.14.20-20.44.amzn1.x86_64

$ aws s3 ls sigv2-test-bucket
                       PRE test/

CloudTrailのログ (SignatureVersionSigV2 になっている)

    :
    :
    "eventTime": "2019-XX-XXT08:04:25Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "ListObjects",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "xxx.xxx.xxx.xxx",
    "userAgent": "[aws-cli/1.6.10 Python/2.6.9 Linux/3.14.20-20.44.amzn1.x86_64]",
    "requestParameters": {
        "bucketName": "sigv2-test-bucket",
        "Host": "sigv2-test-bucket.s3-ap-northeast-1.amazonaws.com",
        "prefix": "",
        "delimiter": "/"
    },
    "responseElements": null,
    "additionalEventData": {
        "SignatureVersion": "SigV2",
    :
    :
aws configure set default.s3.signature_version s3v4 を実行
$ aws --version
aws-cli/1.6.10 Python/2.6.9 Linux/3.14.20-20.44.amzn1.x86_64

$ aws configure set default.s3.signature_version s3v4

$ aws s3 ls sigv2-test-bucket

# リージョンを指定しない場合、下記エラーが出るようになる
A client error (PermanentRedirect) occurred when calling the ListObjects operation: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint: sigv2-test-bucket.s3.amazonaws.com
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".

# デフォルトリージョンを設定
$ aws configure
Default region name [None]: ap-northeast-1

$ aws s3 ls sigv2-test-bucket
                       PRE test/

CloudTrailのログ(SignatureVersionSigV4 に変わっていることを確認)

    :
    :
    "eventTime": "2019-XX-XXT08:17:58Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "ListObjects",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "xxx.xxx.xxx.xxx",
    "userAgent": "[aws-cli/1.6.10 Python/2.6.9 Linux/3.14.20-20.44.amzn1.x86_64]",
    "requestParameters": {
        "bucketName": "sigv2-test-bucket",
        "Host": "s3-ap-northeast-1.amazonaws.com",
        "prefix": "",
        "delimiter": "/"
    },
    "responseElements": null,
    "additionalEventData": {
        "SignatureVersion": "SigV4",
    :
    :

また .aws/config の中身は下記のように、

  • S3リクエスト時の署名バージョンの指定
  • デフォルトリージョンの指定

が入っている状態になっています

$ view .aws/config
[default]
s3 =
    signature_version = s3v4
region = ap-northeast-1

AWS Java SDKの場合

AWS Java SDKの場合はJava実行時のコマンド引数に -Dcom.amazonaws.services.s3.enableV4 を指定することで、「署名バージョン4」でリクエストをすることが可能でした。

この指定は「aws-sdk-java/1.6.10」 から可能になっているとのことです。

そのまま実行した場合

CloudTrailのログ (SignatureVersionSigV2 になっている)

    :
    :
    "eventTime": "2019-XX-XXT02:34:42Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "GetObject",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "xxx.xxx.xxx.xxx",
    "userAgent": "[aws-sdk-java/1.9.13 Windows_Server_2012_R2/6.3 Java_HotSpot(TM)_64-Bit_Server_VM/24.80-b11/1.7.0_80]",
    "requestParameters": {
        "bucketName": "sigv2-test-bucket",
        "Host": "sigv2-test-bucket.s3.amazonaws.com",
        "key": "test.zip"
    },
    "responseElements": null,
    "additionalEventData": {
        "SignatureVersion": "SigV2",
    :
    :
Java実行時のコマンド引数に -Dcom.amazonaws.services.s3.enableV4 を指定した場合

CloudTrailのログ(SignatureVersionSigV4 に変わっていることを確認)

    :
    :
"eventTime": "2019-XX-XXT06:36:53Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "GetObject",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "xxx.xxx.xxx.xxx",
    "userAgent": "[aws-sdk-java/1.9.13 Windows_Server_2012_R2/6.3 Java_HotSpot(TM)_64-Bit_Server_VM/24.80-b11/1.7.0_80]",
    "requestParameters": {
        "bucketName": "sigv2-test-bucket",
        "Host": "sigv2-test-bucket.s3-ap-northeast-1.amazonaws.com",
        "key": "test.zip"
    },
    "responseElements": null,
    "additionalEventData": {
        "SignatureVersion": "SigV4",
    :
    :

AWS Ruby SDK(v1)の場合

「aws-sdk-ruby/v1.31.0」より「s3_signature_version」の指定可能になっているとのことです。

https://github.com/aws/aws-sdk-ruby/commit/7abd9a7d72e386002a41315a6745bd64c1bba735#diff-73e2cad9fbe3e161575d145a3e3062f6

You can now configure the S3 signature version. For example: # as a global default AWS.config(:s3 => { :signature_version => :v4 }) # per service AWS::S3.new(:s3_signature_version => :v4)

動作確認したバージョン:「aws-sdk-ruby/1.51.0」

s3_signature_version の指定なし
AWS::S3.new(region: 'ap-northeast-1').buckets['bucket-name']

CloudTrailのログ (SignatureVersionSigV2 になっている)

    :
    :
    "eventTime": "2019-XX-XXT10:25:20Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "ListObjects",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "xxx.xxx.xxx.xxx",
    "userAgent": "[aws-sdk-ruby/1.51.0 ruby/2.0.0 x86_64-linux]",
    "requestParameters": {
        "bucketName": "sigv2-test-bucket",
        "Host": "sigv2-test-bucket.s3-ap-northeast-1.amazonaws.com",
        "max-keys": "20",
        "prefix": "test/"
    },
    "responseElements": null,
    "additionalEventData": {
        "SignatureVersion": "SigV2",
    :
    :
:s3_signature_version => :v4 の指定あり
AWS::S3.new(region: 'ap-northeast-1',:s3_signature_version => :v4).buckets['bucket-name']

CloudTrailのログ(SignatureVersionSigV4 に変わっていることを確認)

    :
    :
    "eventTime": "2019-XX-XXT10:27:26Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "ListObjects",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "xxx.xxx.xxx.xxx",
    "userAgent": "[aws-sdk-ruby/1.51.0 ruby/2.0.0 x86_64-linux]",
    "requestParameters": {
        "bucketName": "sigv2-test-bucket",
        "Host": "sigv2-test-bucket.s3-ap-northeast-1.amazonaws.com",
        "max-keys": "20",
        "prefix": "test/"
    },
    "responseElements": null,
    "additionalEventData": {
        "SignatureVersion": "SigV4",
    :
    :

S3へのリクエストの署名バージョンの確認方法

S3へのリクエストの署名バージョンの確認方法はいくつかありますが、簡単な方法としてS3の「オブジェクトレベルのログ記録」や「サーバーアクセスのログ記録」有効化する方法です。

「オブジェクトレベルのログ記録」を有効化して記録されたログは、CloudTrailで設定したS3バケットやCloudWatch Logsに出力されます。

注意点としては、CloudWatch Logsに出力されるまでに数分かかるため、CloudWatch Logsのログの時刻と、ログ内の eventTime が異なる点です。実際にS3のAPIが実行された時間はログ内の eventTime を確認するようにしてください。

署名バージョンは "SignatureVersion": "SigXX" の部分を確認します。

署名バージョン2のリクエストの場合は SigV2 となり、署名バージョン4のリクエストの場合は SigV4 となります。

「署名バージョン2」の場合のログ

    :
    :
  "eventTime": "2019-XX-XXT08:33:36Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "ListObjects",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "xxx.xxx.xxx.xxx",
    "userAgent": "[aws-cli/1.10.8 Python/2.7.10 Linux/4.4.5-15.26.amzn1.x86_64 botocore/1.3.30]",
    "requestParameters": {
        "bucketName": "sigv2-test-bucket",
        "Host": "s3-ap-northeast-1.amazonaws.com",
        "encoding-type": "url",
        "prefix": "",
        "delimiter": "/"
    },
    "responseElements": null,
    "additionalEventData": {
        "SignatureVersion": "SigV2",
    :
    :

「署名バージョン4」の場合のログ

    :
    :
  "eventTime": "2019-XX-XXT08:33:36Z",
    "eventSource": "s3.amazonaws.com",
    "eventName": "ListObjects",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "xxx.xxx.xxx.xxx",
    "userAgent": "[aws-cli/1.10.8 Python/2.7.10 Linux/4.4.5-15.26.amzn1.x86_64 botocore/1.3.30]",
    "requestParameters": {
        "bucketName": "sigv2-test-bucket",
        "Host": "s3-ap-northeast-1.amazonaws.com",
        "encoding-type": "url",
        "prefix": "",
        "delimiter": "/"
    },
    "responseElements": null,
    "additionalEventData": {
        "SignatureVersion": "SigV4",
    :
    :

まとめ

  • S3へのAPIリクエストにおける「署名バージョン2」が2019年6月24日に廃止される
  • これにより、S3へのAPIリクエストのデフォルトが「署名バージョン2」になっている古いAWS CLI や AWS SDKを利用した処理が動かなくなる
  • 対応方法には、CLIやSDKをバージョンアップする方法の他に、CLIやSDKでS3へのAPIリクエストに「署名バージョン4」を利用するように指定する方法がある

S3をAWS CLIやAWS SDKから利用されている方は、現在稼働中のバージョンをご確認いただき、上記ケースに該当する場合は、対象の環境にて入念に事前検証を実施いただくことをお勧めいたします。

また、下記関連記事もご参考にいただければ幸いです

参考記事:「S3の署名バージョン2 廃止に対応する方法を調べてみた(Embulk S3プラグイン編)
参考記事:「ETLツール「Talend」でS3署名バージョン2廃止に対応する方法