Glacier Selectを使ってみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

中山(順)です

みなさん、昨年のre:Invent 2017で発表されたGlacier Selectをおぼえていますか?

【速報】Glacierにクエリを投げることができるGlacier Selectが発表されました!! #reinvent

私は忘れてましたw
せっかく思い出したので、ちょっと使ってみようと思います。

Glacierとは

アーカイブおよび長期バックアップを目的としたストレージサービスです。

Amazon Glacier

この後、データの保存方法を含めてご紹介しますが、S3とは利用方法が大きく異なります。

Glacier Selectとは

re:Invent 2017で発表された新機能です。

S3 Select and Glacier Select – Retrieving Subsets of Objects

Glacier上のデータに対してクエリを実行し、結果をS3に出力してくれます。
サーバーなどは不要です。

やってみた

以下の手順で実施します。

  • Vaultの作成(ファイルの保存先の作成)
  • アーカイブするデータの取得
  • Archiveの作成(ファイルの保存)
  • 出力先S3バケットの作成
  • Selectの実行(ジョブのポスト)
  • 実行結果の確認

今回はAWS CLIでやってみます。
というより、一部の操作はマネージメントコンソールでは実施できません。
なので、一貫してCLIで実施します。

要件と制限事項

実施前に要件と制限事項を確認しましょう。

Amazon Glacier Select の要件と制限

要件

以下、公式ドキュメントからの引用です。

  • Archive objects that are queried by Amazon Glacier select must be formatted as uncompressed comma-separated values (CSV).
    • Amazon Glacier Select によってクエリを実行したアーカイブオブジェクトは、非圧縮のカンマ区切り値 (CSV) としてフォーマットされる必要があります。
  • You must have an S3 bucket to work with. In addition, the AWS account that you use to initiate an Amazon Glacier select job must have write permissions for the S3 bucket. The Amazon S3 bucket must be in the same AWS Region as the vault that contains the archive object that is being queried.
    • 使用可能な S3 バケットが必要です。さらに、Amazon Glacier Select ジョブを開始するのに使用する AWS アカウントには、S3 バケットに対する書き込みアクセス権限が必要です。Amazon S3 バケットは、クエリされているアーカイブオブジェクトを含むボールトと同じ AWS リージョンにある必要があります。
  • You must have permission to call Get Job Output (GET output).
    • ジョブの出力の取得 (GET output) を呼び出すアクセス権限が必要です。

制限事項

  • There are no limits on the number of records that Amazon Glacier select can process. An input or output record must not exceed 1 MB; otherwise, the query fails. There is a limit of 1,048,576 columns per record.
    • Amazon Glacier Select が処理するレコードの数に制限はありません。入力または出力レコードは 1 MB 以下でなければなりません。それ以外の場合、クエリは失敗します。レコードごとに 1,048,576 列という制限があります。
  • There is no limit on the size of your final result. However, your results are broken into multiple parts.
    • 最終結果のサイズに制限はありません。ただし、結果は複数のパートに分割されます。
  • An SQL expression is limited to 128 KB.
    • SQL 式のサイズの上限は 128 KB です。

Vaultの作成

Vaultとは、アーカイブを格納するコンテナです。
データをGlacierにアーカイブするには、まずVaultを作成する必要があります。S3と比較するとBucketに相当するものです。

それでは作成していきましょう。

まず、glacierコマンドを実行するにあたってAWS IDが必要なので事前に確認しておきます。

AWS_ID=$(aws sts get-caller-identity \
    --query Account \
    --output text) \
    && echo ${AWS_ID}
XXXXXXXXXXXX

Vaultを作成します。

VAULT_NAME="test-vault"

aws glacier create-vault \
    --account-id ${AWS_ID} \
    --vault-name ${VAULT_NAME}
{
    "location": "/XXXXXXXXXXXX/vaults/test-select"
}

アーカイブするデータの取得

要件でも述べたとおり、Glacier Selectを行うデータはカンマ区切りのCSVファイルである必要があります。
今回は、Amazon Machine Learning用に提供されているサンプルデータを使ってみようと思います。

チュートリアル: Amazon ML を使用してマーケティングオファーへの応答を予測する » ステップ 1: データを準備する

wget https://s3.amazonaws.com/aml-sample-data/banking.csv

SAMPLE_CSV_FILENAME="banking.csv"

どんなデータなのか確認しておきましょう。
名簿っぽいデータであることがわかります。

