为 Flysystem 添加 SilverStripe 对 S3 适配器的支持
Requires
README
SilverStripe 模块,用于将资产存储在 S3 而不是本地文件系统中。
composer require silverstripe/s3
警告
此模块目前尚未实现任何类型的受保护资产存储桶策略。您需要自己使用 AWS 存储桶策略来实现。
注意
此模块将 SilverStripe 内置的本地资产存储替换为基于 S3 的存储。之前已上传到现有资产存储中的任何文件将不可用(尽管它们不会丢失 - 可以通过运行 composer remove silverstripe/s3
来删除模块并恢复访问)。
环境设置
此模块需要设置一些环境变量。
AWS_REGION
:您的 S3 存储桶所在的 AWS 区域(例如eu-central-1
)AWS_BUCKET_NAME
:存储资产的 S3 存储桶名称。
如果不在 EC2 实例上运行,则需要指定 API 密钥和密钥。
AWS_ACCESS_KEY_ID
:您要访问的存储桶的 AWS 访问密钥AWS_SECRET_ACCESS_KEY
:与访问密钥对应的 AWS 密钥
在 EC2 之外运行时的示例 YML 配置
--- Only: envvarset: AWS_BUCKET_NAME After: - "#assetsflysystem" --- SilverStripe\Core\Injector\Injector: Aws\S3\S3Client: constructor: configuration: region: "`AWS_REGION`" version: latest credentials: key: "`AWS_ACCESS_KEY_ID`" secret: "`AWS_SECRET_ACCESS_KEY`"
(可选)CDN 实现
如果您从 S3 服务器资源,建议您使用 CloudFront。这比直接从 S3 公开性能和安全。
一旦您设置了 CloudFront 分发,请确保资产可在 cdn 的 assets
目录中访问(例如;https://cdn.example.com/assets/Uploads/file.jpg),并设置以下环境变量
AWS_PUBLIC_CDN_PREFIX
:您要访问的存储桶的 CloudFront 分发域名
例如,将其添加到您的 .env
AWS_PUBLIC_CDN_PREFIX='https://cdn.example.com/'
将更改您的 URL,例如
https://s3.ap-southeast-2.amazonaws.com/mycdn/public/example/live/assets/Uploads/file.jpg
到类似于
https://cdn.example.com/assets/Uploads/file.jpg
您可以通过声明 PublicCDNAdapter 构造函数来覆盖默认的 /assets/
路径,并将 cdnAssetsDir
参数设置为您的文件夹名称字符串。在您的 app/_config/assets.yml
文件中添加以下内容
--- Name: app#silverstripes3-cdn Only: envvarset: AWS_PUBLIC_CDN_PREFIX After: - "#assetsflysystem" - "#silverstripes3-flysystem" --- SilverStripe\Core\Injector\Injector: SilverStripe\S3\Adapter\PublicAdapter: class: SilverStripe\S3\Adapter\PublicCDNAdapter constructor: s3Client: '%$Aws\S3\S3Client' bucket: "`AWS_BUCKET_NAME`" prefix: "`AWS_PUBLIC_BUCKET_PREFIX`" visibility: null mimeTypeDetector: null cdnPrefix: "`AWS_PUBLIC_CDN_PREFIX`" options: [] cdnAssetsDir: "cms-assets" # example of a custom assets folder name
配置
SilverStripe 将资产分为“公共”或“受保护”。公共资产可以自由下载,而受保护资产(例如尚未发布的资产)不应直接访问。
默认情况下,该模块通过通过 Web 服务器将受保护文件的 内容流式传输到浏览器(而不是直接链接到 S3),以支持此功能。为确保受保护资产无法访问,请确保设置了适当的存储桶策略(下面提供了一个未经测试的示例)。
S3 配置
应使用标准的 AWS IAM 策略保护“受保护”的 S3 资产存储,以拒绝匿名用户的所有访问,但允许公共和受保护文件的动作 s3:GetObject
。受保护文件将从 AWS 流式传输,因此用户无需直接访问。因此,以下存储桶策略可能很有用。
确保将下面的 <bucket-name>
替换为适当的值。
注意:下面的策略尚未经过广泛测试 - 欢迎反馈。
{ "Policy": { "Version": "2012-10-17", "Statement": [ { "Sid": "AddPerm", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<bucket-name>/public/*" } ] } }
如果您正在使用CloudFront分发来管理公开资产,您可以选择通过CloudFront分发来允许对public
文件进行访问,同时通过签名URL来允许对protected
文件进行访问,从而保护您的S3桶免受所有公开访问。
对于开发者
如果您想进行本地开发,请阅读为开发Silverstripe S3模块设置本地沙盒。
性能
此模块包含一个基本的内存缓存,用于调用S3。强烈建议添加额外的缓存层以获得最佳结果。
有关更多信息,请参阅https://docs.silverstripe.org/en/5/developer_guides/performance/caching/。
Name: silverstripes3-flysystem-memcached After: - "#silverstripes3-flysystem" --- SilverStripe\Core\Injector\Injector: MemcachedClient: class: "Memcached" calls: - [addServer, ["localhost", 11211]] MemcachedCacheFactory: class: 'SilverStripe\Core\Cache\MemcachedCacheFactory' constructor: client: "%$MemcachedClient" SilverStripe\Core\Cache\CacheFactory: "%$MemcachedCacheFactory"
卸载
运行composer remove silverstripe/s3
以卸载模块。