特に分散環境でユーザーアップロードからのデータを保存するためにS3を使用している場合、1つの大きな考慮事項は、S3が「結果的に整合性がある」という事実です(ただし、一部の領域は書き込み後の読み取り整合性があります)。この結果、ファイルを正常にアップロードできる可能性がありますが、その直後にその存在を確認すると、ファイルが存在しない場合があります。この問題は、更新や削除などのシナリオでより顕著であり、書き込み後の整合性でも役に立たない。
上記は、どのアプローチをとっても、S3へのアップロードに適用されます。実際、これはS3に予想されるほとんどの問題に当てはまります。最も問題となる可能性が高いのはS3の制限であるため、データの保存に使用されるアプローチではありません。
S3fsは、PHP(またはその他の)SDKと同様に、S3 APIを使用します。さらに、S3はかなり高いレベルの同時実行性を処理するように設計されているため、(一貫性の問題以外に)複数のインスタンスにマウントする際に問題は発生しません(従来のファイルシステムではないことに注意してください-ロックなどの問題)などはS3側で処理されます)。
とはいえ、各実装にはいくつかの潜在的な長所と短所があります。
S3fs:
- (私が知る限り)部分的/チャンクダウンロードのサポートはありません-したがって、ファイルの一部を読み取るにはファイル全体をダウンロードする必要があります-アップロードを保存(および提供)するためだけに使用している場合は、おそらく問題ではありません。
- C ++で記述された、可能なパフォーマンスの向上
- アプリケーションは、s3fsの更新からメリットを得ます
- キャッシュを実装します(完全なファイルとファイル情報の両方)-速度を少し向上させ、コストを削減する可能性があります
- ヒューズが公開する機能に限定
SDK:
- S3が提供する必要がある機能の完全なセットを公開します-ユースケースによっては、これはSDKの使用に値するのに十分かもしれません
- 潜在的にアプリケーションとのより緊密な統合-返されたエラーなどにより、アプリケーションは情報に基づいた(したがってより正確な)選択を行うことができます
- 考えられるあらゆる利点をコード化する必要があります-アプリケーションはそれらを活用し、S3への将来の変更で最新に保つ必要があります
- コードの複雑さとオーバーヘッドが増える
「安全性」に関しては、「データ破損の防止」または「不正アクセスの防止」を意味する場合があります。前者に関しては、SDKは最終的な整合性(より詳細なエラーの形で)を処理するのに少し役立つかもしれませんが、基礎となるストレージは同じであり、違いは小さいと予想します。アクセス制御に関して-IAMを使用して制限付きアカウントを作成できますが、そのアカウントには引き続きS3ファイルへの読み取り/書き込みアクセスが必要です。どちらも十分に安全である必要があります。どちらの場合でも、S3バケットにアクセスするにはシステムを危険にさらす必要があります。ただし、S3fsを使用することをお勧めします(通常、資格情報はwebrootの外部に保存され、 PHP)セキュリティが少し向上しています。
個人的な意見:アップロードディレクトリが1つ(例、それを使用する1つのサイト)で、アクセスがかなり単純な場合(ファイルをアップロードして、たまに更新/削除する必要がある)は、s3fsを使用します。より複雑なアクセス(部分的なダウンロード、複数のバケットなど)が必要な場合、または他の目的でS3 SDKを使用する場合は、アップロードにもSDKを使用します。