head -n 10 ${SAMPLE_CSV_FILENAME}
age,job,marital,education,default,housing,loan,contact,month,day_of_week,duration,campaign,pdays,previous,poutcome,emp_var_rate,cons_price_idx,cons_conf_idx,euribor3m,nr_employed,y
44,blue-collar,married,basic.4y,unknown,yes,no,cellular,aug,thu,210,1,999,0,nonexistent,1.4,93.444,-36.1,4.963,5228.1,0
53,technician,married,unknown,no,no,no,cellular,nov,fri,138,1,999,0,nonexistent,-0.1,93.2,-42,4.021,5195.8,0
28,management,single,university.degree,no,yes,no,cellular,jun,thu,339,3,6,2,success,-1.7,94.055,-39.8,0.729,4991.6,1
39,services,married,high.school,no,no,no,cellular,apr,fri,185,2,999,0,nonexistent,-1.8,93.075,-47.1,1.405,5099.1,0
55,retired,married,basic.4y,no,yes,no,cellular,aug,fri,137,1,3,1,success,-2.9,92.201,-31.4,0.869,5076.2,1
30,management,divorced,basic.4y,no,yes,no,cellular,jul,tue,68,8,999,0,nonexistent,1.4,93.918,-42.7,4.961,5228.1,0
37,blue-collar,married,basic.4y,no,yes,no,cellular,may,thu,204,1,999,0,nonexistent,-1.8,92.893,-46.2,1.327,5099.1,0
39,blue-collar,divorced,basic.9y,no,yes,no,cellular,may,fri,191,1,999,0,nonexistent,-1.8,92.893,-46.2,1.313,5099.1,0
36,admin.,married,university.degree,no,no,no,cellular,jun,mon,174,1,3,1,success,-2.9,92.963,-40.8,1.266,5076.2,1

Archiveの作成

アーカイブを作成(=ファイルを保存)します。

ARCHINE_DESCRIPTION="20180207 Developers.IO mokumoku-kai"

