Amazon S3 ストレージクラス変更時にクライアントのアクセス方法に影響が出るストレージクラスを確認してみた

2022.12.15

いわさです。

Amazon S3 へアプリケーションからアクセスして利用するシーンは多いと思いますが、ストレージクラスを変更したときにアプリケーション側でどのような影響が発生するかご存知でしょうか。

Glacier あたりからそのままではアクセスが出来なくなる気がする...という予感はしますが、AWS CLI や SDK などの API 経由でのアクセスと静的ホスティングや署名付き URL などを使った HTTP クライアントでのアクセスで差はあるでしょうか。ストレージクラスを変更した際に古い署名付き URL はどうなるでしょうか。

どこからかアクセス出来なくなるところがありそうだというのは何となくわかるのですが、具体的に試したことがなかったので AWS CLI と cURL 経由で、本日時点で利用可能な全ての S3 ストレージクラスを対象にアクセス可否を確認してみました。

前提条件

ここでのアクセスはファイルの取得処理のみを想定しています。

ストレージクラスを変更することによって追加の取り出しコストが必要だったり、最低ファイルサイズのしきい値があったりと、逆にコスト面が増加する場合がありますが、今回はアプリケーションがアクセス出来なくなる以外のデメリットは無視します。
既に対象の S3 と統合されているアプリケーションに修正が必要なのか不要なのかの観点で確認を行います。

先にまとめ

  • 以下は変更なしでアクセスできる
    • スタンダード
    • Intelligent-Tiering ※変更直後のみ確認
    • 標準-IA
    • 1ゾーン-IA
    • Glacier Instant Retrieval
    • 低冗長化
  • 以下は取り出しがされていれば変更なしでアクセスできる
    • Glacier Flexible Retrieval (旧 Glacier)
    • Glacier Deep Archive
  • AWS SDK/CLI や静的ウェブサイトホスティング、署名付き URL でも上記のアクセス可否は同じ
  • ストレージクラス変更を変更しても発行済みの署名付き URL はそのまま変更後のクラスでも利用可能

検証

参考までに以下に確認した結果を載せておきます。
上記のまとめが知らたかったことの全てなので見なくても良いと思います。

スタンダード

問題なく取得出来ました。

% aws s3 cp s3://hoge1117private/tak1wa.png ./cli-private.png
download: s3://hoge1117private/tak1wa.png to ./cli-private.png    

% aws s3 cp s3://hoge1117public/tak1wa.png ./cli-public.png
download: s3://hoge1117public/tak1wa.png to ./cli-public.png      

% curl "http://hoge1117public.s3-website-ap-northeast-1.amazonaws.com/tak1wa.png" -o curl-public.png

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0  82991      0 --:--:-- --:--:-- --:--:-- 84037

% aws s3 presign s3://hoge1117private/tak1wa.png
https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png

% curl -o curl-private.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0   114k      0 --:--:-- --:--:-- --:--:--  119k

以下は取得したファイルです。

Intelligent-Tiering

ストレージクラスは S3 コンソール画面から変更します。

対象は Inteligent-Tiering です。

以下はアクセスが出来ました。
ただし、この時点ではストレージクラスを変更した直後です。Inteligent-Tiering は自動でストレージ層を変更するのでオプションのアーカイブ層の場合はこの挙動とはならないと思いますのであまりこの結果は参考にならないですね。ストレージ層が実際に変わったタイミングがポイントかなという感じです。

% aws s3 cp s3://hoge1117private/tak1wa.png ./cli-private.png

download: s3://hoge1117private/tak1wa.png to ./cli-private.png    
% aws s3 cp s3://hoge1117public/tak1wa.png ./cli-public.png
download: s3://hoge1117public/tak1wa.png to ./cli-public.png      
% curl "http://hoge1117public.s3-website-ap-northeast-1.amazonaws.com/tak1wa.png" -o curl-public.png
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0  82535      0 --:--:-- --:--:-- --:--:-- 84608
% aws s3 presign s3://hoge1117private/tak1wa.png
https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png
% curl -o curl-private.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0   111k      0 --:--:-- --:--:-- --:--:--  115k

ちなみに、ストレージクラスを変更しても変更前の署名付きURLは使えるということを知りました。

% curl -o curl-private-prev.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0   135k      0 --:--:-- --:--:-- --:--:--  139k

