S3 File System
Amazon S3ベースのリモートファイルシステムをDrupalに提供し、ファイルをS3またはS3互換ストレージサービスに保存・配信できるようにします。
s3fs
インストール
composer require 'drupal/s3fs:8.x-3.9'
composer require 'drupal/s3fs:8.x-3.7'
概要
S3 File System(s3fs)は、Drupalサイトにpublicおよびprivateファイルシステムと並ぶ追加のファイルシステムを提供します。このファイルシステムは、Amazon Simple Storage Service(S3)または任意のS3互換ストレージサービスにファイルを保存します。サイト全体でS3 File Systemをデフォルトとして使用することも、個別のフィールドでのみ使用することも可能です。
この機能は、複数のサーバー間でロードバランシングされているサイト向けに設計されています。Drupalのデフォルトファイルシステムが使用するメカニズムは、そのような構成では実用的ではないためです。このモジュールは、S3に保存されたすべてのファイルを追跡するメタデータキャッシュを使用し、ファイルシステム操作を大幅に高速化します。
S3fsは、S3クライアント作成、バケット設定、ストリームラッパー提供、CSS/JS最適化のための個別のサブモジュールを持つモジュラーアーキテクチャを採用しています。これにより、異なる設定と認証情報を持つ複数のS3バケットを柔軟に構成できます。
Features
- Amazon S3または任意のS3互換ストレージ(MinIO、DigitalOcean Spaces、Backblaze B2など)からファイルを保存・配信
- バケットごとに個別の認証情報と設定を持つ複数バケット構成のサポート
- public://やprivate://ファイルシステムを引き継いで、すべてのファイルをS3に保存
- 複数のS3バックエンドファイルスキーム用のカスタムストリームラッパー作成
- パフォーマンス向上のためのDrupalデータベースへのファイルメタデータキャッシュ
- プライベートファイルへの時間制限付きアクセスのための署名付きURLサポート
- カスタムドメインでのファイル配信のためのCNAME/CDNサポート
- サーバーサイド暗号化サポート(AES256およびAWS KMS)
- S3に保存されたアセットのためのCSS/JSリンク書き換え
- S3ストレージを使用した画像スタイル派生物の生成
- 安全な認証情報管理のためのKeyモジュールとの統合
- Doctrine Cacheを使用したAWS認証情報キャッシュサポート
- キャッシュ更新とバケット管理のためのDrushコマンド
- Drupal 7 S3FSインストールからの移行サポート
- バージョン管理されたバケットとバージョン固有のファイルアクセスのサポート
Use Cases
ロードバランス型マルチサーバーデプロイメント
ロードバランサー背後で複数のWebサーバー上で実行されるDrupalサイトの場合、s3fsはすべてのファイルを中央のS3バケットに保存することでファイル同期の問題を解決します。すべてのサーバーが共有NFSマウントやrsyncソリューションなしで同じファイルにアクセスできます。
CDN統合
CloudFrontディストリビューションまたは他のCDNを指すCNAMEでs3fsを設定します。ファイルは世界中のエッジロケーションから配信され、レイテンシとサーバー負荷が軽減されます。最適なCDNキャッシングのためにカスタムドメイン設定とCache-Controlヘッダーを使用します。
署名付きURLによるプライベートファイルアクセス
機密ファイルをプライベートACLでS3に保存し、署名付きURLを使用して時間制限付きアクセスを許可します。特定のファイルパスに対して自動的に一時的なアクセスリンクを生成するよう署名付きURLパターンを設定します。
S3互換ストレージサービス
MinIO、DigitalOcean Spaces、Backblaze B2、WasabiなどのS3互換ストレージサービスでs3fsを使用します。プロバイダーの要件に応じてカスタムエンドポイントとパススタイルURLを設定します。
複数バケット設定
異なる認証情報と設定を持つ複数のS3バケットを設定します。たとえば、CDNアクセス付きの公開メディアファイル用に1つのバケットを使用し、暗号化された機密ドキュメント用に別のプライベートバケットを使用します。
暗号化ストレージコンプライアンス
コンプライアンス要件のためにサーバーサイド暗号化(AES256またはAWS KMS)を有効にします。暗号化フックを使用して、特定のファイルパスに対してカスタマー管理の暗号化キー(SSE-C)を実装します。
Tips
- public://の引き継ぎを使用する場合は、php_storage/twigディレクトリを常にローカルに保存してください。S3内のTwigファイルはセキュリティとパフォーマンスのリスクをもたらします。
- セキュリティ向上のため、settings.phpに認証情報を保存するのではなく、Keyモジュールを使用して認証情報を管理してください。
- public://またはprivate://ストリームラッパーの引き継ぎを有効化または無効化した後は、Drupalのキャッシュをクリアしてください。
- カスタムエンドポイント(MinIOなど)の場合、プロバイダーが仮想ホストスタイルURLをサポートしていなければ、「パススタイルエンドポイントを使用」を有効にしてください。
- 静的アセットには適切なCache-Controlヘッダー(例:'public, max-age=31536000')を設定し、CDNとブラウザのキャッシュを最大化してください。
- 一時的に公開アクセスが必要なプライベートファイルには、バケット全体を公開するのではなく署名付きURLを使用してください。
- ローカルストレージから移行する場合は、'drush s3fs:copy-local'を使用してメタデータキャッシュを維持しながらファイルをコピーしてください。
- 本番環境にデプロイする前に、バケットアクションページの検証ボタンを使用して設定をテストしてください。
Technical Details
Admin Pages 7
/admin/config/s3
S3バケット、StreamWrapper、CSS/JS設定へのリンクを含むメインS3設定セクション。
/admin/config/s3/s3-bucket
設定済みS3バケット接続のリスト。認証情報、エンドポイント、ストレージ設定を含むバケット設定を管理します。
/admin/config/s3/s3-bucket/add
認証情報と接続設定を含む新しいS3バケット設定を作成します。
/admin/config/s3/s3-bucket/{s3fs_bucket}/actions
メタデータキャッシュの更新などS3バケットの管理アクションを実行します。
/admin/config/s3/streamwrapper
設定済みS3ストリームラッパーのリスト。各ストリームラッパーはS3内のファイルにアクセスするためのカスタムURIスキームを定義します。
/admin/config/s3/streamwrapper/add
URIスキームをS3バケットにマッピングする新しいストリームラッパー設定を作成します。
/admin/config/s3/cssjs
S3に保存されたCSSおよびJavaScriptファイル内のURLの書き換え方法を設定します。
権限 3
Hooks 6
hook_s3fs_url_settings_alter
外部URLを作成する際に使用されるフォーマットとオプションを変更します。署名付きURL設定、タイムアウト、カスタムGET引数の変更が可能です。
hook_s3fs_stream_open_params_alter
ストリームが開かれる際のS3ファイルパラメータを変更します。サーバーサイド暗号化パラメータの追加に便利です。
hook_s3fs_upload_params_alter
オブジェクトをアップロードする際のS3ファイルパラメータを変更します。ACL、暗号化、その他のアップロードパラメータの変更が可能です。
hook_s3fs_copy_params_alter
ファイルをコピーまたは名前変更する際のS3パラメータを変更します。暗号化されたソースファイルと宛先ファイルの処理に便利です。
hook_s3fs_command_params_alter
getCommandParams()によって返されるS3パラメータを変更します。メタデータ取得(HeadObject)などの呼び出しに影響します。
hook_s3fs_bucket_command_params_alter
バケットプラグインレベルでS3パラメータを変更します。hook_s3fs_command_params_alterと同様ですが、bucket_idを含む追加コンテキストがあります。
Drush Commands 2
drush s3fs:list-buckets
設定済みのすべてのS3バケットエンティティをステータスとともに一覧表示します。
drush s3fs:refresh-cache
特定のバケットのS3 File Systemメタデータキャッシュを更新します。
Troubleshooting 7
Drush(drush s3fs:refresh-cache --bucket=BUCKET_NAME)またはメタデータキャッシュ更新を/admin/config/s3/s3-bucket/BUCKET_NAME/actionsの管理UIから実行してください。S3fsはファイルを認識するためにメタデータキャッシュを必要とします。
これは、バケット内に'/path/to/object'と'/path/to/object/another_object'の両方にオブジェクトが存在する場合に発生します。ルートオブジェクトを削除/名前変更するか、同じパスプレフィックスを持つすべてのオブジェクトを削除/名前変更してください。
バケットでBlockPublicAclsを使用している場合は、「すべてのファイルをS3でプライベートとしてアップロード」オプションを有効にしてください。また、IAM権限に必要なすべてのアクションが含まれていること、およびバケットCORSポリシーがGETリクエストを許可していることを確認してください。
Nginxサーバーの場合、サーバー設定にlocation ~ ^/s3/styles/ { try_files $uri @rewrite; }のlocationブロックを追加してください。
public://の引き継ぎを使用する場合は、s3fs_cssjsモジュールが有効になっていることを確認してください。サイトのドメインからのGETリクエストを許可するようにS3バケットでCORSを設定してください。
doctrine/cacheをインストール(composer require 'doctrine/cache:~1.4')し、「キャッシュ認証情報ディレクトリ」設定を構成して認証情報キャッシュを有効にしてください。
S3fsはMySQLインデックスの制限によりファイルURIに255文字の制限があります。ファイル名を短くするか、ディレクトリのネスト深度を減らしてください。
Security Notes 6
- S3認証情報はWebルート外に保存する必要があります。可能な限りsettings.phpではなく、Keyモジュール、環境変数、またはIAMロールを使用してください。
- 認証情報キャッシュが有効な場合、認証情報はファイルシステム上に平文で保存されます。キャッシュディレクトリがdocrootの外にあり、適切に保護されていることを確認してください。
- SSL/TLS検証の無効化はセキュリティリスクであり、開発環境での自己署名証明書用にのみ使用してください。
- 公開ACLで保存されたファイルは、URLを知っている誰でもアクセスできます。機密コンテンツには'upload_as_private'を使用し、制御されたアクセスには署名付きURLを使用してください。
- 「ファイルメタデータキャッシュを無視」オプションは、すべてのリクエストがS3に直接アクセスするため、バケットが過剰なAPI呼び出しや潜在的なDDoSにさらされる可能性があります。
- public://の引き継ぎを使用する場合、バケットのCORSポリシーがワイルドカードオリジンではなく、あなたのドメインからのリクエストのみを許可していることを確認してください。