web-dev-qa-db-ja.com

S3バケットをEC2インスタンスに直接マウントすることは安全ですか?

私の質問のタイトルが言うように、これが良い習慣かどうか知りたいのですが、

EC2インスタンスにマウントできることはわかっていますが、アプリケーションをスケーリングするためにインスタンスを追加するので、問題が発生するのではないかと考えていました。これに関する経験はありますか?

PHPスクリプトを使用したファイルのアップロードを許可するためにS3を使用しているので、基本的には次の質問です:

Moutingを使用するのは良い習慣ですか、それともユーザーファイルのアップロードを処理するより良い方法がありますか?

前もって感謝します

8

特に分散環境で、ユーザーアップロードからのデータを格納するためにS3を使用している場合、1つの大きな考慮事項は、S3が「結果的に整合性がある」という事実です(ただし、一部の領域は書き込み後に読み取り整合性があります)。この結果、ファイルを正常にアップロードできる可能性がありますが、その直後にその存在を確認すると、ファイルが存在しない場合があります。この問題は、更新や削除などのシナリオでより顕著になり、書き込み後の整合性でも役に立たない。

上記はS3へのアップロードにも適用されます。実際、これはS3に予想されるほとんどの問題に当てはまります。最も問題となる可能性が高いのはS3の制限であるため、データの保存に使用されるアプローチではありません。

PHP(または他の)SDKと同じように、S3fsはS3 APIを使用します。さらに、S3はかなり高いレベルの同時実行性を処理するように設計されているため、(一貫性の問題以外)複数のインスタンスにマウントする際に問題になる(これは従来のファイルシステムではないことに注意してください。ロックなどの問題はS3側で処理されます)。

そうは言っても、各実装にはいくつかの潜在的な長所と短所があります。

S3fs:

  • (私が知る限り)部分的/チャンクダウンロードのサポートはありません-したがって、ファイルの一部を読み取るにはファイル全体をダウンロードする必要があります-アップロードを保存(および提供)するためだけに使用している場合は、おそらく問題ではありません。
  • C++で記述された可能なパフォーマンスの向上
  • アプリケーションは、s3fsの更新からメリットを得ます
  • キャッシュを実装します(完全なファイルとファイル情報の両方)-速度を少し向上させ、コストを削減する可能性があります
  • Fuseが公開する機能に限定

SDK:

  • S3が提供する必要がある機能の完全なセットを公開します-ユースケースによっては、これはSDKの使用に値するのに十分かもしれません
  • 潜在的にアプリケーションとのより緊密な統合-返されたエラーなどにより、アプリケーションは情報に基づいた(したがってより正確な)選択を行うことができます
  • 考えられるあらゆる利点をコード化する必要があります-アプリケーションはそれらを活用し、S3への将来の変更で最新に保つ必要があります
  • コードの複雑さとオーバーヘッドが増える

「安全性」に関しては、「データ破損の防止」または「不正アクセスの防止」を意味します。前者に関しては、SDKは最終的な整合性(より詳細なエラーの形で)を処理するために少し役立つかもしれませんが、基礎となるストレージは同じであり、違いは小さいと予想します。アクセス制御に関して-IAMを使用して制限付きアカウントを作成できますが、そのアカウントには引き続きS3ファイルへの読み取り/書き込みアクセスが必要です。どちらも十分に安全である必要があります。どちらの場合でも、S3バケットにアクセスするにはシステムが危険にさらされる必要があります-ただし、S3fsを使用することをお勧めします(通常、資格情報はwebrootの外部に保存され、 PHP)セキュリティが少し向上しています。

個人的な意見:アップロードディレクトリが1つ(たとえば、1つのサイトがそれを利用している)で、アクセスがかなり単純な場合(ファイルをアップロードして、たまに更新/削除する必要がある)は、s3fsを使用します。より複雑なアクセス(部分的なダウンロード、複数のバケットなど)が必要な場合、または他の目的でS3 SDKを使用する場合は、アップロードにもSDKを使用します。

14
cyberx86

PHP lib経由でS3にアップロードすることをお勧めします。各サーバーにS3をマウントする方が簡単です。

この例を確認してください: http://aws.Amazon.com/code/126

私のプロジェクトの1つでは、このlib: http://undesigned.org.za/2007/10/22/Amazon-s3-php-class を使用しました。私にとっては本当にうまくいきました。

1
x7_

サーバーにアップロードせずに、ブラウザーからs3に直接アップロードすることをユーザーに許可できます(次にs3にアップロードします)。

これに適したヒントを以下に示します。 https://leonid.shevtsov.me/post/demystifying-s3-browser-upload/

ファイルがアップロードされた後、ファイル(Zip、トランスコードなど)を処理する必要がある場合は、S3fsを使用できます。

0