AWSのS3について学習する中で覚えておいたほうがいいと感じたものを自分のために残しておきます。
1.結果参照性
S3では複数のサーバにデータを保持することで可用性を高めている。
(これをCRR:クロスリージョンレプリケーションという。)
そのため、1つのサーバにPUTが完了した後に他のサーバへレプリケーションが発生する。
このレプリケーションが完了するまではPUTした情報を読み込んだ時に不安定な動作をする。
(レプリが完了していないサーバを参照する可能性があるため)
処理ごとの動作は下記のようになります。
新しいオブジェクトを書き込んだ場合
オブジェクトが見つからない可能性がある既存のオブジェクトを更新した場合
更新前の古いオブジェクトを取得する可能性がある既存のオブジェクトを削除した場合
削除したハズのオブジェクトが取得できる可能性がある
2.バージョニング機能
デフォルトでは無効になっているが、バージョニング機能がある。
過去分も課金対象になるのでご利用は計画的に。
3.ファイルの存在チェックはするべきではない
プログラムからアクセスしてファイル取得する際にセオリー通りなら
ファイルの存在チェック⇒取得となるが、
存在チェックするためのリクエストは課金対象となる。
存在チェックせずにファイル取得し、もし存在しなければexceptionをスローするのがベストプラクティス。
4.署名付きURL
S3のオブジェクトやバケットは基本的にプライベートで他のユーザが参照したりファイルをアップロードすることはできない。
特定のユーザにファイル操作を許可したい場合はそのユーザにアクセス許可のロールを与える方法もあるが、署名付きURLを作成して提供することでも解決できる。
署名付きURLを作成するにはバケット名やオブジェクトキー、使用するHTTPメソッド(GET,PUT等)有効期間が必要。
5.CORS
CORSとはクライアント側のアプリケーション(javascript等)が他のドメインに存在するリソースにアクセスできること。
S3ではCORSが設定可能なのでjavascriptからS3のリソースにアクセスができる。
6.プレフィックスによるスループット向上
S3では複数のパーティションに分けてオブジェクトを管理している。
どのパーティションに保存されるかはオブジェクトキーの先頭の文字によって決定される。
よって同じもじから始まるオブジェクトキーばかり使っていると特定のパーティションにだけアクセスが集中してしまい、スループットが低下する。
なのでオブジェクトキーの先頭文字がランダムになるように設定するのがベストプラクティス。