为 Flysystem 添加 SilverStripe 对 S3 适配器的支持

安装次数: 162,168

依赖项: 1

建议者: 0

安全: 0

星标: 20

关注者: 13

分支: 25

开放问题: 3

类型:silverstripe-vendormodule

4.0.1 2024-08-21 18:22 UTC

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以卸载模块。