Inteligent-Tiering についてはどういう仕組みでどういう層に移動されるのか、その点を理解しこのあとの各ストレージクラスの挙動から判断するのが良いと思います。

標準-IA

標準-IA も問題なくアクセス出来ます。

% aws s3 cp s3://hoge1117private/tak1wa.png ./cli-private.png
download: s3://hoge1117private/tak1wa.png to ./cli-private.png    
% aws s3 cp s3://hoge1117public/tak1wa.png ./cli-public.png
download: s3://hoge1117public/tak1wa.png to ./cli-public.png      
% curl "http://hoge1117public.s3-website-ap-northeast-1.amazonaws.com/tak1wa.png" -o curl-public.png
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0  82590      0 --:--:-- --:--:-- --:--:-- 84037
% aws s3 presign s3://hoge1117private/tak1wa.png
https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png
% curl -o curl-private.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0  79486      0 --:--:-- --:--:-- --:--:-- 80501
% curl -o curl-private-prev.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0    97k      0 --:--:-- --:--:-- --:--:--  101k

1 ゾーン-IA

1 ゾーン-IA も問題なしです。

% aws s3 cp s3://hoge1117private/tak1wa.png ./cli-private.png
download: s3://hoge1117private/tak1wa.png to ./cli-private.png    
% aws s3 cp s3://hoge1117public/tak1wa.png ./cli-public.png
download: s3://hoge1117public/tak1wa.png to ./cli-public.png      
% curl "http://hoge1117public.s3-website-ap-northeast-1.amazonaws.com/tak1wa.png" -o curl-public.png
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0   125k      0 --:--:-- --:--:-- --:--:--  129k
% aws s3 presign s3://hoge1117private/tak1wa.png
https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png
% curl -o curl-private.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0   111k      0 --:--:-- --:--:-- --:--:--  113k
% curl -o curl-private-prev.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0   116k      0 --:--:-- --:--:-- --:--:--  120k

Glacier Instant Retrieval

Glacier ですね。
このあたりからどうでしょうか。

% aws s3 cp s3://hoge1117private/tak1wa.png ./cli-private.png
download: s3://hoge1117private/tak1wa.png to ./cli-private.png    
% aws s3 cp s3://hoge1117public/tak1wa.png ./cli-public.png
download: s3://hoge1117public/tak1wa.png to ./cli-public.png      
% curl "http://hoge1117public.s3-website-ap-northeast-1.amazonaws.com/tak1wa.png" -o curl-public.png
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0  97119      0 --:--:-- --:--:-- --:--:-- 98710
% aws s3 presign s3://hoge1117private/tak1wa.png
https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png
% curl -o curl-private.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0   117k      0 --:--:-- --:--:-- --:--:--  120k
% curl -o curl-private-prev.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0   132k      0 --:--:-- --:--:-- --:--:--  138k

おお、Instant Retrieval は変わらずにアクセスが出来ました。
旧 Glacier での取り出しの問題を解決したアーカイブストレージクラスというコンセプトなので予想通りではありますが、ほとんどアクセスされないけど万が一アクセスされてもエラーにはなってほしくないというような時には最適ですね。

こちらは AWS re:Invent 2021 で追加されたストレージクラスです。

Glacier Flexible Retrieval (旧 Glacier)

先程は Instant Retrieval でしたが、今度は Flexible Retrieval です。
こちらは Instant Retrieval 登場前に Glacier と呼ばれていたものですね。

% aws s3 cp s3://hoge1117private/tak1wa.png ./cli-private.png
warning: Skipping file s3://hoge1117private/tak1wa.png. Object is of storage class GLACIER. Unable to perform download operations on GLACIER objects. You must restore the object to be able to perform the operation. See aws s3 download help for additional parameter options to ignore or force these transfers.
                                                              
% aws s3 cp s3://hoge1117public/tak1wa.png ./cli-public.png
warning: Skipping file s3://hoge1117public/tak1wa.png. Object is of storage class GLACIER. Unable to perform download operations on GLACIER objects. You must restore the object to be able to perform the operation. See aws s3 download help for additional parameter options to ignore or force these transfers.
                                                              
