Upgrade to Pro — share decks privately, control downloads, hide ads and more …

僕とグレーシア〜グレーシア、どうして貴方はオブジェクトをまとめて復元できないの?〜

Kento Suzuki
February 26, 2023

 僕とグレーシア〜グレーシア、どうして貴方はオブジェクトをまとめて復元できないの?〜

2023/2/15(土) JAWS-UG佐賀 3年ぶり!re:Bootするよ!
https://jawsug-saga.doorkeeper.jp/events/149574
登壇資料

Kento Suzuki

February 26, 2023
Tweet

More Decks by Kento Suzuki

Other Decks in Technology

Transcript

  1. 僕とグレーシア
    〜グレーシア、どうして貴方はオブジェクトをまとめて復元できないの?〜
    JAWS-UG佐賀 3年ぶり︕re:Bootするよ︕( 2023/2/25 )

    View Slide

  2. 名前︓鈴⽊健⽃
    所属︓アイレット株式会社(東京オフィス)
    お仕事︓ AWSのインフラ構築・運⽤
    経歴︓
    ・新卒 3 年⽬(エンジニア歴 = 社会⼈歴)
    ・2022 APN ALL AWS Certifications Engineer
    ・2022 APN AWS Top Engineer
    ・昨年はJAWS-UG で14 回発表
    ・ AWS Community Builder(Cloud Operations)︖
    @k_suzuki_pnx
    自己紹介

    View Slide

  3. はじまり
    やりたかったこと

    View Slide

  4. 安定のエラー
    一部のオブジェクトがライフサイクルルールでGlacierに送られていたため、
    以下のようなエラーが発生
    Object is of storage class GLACIER. Unable to perform copy operations on GLACIER
    objects. You must restore the object to be able to perform the operation. See aws s3 copy
    help for additional parameter options to ignore or force these transfers.
    ×

    View Slide

  5. Glacierの仕様
    ◦ Glacierはオブジェクトを取り出す際に一度復元する必要がある
    ◦ 以下のようなまとめて復元ができない
    「バケット内のオブジェクトを一括復元」
    「特定のパス配下にあるオブジェクトを全て復元」
    ◦ まとめて復元するにはAWS CLIなどを使って
    オブジェクトを1つずつループで復元するスクリプトを作る必要がある

    View Slide

  6. シェルスクリプトを作ることにした
    ◦ ターミナルから以下のコマンドを実行
    sh restore_glacier_objects.sh <バケット名> <プレフィックス>
    #!/bin/bash
    bucket=$1
    prefix=$2
    aws s3api list-objects --bucket $bucket --prefix "$prefix" --query "Contents[?StorageClass=='GLACIER'].[Key]" --output text | while
    read object; do
    echo "Restoring object $object from $bucket"
    aws s3api restore-object --bucket $bucket --key "$object" --restore-request '{"Days":10,"GlacierJobParameters":{"Tier":"Bulk"}}'
    done

    View Slide

  7. 実行例
    バケット名を「s3-test」、プレフィックス(パス)を「s3://s3-test/page1/」とすると
    sh restore_glacier_objects.sh s3-test page1/
    で実行できる
    #!/bin/bash
    bucket=$1
    prefix=$2
    aws s3api list-objects --bucket $bucket --prefix "$prefix" --query "Contents[?StorageClass=='GLACIER'].[Key]" --output text | while
    read object; do
    echo "Restoring object $object from $bucket"
    aws s3api restore-object --bucket $bucket --key "$object" --restore-request '{"Days":10,"GlacierJobParameters":{"Tier":"Bulk"}}'
    done

    View Slide

  8. シェルスクリプトの仕様
    ◦ AWS CLIの「s3api list-objects」を使用してストレージクラスが
    Glacierのオブジェクトを抽出
    ◦ 抽出したオブジェクトなくなるまで、1つずつ復元を繰り返す
    ◦ 復元されている期間は3日
    ◦ 大容量取り出し(Bulk)を使用することで取り出しにかかる費用を抑える
    #!/bin/bash
    bucket=$1
    prefix=$2
    aws s3api list-objects --bucket $bucket --prefix "$prefix" --query "Contents[?StorageClass=='GLACIER'].[Key]" --output text | while
    read object; do
    echo "Restoring object $object from $bucket"
    aws s3api restore-object --bucket $bucket --key "$object" --restore-request '{"Days":10,"GlacierJobParameters":{"Tier":"Bulk"}}'
    done

    View Slide

  9. 注意点
    AWS CloudShellでの大量オブジェクトの復元は非推奨
    ◦ 20~30分、キーボードとポインタを使った操作がない場合、セッションは強制終了
    ◦ キーボードとポインタを使っていても、12時間経つとセッションが強制終了
    ◦ コンピューティングのリソースが1 vCPU、2 GiBのため処理が遅い
    AWS CLIをインストールしたローカルPCから
    実行した方が断然速い

    View Slide

  10. おわりに

    View Slide

  11. S3、シンプルじゃない

    View Slide