s3cmdコマンドでS3 Glacierのファイルを一括で復元する方法

## 初めに
S3 Glacierにファイルをアーカイブしている方は、大量のファイルを一括で復元しなければならないという機会を一度は経験したことがあるのではないでしょうか。
私は先日そのような機会がありました。当初はAWSコンソール画面からポチポチと復元していたのですが、流石にファイル数が多くなると効率的な方法を探さざるを得ず、s3cmdコマンドの存在にたどり着きました。
s3cmdコマンドの記事自体は沢山見つかるのですが、S3 Glacierからの復元方法についての記事はあまり見つからなかったため、本記事ではs3cmdコマンドを利用してS3 Glacierのファイルを一括で復元する方法を共有いたします。

## s3cmdとは
s3cmdとは、データをダウンロードしたり、アップロードしたり、ファイルの構成を確認したり、ディレクトリを同期したりといったAmazon S3に対する一連の操作をコマンドラインから実行可能とする無料のコマンドラインツールです。
s3cmdはGNU Public License v2 (GPLv2) に基づいたオープンソースのプロジェクトで開発されており、内部的にはPythonで実装されています。

(参考)
https://github.com/s3tools/s3cmd
https://s3tools.org/s3cmd

## 導入方法
ここでは、CentOS環境での導入事例を紹介します。
私の場合は、PCの環境を汚さないようにVirtualBoxとVagrantを利用してCent OSの仮想環境を作成して導入しました。
※環境の作成方法はここでは省略しますが、参考になる記事が沢山ありますのでお調べください。
https://codesapuri.com/articles/10
https://qiita.com/mekappi/items/df606a3b7ca0b52ecb5b

#### 1. 事前準備
コンソール画面に管理者権限(root権限)ユーザでログインし、パッケージを更新します。
```
yum -y update
```
#### 2. EPELをインストール
拡張用パッケージをインストールするためのパッケージであるEPEL(エンタープライズ Linux 用の拡張パッケージ)をインストールします。
```
yum -y install epel-release
```

#### 3. s3cmdのインストール
以下のコマンドでs3cmdをダウンロードします。
```
yum -y install s3cmd
```

以下のコマンドでバージョン確認が出来ればインストール出来ています。
```
s3cmd --version
```

## 使い方

#### 初期設定
s3cmdがインストールできたら、初期設定を行います。認証設定はアカウント毎に設定する必要があります。
ここで、特に二段階認証が必要ない場合は、```s3cmd --configure```でアクセスキーおよびシークレットアクセスキーを入力することでアカウントの認証設定ができるかと思います。(このあたりの内容は検索いただければ記事が沢山あると思います。)
しかし私の場合は二段階認証を設定しており、この方法では一時認証用のアクセストークンが設定できず使えるようにはなりませんでした。
少し調べたところ、以下のオプションでコマンド実行時に設定できる様子。
```
  --access_key=ACCESS_KEY
                        AWS Access Key
  --secret_key=SECRET_KEY
                        AWS Secret Key
  --access_token=ACCESS_TOKEN
                        AWS Access Token
```
(参考) https://s3tools.org/usage

しかし毎回コマンドが長くなるのは嫌なので、もう少し別の方法がないかchatGPTさんに少し聞いてみたところ、「以下のように環境変数に設定することで解決できる」とのこと。

半信半疑で設定。
```
export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<SessionToken>
```
```
#確認
echo $AWS_ACCESS_KEY_ID
echo $AWS_SECRET_ACCESS_KEY
echo $AWS_SESSION_TOKEN
```
※セッショントークンの取得は以下のようなコマンドで実行できます。
※詳細は以下の記事も見てみてください。
https://qiita.com/ryo_cresc/items/8b466c49fdd4d41d537c
```
aws sts get-session-token --serial-number (MFA DeviceのARN) --token-code (二段階認証番号 6桁) 
```

これで疎通確認が出来ました。(chatGPTさんありがとう。)
```
s3cmd ls <バケット名>
```

#### S3 Glacierのファイルを一括で復元する方法
認証設定ができれば、あとは簡単です。
復元には```s3cmd restore```コマンドを使います。

★コマンド例 
バケット配下のすべてのファイルを一括取出しで7日間復元するコマンドをお試し実行。
実際に実行したい場合は--dryrunを消して実行してください。
```
s3cmd restore --dry-run --recursive --restore-priority=bulk --restore-days=7 s3://バケット名/
```
```
# オプションの説明
--dry-run : 実際にはダウンロード等せずに動作確認を実施。
--recursive : プレフィックス配下を再帰的に全て復元。
--restore-priority=bulk : 復元方式を一括取出しに指定。
--restore-days=7 : 復元の期間を7日間に指定。
```

ここで、復元の方法は何も指定しない場合は<b>標準取出し</b>が指定されます。
--restore-priorityオプションの有効な値は bulk、standard、expeditedで、それぞれ一括取出し、標準取出し、迅速取出しに対応しています。
※一括取出し: 通常 5～12 時間以内 (最も安価)
※標準取出し: 通常 3〜5 時間以内 (取り出しオプションのデフォルト設定)
※迅速取出し: 通常 1〜5 分以内 (250 MB 以上 は対象外)

その他参考
https://s3tools.org/usage
https://qiita.com/scalewallet/items/16b429cb2cdc13f742bf

### 蛇足
Cloud9を利用してEFSにglacierファイルを一括で取得したい場合、--force-glacier-transferオプションを付けることでsyncできます。(cpコマンドは特にオプション不要なのですが、時間がかかるので。。)
```
aws s3 sync s3://対象バケット/ ./対象ディレクトリ/ --force-glacier-transfer
```

## まとめ
s3cmdコマンドを利用することで、大量のファイルを一括で復元することが出来ました。
本記事が誰かのお役に立てば幸いです。