% curl "http://hoge1117public.s3-website-ap-northeast-1.amazonaws.com/tak1wa.png" -o curl-public.png
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   537  100   537    0     0   2119      0 --:--:-- --:--:-- --:--:--  2174
% curl "http://hoge1117public.s3-website-ap-northeast-1.amazonaws.com/tak1wa.png"                   
<html>
<head><title>403 Forbidden</title></head>
<body>
<h1>403 Forbidden</h1>
<ul>
<li>Code: InvalidObjectState</li>
<li>Message: Operation invalid for object's storage class</li>
<li>RequestId: HAH2WJXRZSF5ZA5E</li>
<li>HostId: RODA4pOpoGt1A0oKXA8lp7OV9NhCz7wdkKxqwwvaxEDmVE51ErhOmGJcY9qf6/LRz4hPJApwYmg=</li>
</ul>
<h3>An Error Occurred While Attempting to Retrieve a Custom Error Document</h3>
<ul>
<li>Code: NoSuchKey</li>
<li>Message: The specified key does not exist.</li>
<li>Key: error.html</li>
</ul>
<hr/>
</body>
</html>

% aws s3 presign s3://hoge1117private/tak1wa.png
https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png
% curl -o curl-private.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   329    0   329    0     0   1695      0 --:--:-- --:--:-- --:--:--  1740

% curl "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidObjectState</Code><Message>The operation is not valid for the object's storage class</Message><StorageClass>GLACIER</StorageClass><RequestId>HH3NWBVJVEHNJVBA</RequestId><HostId>g+D/K8SlGqcXi7feTQVCNuOJOtEWlFHK6cDJbQaLM3RDq7zd3umejG7i2v6TARinR+9wHQglgkvQCfkGjizXAg==</HostId></Error>

% curl -o curl-private-prev.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   329    0   329    0     0   1785      0 --:--:-- --:--:-- --:--:--  1837
% curl "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidObjectState</Code><Message>The operation is not valid for the object's storage class</Message><StorageClass>GLACIER</StorageClass><RequestId>X1VZFBH1GBAKSYEC</RequestId><HostId>iiLXFZY/C3na5GQ0FMMQOnSZ3tdp8AVnmiS8xY3vDJO3NHOusXYI4iEn36AXCiXKtKDYwVm2g2k=</HostId></Error>

おお、こちらはアクセスが出来なくなりましたね。
そしてストレージクラスの編集も出来なくなりました。

Glacier はストレージクラス変更出来ないのですね。
取り出し操作が明示的に必要なアーカイブストレージは「復元を開始」操作を行うことで取り出しが出来る状態に非同期で移行します。必要な時間はストレージクラスや復元オプションによって変わります。

Glacier Flexible Retrieval の復元オプションこちらです。

  • 一括取得は時間がかかりますが追加料金は不要です。
  • 標準取り出しは少し時間を短縮出来ますが少し料金が発生します。
  • 迅速取り出しはなかなか早いですが追加料金もなかなかです。

目的にあわせて選択出来るのはかなり良いですね。
ここでは迅速取り出しをしてみましょう。

数分後、復元が完了しました。
通常時と同じようにアクセスしてみましょう。

% aws s3 cp s3://hoge1117private/tak1wa.png ./cli-private.png
download: s3://hoge1117private/tak1wa.png to ./cli-private.png    
% aws s3 cp s3://hoge1117public/tak1wa.png ./cli-public.png
download: s3://hoge1117public/tak1wa.png to ./cli-public.png      
% curl "http://hoge1117public.s3-website-ap-northeast-1.amazonaws.com/tak1wa.png" -o curl-public.png
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0  77331      0 --:--:-- --:--:-- --:--:-- 78470
% aws s3 presign s3://hoge1117private/tak1wa.png
https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png
% curl -o curl-private.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0  75733      0 --:--:-- --:--:-- --:--:-- 77734
% curl -o curl-private-prev.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0   126k      0 --:--:-- --:--:-- --:--:--  130k

すべてアクセス出来ました。
これまであまり意識してなかったのですが静的ホスティングや署名付き URL の場合も同じ条件なのですね。

Glacier Deep Archive

こちらは Glacier より更に塩漬けに適したストレージクラスです。
挙動としては Glacier Flexible Retrieval と同じでアクセスできなくなりました。

