どーも!
たかぽんです!
先日、S3のDeepArchiveに対してファイルをPUTしたいなぁ...ということがあり、調べてみたのでそれについて買いていきます!
一応Laravelとしていますが、大部分はAWSのお話しです...w(ジャンルわけ難しい...)
何がしたかった?
まず、S3にはGlacierDeepArchiveという、ストレージクラスがあります。
通常のS3は頻繁にアクセスされることを想定されていて、保存のコストが高め、そしてこのGlacierDeepArchiveのストレージクラスは年に1 ~ 2回程度のアクセスで十分なリソースに関して格安で保存することが可能ですが、取得する際に時間がかかる...といったデメリットもある機能になっています。
つまり、ほとんど見ないけど、もしもの場合に見るかも!という、雑多なログデータとか、一旦はサービスでの使用を終えた莫大な画像や動画のマスターデータを、将来別の用途に活用するために安価に維持するため...といった具合に使われるものがこのGlacierDeepArchiveになっています。
筆者も対して詳しいわけではないのですが、S3のライフサイクルでGlacierへと段階を変えていく...という方法がメジャーな方法なきがします...!
ただ、今回はS3にPutObjectでPutするタイミングでいきなりGlacierDeepArchiveへPUTできないのかなぁ?と思い、試してみました。
ではみていきます!
GlacierにPutをする
さて、といってもコードを見せた方が早いので...
早速コードを。
$s3Client = app()->make('aws')->createClient('s3');
$result = $s3Client->putObject([
'Bucket' => 'bucketName',
'Key' => 'objectKey',
'SourceFile' => 'sourceFilePath',
'StorageClass' => 'DEEP_ARCHIVE',
]);
一応laravelとしての記事にしていますが、クライアントを作るところ以外は普通のPHPで考えてもらって大丈夫なはずです。
(laravelのphp-sdkを使っているので知らない方からすると、クライアント作成部分が少し見慣れないかもしれないですが...)
バケット、キー、ソースファイルの指定に加え、"StorageClass"を追加することで、どういった形で保存するのかを指定することが可能です。
そこでDEEP_ARCHIVEを指定してあげることで、Glacier Deep Archiveに保存することができます。
このリクエストで指定できる項目は以下が参考になるかと思います。
筆者も完全に理解したわけではありませんが、ヘッダーに"Request Syntax"のいづれかの項目を指定することでより細かい設定をPutObjectで指定できます。
今回のStorageClassもそうですが、php sdkを使用している場合...
上記のリファレンスでは"x-amz-storage-class"になっていますが、"x-amz-"をのぞいてキャメルケースに変えた形"StorageClass"で指定できたので、おそらく他の項目も同じく指定できると思います。(全て試したわけではないので、もし使いたいものがあれば試してみてください...!)
そして、上記の項目で設定する内容ですが、それについてはすぐしたにまとめられています。
例えば今回使用した"StorageClass"の場合...
- x-amz-storage-class
By default, Amazon S3 uses the STANDARD Storage Class to store newly created objects. The STANDARD storage class provides high durability and high availability. Depending on performance needs, you can specify a different Storage Class. Amazon S3 on Outposts only uses the OUTPOSTS Storage Class. For more information, see Storage Classes in the Amazon S3 User Guide.
Valid Values: STANDARD | REDUCED_REDUNDANCY | STANDARD_IA | ONEZONE_IA | INTELLIGENT_TIERING | GLACIER | DEEP_ARCHIVE | OUTPOSTS
このように解説されています。
指定しない場合はSTANDARDとして新規のオブジェクトが保存されるようですね。
そして、最後に"ValidValues"があり、これが実際に指定した値になります。
筆者が指定していたDEEP_ARCHIVEもありますね。
これが、S3で用意されているStorageClassになっている様です。(詳細は別途S3のユーザーガイドを見てみてくださいね!)
以上さえ覚えていれば一通りやりたいことはできる気がします...!
おまけ
最後におまけです。
上記の通常のS3のSTANDARDと異なるStorageにPUTした場合、イベント通知は走るのだろうか・・・?と気になったんです。
S3ではイベント通知といって、PUTされた際、lambdaを発火する...SQSへエンキューする...等、S3に対する操作に対してイベントを発行することが可能です。
これはS3の設定画面で行うのですが、普通にS3にPUTした場合にイベント発火されるのは理解できますが、DeepArchiveのStorageClassにPUTした場合もイベントが発火されるのか?が曖昧でした。
GlacierというのはもともとS3とは別のサービスで(今も単一のGlacierが残ってるっぽいですが、多分Amazon的には以降推奨な雰囲気みたい?)、S3と機能統合されて始めて今の形でS3のStorageClassとして同じように長期保存に向いた運用ができる様になりました。
そのため、これ別れているんではないだろうか・・・?というのが筆者の予測だったわけです。
もちろん調べてみたりしたんですが、明確にわかる記事もなく...
(まぁ、そもそもAPiで直接 PUTする機会がほとんどなく、ライフサイクルで順次以降といった形が自然なので...)
結局試してみた感じです。
実際どうなったかというと、S3へさきほどのようにGlacierDeepArchiveのStorageClassとしてPUTしてもイベントは発行されました。
まぁ、最も直感的な感じになっていました!
そのため、もしStorageClassを分けつつPUTでやりたいことを変える場合はprefix等で差分をつけて配置場所によって対応...といった形になりそうですね。
まとめ
今回はS3へオブジェクトをPutする際に直接GlacierDeepArchiveへPUTしてみました!
そもそもS3を使う時、STANDARDしか使用しておらず、最初にGlacierやすいし使ってくぞ!ってなっと時に、旧Glacierの説明と混ざっててわかりづらかったです...w
見分け方としてはAWS Glacierか、AWS S3 Glacierかである程度は見分けがつくかなと。
昔の方法だとVaultというものを作ってあげる必要があったそうですが、現在はS3で完結できるようです。
ちょっとした噂ではありますが、Glacierはテープに書き出しているらしい...!というのを聞きました。
ほんとかどうかわかんないですが...!
それでわ!