🐭

S3の各ストレージクラスのオブジェクトをAWS CLIで取得する方法を解説してみた

2024/10/28に公開

こんな方向けの記事です。

・Amazon S3 Glacierではなく
 S3の各ストレージクラスにあるオブジェクトの取得方法が知りたい
・AWS CLIでダウンロードしたい。

具体的にはAmazon S3の全ストレージクラスのAWS CLIでの取得方法が知りたい
・スタンダード
・Intelligent-Tiering
・標準 - IA
・1 ゾーン -IA
・Glacier Instant Retrieval
・Glacier Flexible Retrieval (旧 Glacier)
・Glacier Deep Archive
・低冗長化

前提

Amazon S3に取得したいオブジェクトがあることを前提としています。

 
 
また、S3のURIを頻繁に使うのでオブジェクトのURIを確認しておきましょう。

S3URIは基本的に"S3Bucket名+オブジェクトのパス"ですね

s3://archive-download-test-moko/Glacier_test.txt

 
 
S3のフォルダ内にオブジェクトがある場合は下記のようになります。

s3://archive-download-test-moko/dir-archive-moko/Standard_test.txt

この場合は"dir-archive-moko"がフォルダ名です。簡単ですね。
 
 
ここまで抑えることが出来たらダウンロードしていきましょう。

スタンダード

aws s3 cp <オブジェクトのS3 URI> <ローカルの保存先のパス>
コマンド例:aws s3 cp s3://archive-download-test-moko/dir-archive-moko/Standard_test.txt /tmp

 
 
syncコマンドでも取得できますがこちらの場合はコマンドで入力するURIを
フォルダ、またはバケット単位にする必要があります。

aws s3 sync <オブジェクトがあるS3のフォルダorバケットのURI> <ローカルの保存先のパス>
コマンド例:aws s3 sync s3://archive-download-test-moko/dir-archive-moko /tmp

どちらも同じ結果になりますが、どうやらsyncの方が早い(早くすることが出来る)そうです。

 
 
syncコマンドで特定のオブジェクトのみを取得したい場合は
"--exclude"と"--include"のオプションを追加すれば可能です。

aws s3 sync --exclude "*" --include "<取得したいオブジェクト名>" \
<オブジェクトがあるS3のフォルダorバケットのURI> <ローカルの保存先のパス>
コマンド例:aws s3 sync --exclude "*" --include "Standard_test.txt" \
s3://archive-download-test-moko/dir-archive-moko ./tmp

Intelligent-Tiering

スタンダードと全く同じように取得できます。

・S3 Intelligent-Tiering Archive
・S3 Intelligent-Tiering Deep Archive
上記に階層が移ったオブジェクトについては下記のGlacier Flexible Retrievalにて解説している
コマンドで取得しましょう。(取り出しオプションはGlacier Deep Archiveを参照)
オブジェクトがアーカイブされているかどうかという点においては
スタンダードのコマンドで取得が出来なくなりますので、そこでも気付けますが
Glacier Flexible Retrievalでも書いているこちらのコマンドで確認できます。

aws s3api head-object --bucket <バケット名> --key <オブジェクトのキー> 

返ってくる内容に"Restore"のキーが存在している場合はアーカイブされています。

標準 - IA

スタンダードと全く同じように取得できます。

1 ゾーン -IA

スタンダードと全く同じように取得できます。

Glacier Instant Retrieval

スタンダードと全く同じように取得できます。
Glacierという名前が付いてますがスタンダードと同じように取得(ダウンロード)ができます。

Glacier Flexible Retrieval (旧 Glacier)

ここまでスタンダードと同じように取得できましたがここからは違います。

aws s3api restore-object \
    --bucket <バケット名> \
    --key <オブジェクトのキー> \
    --restore-request Days=<アクセス可能期間>,GlacierJobParameters={Tier=<取り出しオプション>}

<アクセス可能期間>
こちらは何日間取得可能にするかを整数で設定します。

<取り出しオプション>
・Expedited
迅速取り出しでリストアにかかる時間:1~5分

・Standard
標準取り出しでリストアにかかる時間:3~5時間

・Bulk
大量取り出しでリストアにかかる時間:5~12時間

コマンド例:
aws s3api restore-object \
    --bucket archive-download-test-moko \
    --key dir-archive-moko/Glacier_Flexible_Retrieval.txt \
    --restore-request Days=1,GlacierJobParameters={Tier=Expedited}

 
 

実行したらリストア状況を下記コマンドで確認しましょう。

aws s3api head-object --bucket <バケット名> --key <オブジェクトのキー> 
コマンド例:aws s3api head-object --bucket archive-download-test-moko --key dir-archive-moko/Glacier_Flexible_Retrieval.txt

 
 

下記のようなものが返ってくると思います。
Restoreの値が"false"であれば取得できる状態です。
"true"の場合はリスト中なので取得オプションに合わせて気長に待ちましょう。

{
    "AcceptRanges": "bytes",
    "Restore": "ongoing-request=\"false\", expiry-date=\"Sat, 26 Oct 2024 00:00:00 GMT\"",
    "LastModified": "2024-10-24T01:43:22+00:00",
    "ContentLength": 0,
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ContentType": "text/plain",
    "ServerSideEncryption": "AES256",
    "Metadata": {},
    "StorageClass": "GLACIER"
}

 
 
最後にCPコマンドで取得しましょう。

aws s3 cp <オブジェクトのS3 URI> <ローカルの保存先のパス>
aws s3 cp s3://archive-download-test-moko/dir-archive-moko/Glacier_Flexible_Retrieval.txt /tmp

Glacier Deep Archive

Glacier Flexible Retrievalと同じように取得できますが
取り出しオプションの違いに注意しましょう。
下記は"Glacier Deep Archive"のオプションです。
<取り出しオプション>
・Standard
標準取り出しでリストアにかかる時間:12時間以内

・Bulk
大量取り出しでリストアにかかる時間:48時間以内

低冗長化

スタンダードと全く同じように取得できます。

あとがき

S3のストレージクラスがたくさんあるので、ストレージクラス毎に
取得の方法が違ったらどうしようと思いましたが
大きく分けて"スタンダード"か"アーカイブ"かの2種類だけで済みましたね。
AWSって面白いですねー。
今回も自己満足でした。

この記事は下記AWSドキュメントを参考にしています。

https://docs.aws.amazon.com/cli/latest/reference/s3/

https://docs.aws.amazon.com/cli/latest/reference/s3api/

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/restoring-objects.html

Discussion