% aws s3 cp s3://hoge1117private/tak1wa.png ./cli-private.png
warning: Skipping file s3://hoge1117private/tak1wa.png. Object is of storage class GLACIER. Unable to perform download operations on GLACIER objects. You must restore the object to be able to perform the operation. See aws s3 download help for additional parameter options to ignore or force these transfers.
                                                              
% aws s3 cp s3://hoge1117public/tak1wa.png ./cli-public.png
warning: Skipping file s3://hoge1117public/tak1wa.png. Object is of storage class GLACIER. Unable to perform download operations on GLACIER objects. You must restore the object to be able to perform the operation. See aws s3 download help for additional parameter options to ignore or force these transfers.
                                                              
% curl "http://hoge1117public.s3-website-ap-northeast-1.amazonaws.com/tak1wa.png" -o curl-public.png
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   537  100   537    0     0   1998      0 --:--:-- --:--:-- --:--:--  2049
% curl "http://hoge1117public.s3-website-ap-northeast-1.amazonaws.com/tak1wa.png"                   
<html>
<head><title>403 Forbidden</title></head>
<body>
<h1>403 Forbidden</h1>
<ul>
<li>Code: InvalidObjectState</li>
<li>Message: Operation invalid for object's storage class</li>
<li>RequestId: FFE6H7N4409GAQX9</li>
<li>HostId: kDVaOJgH54pEIa7gYRndZq6vUaxjWZgKaOprCRXy+naZXqifM6ME8tueXfmbqRmlhLSuT+Q6LK4=</li>
</ul>
<h3>An Error Occurred While Attempting to Retrieve a Custom Error Document</h3>
<ul>
<li>Code: NoSuchKey</li>
<li>Message: The specified key does not exist.</li>
<li>Key: error.html</li>
</ul>
<hr/>
</body>
</html>
% aws s3 presign s3://hoge1117private/tak1wa.png
https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png
% curl "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidObjectState</Code><Message>The operation is not valid for the object's storage class</Message><StorageClass>DEEP_ARCHIVE</StorageClass><RequestId>BNHTNCDKD96QYKKQ</RequestId><HostId>D5beIpyuV92GAdcyq9EVLZubRHCOdrWQ8wyxKDcD0XBSM68mRj837Yt22+7fDi7FyIOlU2Ohsjs=</HostId></Error>%

Glacier Deep Archive の復元オプションはこのようになっています。

こちらも標準取り出し後は通常どおりアクセス出来ることが確認出来ました。

低冗長化

アーカイブの深さという意味だと前後しますが低冗長化ストレージクラスも試しました。
現在は非推奨のストレージクラスだからかストレージクラス選択時に一番端に追いやられていました。

% aws s3 cp s3://hoge1117private/tak1wa.png ./cli-private.png
download: s3://hoge1117private/tak1wa.png to ./cli-private.png    
% aws s3 cp s3://hoge1117public/tak1wa.png ./cli-public.png
download: s3://hoge1117public/tak1wa.png to ./cli-public.png      
% curl "http://hoge1117public.s3-website-ap-northeast-1.amazonaws.com/tak1wa.png" -o curl-public.png
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0  90572      0 --:--:-- --:--:-- --:--:-- 92472
% aws s3 presign s3://hoge1117private/tak1wa.png
https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png
% curl -o curl-private.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0   102k      0 --:--:-- --:--:-- --:--:--  105k
% curl -o curl-private-prev.png "https://hoge1117private.s3.ap-northeast-1.amazonaws.com/tak1wa.png"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24875  100 24875    0     0   142k      0 --:--:-- --:--:-- --:--:--  149k

こちらは問題なくアクセスが可能でした。

さいごに

本日は Amazon S3 オブジェクトのストレージクラスごとに API (AWS CLI) と HTTP (cURL) 経由でファイル取得をしてどのクラスがアクセスに気をつける必要があるのかを確認してみました。

冒頭で先にまとめましたが、アクセスに影響が出るのでストレージクラス変更に気をつける必要があるのは、Glacier Deep Archive と Glacier Flexible Retrieval でした。

アクセスクラスについては予想通りではありましたが実証出来て一安心という点と、静的ホスティングオプションの場合でも復元操作後は一時的に見えることや、ストレージクラス変更後も発行済み署名付き URL は変更後のストレージクラスで使えるという点などいくつか追加の情報を得ることも出来たので検証してよかったですね。