aws glacier upload-archive \
    --vault-name ${VAULT_NAME} \
    --account-id ${AWS_ID} \
    --archive-description "${ARCHINE_DESCRIPTION}" \
    --body ${SAMPLE_CSV_FILENAME}
{
    "archiveId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-yyyyyyy-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "checksum": "c03a2f49c7c7a5b85715be9d964087db1704fc9e4b12e2ff286696ef9b10645c",
    "location": "/XXXXXXXXXXXX/vaults/test-vault/archives/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-yyyyyyy-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

この時出力されるアーカイブIDですが、絶対に消さないように残してください。

ARCHIVE_ID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-yyyyyyy-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

アーカイブが作成できたことを確認します。

aws glacier describe-vault \
    --account-id ${AWS_ID} \
    --vault-name ${VAULT_NAME}
{
    "SizeInBytes": 0,
    "VaultARN": "arn:aws:glacier:ap-northeast-1:XXXXXXXXXXXX:vaults/test-vault",
    "NumberOfArchives": 0,
    "CreationDate": "2018-02-19T16:19:55.161Z",
    "VaultName": "test-vault"
}

・・・確認できませんでした。
しかし、これは仕様です。データの取り出しだけでなく、アーカイブの作成も時間がかかります。

(翌日)

 ヾヽヽ
 (,, ・∀・)チュンチュン
  ミ_ノ
  ″″

もう一度確認します。

aws glacier describe-vault \
    --account-id ${AWS_ID} \
    --vault-name ${VAULT_NAME}
{
    "SizeInBytes": 4915686,
    "VaultARN": "arn:aws:glacier:ap-northeast-1:XXXXXXXXXXXX:vaults/test-vault",
    "LastInventoryDate": "2018-02-19T20:11:00.218Z",
    "NumberOfArchives": 1,
    "CreationDate": "2018-02-19T16:19:55.161Z",
    "VaultName": "test-vault"
}

無事、アーカイブできていることを確認できました。
今回は実施しませんが、Vaultに通知設定を行うことでアーカイブ完了時に通知を行うことも可能です。

Amazon Glacier でのボールト通知の設定

出力先S3バケットの作成

Glacier Selectの実行結果を保存するS3バケットを作成します。

BUCKET_NAME="result-glacier-select-"${AWS_ID} && echo ${BUCKET_NAME}

aws s3api create-bucket \
    --bucket ${BUCKET_NAME} \
    --create-bucket-configuration LocationConstraint=ap-northeast-1
{
    "Location": "http://result-glacier-select-XXXXXXXXXXXX.s3.amazonaws.com/"
}

(一応)バケットのアクセス権を確認します。
自身のAWSアカウントに対してフルコントロール権限が付与されていることが確認できます。

aws s3api get-bucket-acl \
    --bucket ${BUCKET_NAME}
{
    "Owner": {
        "DisplayName": "members-xxxxx",
        "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "Grants": [
        {
            "Grantee": {
                "Type": "CanonicalUser",
                "DisplayName": "members-xxxxx",
                "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}

Selectの実行(ジョブのポスト)

本題のGlacier Selectを実行するためのジョブパラメーターを準備します。

以下の通り、ジョブパラメーターをJSONファイルとして作成します。
今回、すぐに結果を確認したいので、"Tier"を"Expedited"にしておきます。
取り出しオプションはこの他に"Standard"と"Bulk"の2種類があります。

Archive Retrieval Options

クエリについては、1列目のageが30のレコードを取り出すものになっています。
列は"_N"(Nは何列目かを表しています)で指定することができます。 クエリの書き方については、以下のドキュメントを参照してください。

Amazon Glacier Select SQL リファレンス

JOB_PARAM_FILENAME="job_param.json"

cat << EOF > ${JOB_PARAM_FILENAME}
{
    "Type": "select",
    "ArchiveId": "${ARCHIVE_ID}",
    "Tier": "Expedited",
    "SelectParameters": {
        "InputSerialization": {
            "csv": {}
        },
        "ExpressionType": "SQL",
        "Expression": "SELECT * FROM archive WHERE _1='30'",
        "OutputSerialization": {
            "csv": {}
        }
    },
    "OutputLocation": {
        "S3": {
            "BucketName": "${BUCKET_NAME}",
            "Prefix": "1"
        }
    }
}
EOF

ジョブパラメーターのフォーマットについては、generate-cli-skeletonで確認できます。

aws glacier initiate-job \
    --generate-cli-skeleton | jq .jobParameters
{
  "Format": "",
  "Type": "",
  "ArchiveId": "",
  "Description": "",
  "SNSTopic": "",
  "RetrievalByteRange": "",
  "Tier": "",
  "InventoryRetrievalParameters": {
    "StartDate": "",
    "EndDate": "",
    "Limit": "",
    "Marker": ""
  },
  "SelectParameters": {
    "InputSerialization": {
      "csv": {
        "FileHeaderInfo": "IGNORE",
        "Comments": "",
        "QuoteEscapeCharacter": "",
        "RecordDelimiter": "",
        "FieldDelimiter": "",
        "QuoteCharacter": ""
      }
    },
    "ExpressionType": "SQL",
    "Expression": "",
    "OutputSerialization": {
      "csv": {
        "QuoteFields": "ALWAYS",
        "QuoteEscapeCharacter": "",
        "RecordDelimiter": "",
        "FieldDelimiter": "",
        "QuoteCharacter": ""
      }
    }
  },
  "OutputLocation": {
    "S3": {
      "BucketName": "",
      "Prefix": "",
      "Encryption": {
        "EncryptionType": "aws:kms",
        "KMSKeyId": "",
        "KMSContext": ""
      },
      "CannedACL": "bucket-owner-full-control",
      "AccessControlList": [
        {
          "Grantee": {
            "Type": "Group",
            "DisplayName": "",
            "URI": "",
            "ID": "",
            "EmailAddress": ""
          },
          "Permission": "WRITE"
        }
      ],
      "Tagging": {
        "KeyName": ""
      },
      "UserMetadata": {
        "KeyName": ""
      },
      "StorageClass": "REDUCED_REDUNDANCY"
    }
  }
}

では、クエリを実行してみましょう。

aws glacier initiate-job \
    --account-id ${AWS_ID} \
    --vault-name ${VAULT_NAME} \
    --job-parameters file://${JOB_PARAM_FILENAME}
{
    "jobOutputPath": "1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/",
    "location": "/XXXXXXXXXXXX/vaults/test-vault/jobs/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "jobId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

ジョブが正常に発行されているか確認してみましょう。
"StatusCode"が"InProgress"になっていることが確認できます。

aws glacier list-jobs \
    --account-id ${AWS_ID} \
    --vault-name ${VAULT_NAME}
{
    "JobList": [
        {
            "VaultARN": "arn:aws:glacier:ap-northeast-1:XXXXXXXXXXXX:vaults/test-vault",
            "RetrievalByteRange": "0-4882917",
            "Tier": "Expedited",
            "SHA256TreeHash": "c03a2f49c7c7a5b85715be9d964087db1704fc9e4b12e2ff286696ef9b10645c",
            "Completed": false,
            "JobId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "ArchiveId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-yyyyyyy-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "ArchiveSizeInBytes": 4882918,
            "Action": "Select",
            "OutputLocation": {
                "S3": {
                    "BucketName": "result-glacier-select-XXXXXXXXXXXX"
                }
            },
            "ArchiveSHA256TreeHash": "c03a2f49c7c7a5b85715be9d964087db1704fc9e4b12e2ff286696ef9b10645c",
            "CreationDate": "2018-02-23T16:52:39.741Z",
            "JobOutputPath": "1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/",
            "StatusCode": "InProgress"
        }
    ]
}

ジョブの詳細を確認します。
ジョブパラメーターと同様の内容になっていることが確認できます。

また、このコマンドでもジョブのステータスを確認できます。
"Completed"がtrueになっていればOKです。

aws glacier describe-job \
    --account-id ${AWS_ID} \
    --vault-name ${VAULT_NAME} \
    --job-id "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
{
    "CompletionDate": "2018-02-23T16:53:53.911Z",
    "VaultARN": "arn:aws:glacier:ap-northeast-1:XXXXXXXXXXXX:vaults/test-vault",
    "RetrievalByteRange": "0-4882917",
    "SelectParameters": {
        "ExpressionType": "SQL",
        "InputSerialization": {
            "csv": {
                "RecordDelimiter": "\n",
                "FieldDelimiter": ",",
                "QuoteCharacter": "\"",
                "QuoteEscapeCharacter": "\"",
                "FileHeaderInfo": "NONE"
            }
        },
        "Expression": "SELECT * FROM archive WHERE _1='30'",
        "OutputSerialization": {
            "csv": {
                "QuoteFields": "ASNEEDED",
                "RecordDelimiter": "\n",
                "QuoteCharacter": "\"",
                "QuoteEscapeCharacter": "\"",
                "FieldDelimiter": ","
            }
        }
    },
    "SHA256TreeHash": "c03a2f49c7c7a5b85715be9d964087db1704fc9e4b12e2ff286696ef9b10645c",
    "Action": "Select",
    "ArchiveId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-yyyyyyy-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "JobOutputPath": "1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/",
    "StatusMessage": "Succeeded",
    "StatusCode": "Succeeded",
    "OutputLocation": {
        "S3": {
            "Prefix": "1",
            "BucketName": "result-glacier-select-XXXXXXXXXXXX"
        }
    },
    "Completed": true,
    "JobId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,
    "Tier": "Expedited",
    "ArchiveSHA256TreeHash": "c03a2f49c7c7a5b85715be9d964087db1704fc9e4b12e2ff286696ef9b10645c",
    "CreationDate": "2018-02-23T16:52:39.741Z",
    "ArchiveSizeInBytes": 4882918
}

通常、TierをExpeditedにしていれば、非常に大きなデータでない限り、1-5分でジョブが完了します。

For all but the largest archives (250 MB+), data accessed using Expedited retrievals are typically made available within 1–5 minutes.

Step 4: Download an Archive from a Vault in Amazon Glacier

結果の確認

バケット内のオブジェクトを確認します。

aws s3 ls s3://${BUCKET_NAME} --recursive
2018-02-24 01:52:40       1409 1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/job.txt
2018-02-24 01:53:54        160 1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/result_manifest.txt
2018-02-24 01:53:54     203193 1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/results/243f8bef9cc10c16f2e13a8b647fd37635f8f59516e61e746fde628c

ファイルをダウンロードします。

mkdir ${HOME}/test-glacier-select
cd ${HOME}/test-glacier-select
aws s3 sync s3://${BUCKET_NAME} ./
download: s3://result-glacier-select-XXXXXXXXXXXX/1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/job.txt to 1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/job.txt
download: s3://result-glacier-select-XXXXXXXXXXXX/1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/result_manifest.txt to 1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/result_manifest.txt
download: s3://result-glacier-select-XXXXXXXXXXXX/1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/results/243f8bef9cc10c16f2e13a8b647fd37635f8f59516e61e746fde628c to 1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/results/243f8bef9cc10c16f2e13a8b647fd37635f8f59516e61e746fde628c

ファイルの内容を確認します。 今回は、ジョブの内容である"job.txt"とクエリの実行結果である"(prefix)/(JobId)/results"配下のファイルを確認します。

まずはジョブの内容です。

cat 1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/job.txt
{
  "Action" : "Select",
  "ArchiveId" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-yyyyyyy-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "ArchiveSHA256TreeHash" : "c03a2f49c7c7a5b85715be9d964087db1704fc9e4b12e2ff286696ef9b10645c",
  "ArchiveSizeInBytes" : 4882918,
  "CreationDate" : "2018-02-23T16:52:39.741Z",
  "JobId" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "OutputLocation" : {
    "S3" : {
      "BucketName" : "result-glacier-select-XXXXXXXXXXXX",
      "Prefix" : "1"
    }
  },
  "RetrievalByteRange" : "0-4882917",
  "SelectParameters" : {
    "Expression" : "SELECT * FROM archive WHERE _1='30'",
    "ExpressionType" : "SQL",
    "InputSerialization" : {
      "Csv" : {
        "FieldDelimiter" : ",",
        "FileHeaderInfo" : "NONE",
        "QuoteCharacter" : "\"",
        "QuoteEscapeCharacter" : "\"",
        "RecordDelimiter" : "\n"
      }
    },
    "OutputSerialization" : {
      "Csv" : {
        "FieldDelimiter" : ",",
        "QuoteCharacter" : "\"",
        "QuoteEscapeCharacter" : "\"",
        "QuoteFields" : "ASNEEDED",
        "RecordDelimiter" : "\n"
      }
    }
  },
  "Sha256TreeHash" : "c03a2f49c7c7a5b85715be9d964087db1704fc9e4b12e2ff286696ef9b10645c",
  "Tier" : "Expedited",
  "VaultARN" : "arn:aws:glacier:ap-northeast-1:XXXXXXXXXXXX:vaults/test-vault"
}

そしてクエリの結果です。

head -n 10 1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/results/243f8bef9cc10c16f2e13a8b647fd37635f8f59516e61e746fde628c
30,management,divorced,basic.4y,no,yes,no,cellular,jul,tue,68,8,999,0,nonexistent,1.4,93.918,-42.7,4.961,5228.1,0
30,blue-collar,married,high.school,no,no,no,telephone,may,mon,122,4,999,0,nonexistent,1.1,93.994,-36.4,4.857,5191,0
30,management,married,university.degree,no,no,no,cellular,mar,mon,116,1,999,0,nonexistent,-1.8,92.843,-50,1.811,5099.1,1
30,technician,single,professional.course,no,yes,no,cellular,aug,fri,445,1,999,0,nonexistent,1.4,93.444,-36.1,4.966,5228.1,0
30,blue-collar,married,basic.6y,no,no,no,cellular,jul,mon,173,2,999,0,nonexistent,1.4,93.918,-42.7,4.96,5228.1,0
30,technician,single,university.degree,no,yes,no,cellular,aug,thu,31,17,999,0,nonexistent,1.4,93.444,-36.1,4.962,5228.1,0
30,blue-collar,single,high.school,unknown,yes,no,cellular,may,thu,340,1,999,0,nonexistent,-1.8,92.893,-46.2,1.327,5099.1,0
30,admin.,single,university.degree,no,yes,no,cellular,aug,fri,83,1,999,2,failure,-2.9,92.201,-31.4,0.881,5076.2,0
30,technician,unknown,university.degree,no,no,no,cellular,oct,fri,131,2,16,1,success,-1.1,94.601,-49.5,0.942,4963.6,0
30,admin.,married,university.degree,no,yes,no,cellular,aug,thu,136,1,999,0,nonexistent,1.4,93.444,-36.1,4.963,5228.1,0

期待する結果を得ることができました!

まとめ

データの形式など要件を満たしておく必要はありますが、気軽にアーカイブしたデータの内容を確認することができて便利ですね。

また、私は今回はじめてGlacierをさわったのですが、使い方がS3と違いすぎるということをこの身を以て体験することができました。(知識としては知ってましたが)
Glacierを「単価の安いS3」とだけ認識されているケースがありますが、「違うよ、全然違うよ」とこれからも伝えていきたいと思います。

現場からは以上です。