跳到内容

AWS S3 解析器

编辑此页

The AwsS3Resolver 解析器启用使用 Aws\S3\S3Client 通过 Amazon S3 进行缓存解析。

依赖

此缓存解析器需要 aws-sdk-php 库,可以通过在您的项目目录中执行以下命令来安装它

1
$ composer require aws/aws-sdk-php

配置

首先,您必须将您的 AWS 密钥、密钥、存储桶和区域分配给它们各自的参数。

1
2
3
4
5
6
7
8
# app/config/config.yml or app/config/parameters.yml

parameters:
    amazon.s3.key:     "your-aws-key"
    amazon.s3.secret:  "your-aws-secret"
    amazon.s3.bucket:  "your-bucket.example.com"
    amazon.s3.region:  "your-bucket-region"
    amazon.s3.version: "2006-03-01"

注意

为了不混淆缓存解析器,请使用 bucket.domain.tld 表示法。在路径 (domain.tld/bucket) 中指定存储桶不起作用。

前提条件

从工厂创建解析器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# app/config/config.yml

liip_imagine:
    resolvers:
        aws_s3_resolver:
            aws_s3:
                client_config:
                    credentials:
                        key:    "%amazon.s3.key%"
                        secret: "%amazon.s3.secret%"
                    region: "%amazon.s3.region%"
                    version: "%amazon.s3.version%"
                bucket: "%amazon.s3.bucket%"
                get_options:
                    Scheme: https
                put_options:
                    CacheControl: "max-age=86400"

提示

如果使用 aws-sdk-php < 3.0.0,您必须省略 credentials 键,而是将 keysecret 键放在与 regionbucket 相同的级别。

1
2
3
4
5
6
7
8
9
# app/config/services.yml

services:
    aws_s3:
        client_config:
            key:    "%amazon.s3.key%"
            secret: "%amazon.s3.secret%"
            region: "%amazon.s3.region%"
            bucket: "%amazon.s3.bucket%"

创建作为服务的解析器

虽然使用上面的配置通过工厂创建解析器可以满足大多数用例的需求,但在某些情况下,将解析器创建为服务是必要的。

提示

例如,如果您不想为您的解析器硬编码 AWS 凭证,而是希望它使用 AWS 内的 默认凭证提供程序链(例如,因为您正在 EC2 实例上运行,该实例已附加到具有所需权限的 IAM 角色),则需要这样做。在这种情况下,仅通过工厂配置块设置解析器并省略凭证块是不够的。相反,您需要如下所示将解析器设置为服务,并传递 S3Client

您必须设置所需的服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# app/config/services.yml

services:
    acme.amazon_s3:
        class: Aws\S3\S3Client
        factory: [Aws\S3\S3Client, factory]
        arguments:
            -
                credentials: { key: "%amazon.s3.key%", secret: "%amazon.s3.secret%" }
                region: "%amazon.s3.region%"
                version: "%amazon.s3.version%"

    acme.imagine.cache.resolver.aws_s3_resolver:
        class: Liip\ImagineBundle\Imagine\Cache\Resolver\AwsS3Resolver
        arguments:
            - "@acme.amazon_s3"
            - "%amazon.s3.bucket%"
        tags:
            - { name: "liip_imagine.cache.resolver", resolver: "aws_s3_resolver" }

提示

如果使用 aws-sdk-php < 3.0.0,您必须省略 credentials 键,而是将 keysecret 键放在与 regionbucket 相同的级别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# app/config/services.yml

services:
    acme.amazon_s3:
        # ...
        arguments:
            -
                key: "%amazon.s3.key%"
                secret: "%amazon.s3.secret%"
                region: "%amazon.s3.region%"

acme.amazon_s3:
    class: Aws\S3\S3Client
    factory: [Aws\S3\S3Client, factory]
    arguments:
        -
            credentials: { key: "%amazon.s3.key%", secret: "%amazon.s3.secret%" }
            region: "%amazon.s3.region%"
            version: "%amazon.s3.version%"

用法

配置 AwsS3Resolver 后,您可以使用以下配置将其设置为 LiipImagineBundle 的默认缓存解析器

1
2
3
4
# app/config/config.yml

liip_imagine:
    cache: aws_s3_resolver

在特定过滤器上的用法

或者,您可以使用以下配置将 AmazonS3Resolver 设置为特定过滤器集的缓存解析器。

1
2
3
4
5
6
7
8
9
# app/config/config.yml

liip_imagine:
    filter_sets:
        cache: ~
        my_thumb:
            cache: aws_s3_resolver
            filters:
                # the filter list

提示

如果您想为其他图像使用其他存储桶,只需更改参数名称并创建其他服务。

附加选项

您可以在链中将 CacheProxy 解析器与当前解析器一起使用。您只需要使用定义的选项来配置它们。

1
2
3
4
5
6
7
8
9
# app/config/config.yml

liip_imagine:
    resolvers:
       aws_s3_resolver:
          aws_s3:
              #...
              proxies: ["https://one.domain.com", "https://two.domain.com"]
              cache: true

如果启用,第一个将是 Cache,然后是 Proxy,之后所有进程都委托给 AwsS3 解析器。

对象 GET 选项

为了使用对象 GET 选项,您可以简单地向服务添加一个调用,以更改您需要的那些选项。

1
2
3
4
5
6
7
8
9
10
11
12
13
# app/config/services.yml

services:
    acme.imagine.cache.resolver.aws_s3_resolver:
        class: Liip\ImagineBundle\Imagine\Cache\Resolver\AwsS3Resolver
        arguments:
            - "@acme.amazon_s3"
            - "%amazon_s3.bucket%"
        calls:
             # This calls $service->setGetOption('Scheme', 'https');
             - [ setGetOption, [ Scheme, https ] ]
        tags:
            - { name: "liip_imagine.cache.resolver", resolver: "aws_s3_resolver" }

您还可以使用解析器的构造函数直接注入多个选项。

1
2
3
4
5
6
7
8
9
10
11
12
# app/config/services.yml

services:
    acme.imagine.cache.resolver.aws_s3_resolver:
        class: Liip\ImagineBundle\Imagine\Cache\Resolver\AwsS3Resolver
        arguments:
            - "@acme.amazon_s3"
            - "%amazon_s3.bucket%"
            - "public-read" # Aws\S3\Enum\CannedAcl::PUBLIC_READ (default)
            - { Scheme: https }
        tags:
            - { name: "liip_imagine.cache.resolver", resolver: "aws_s3_resolver" }

对象 PUT 选项

与对象 GET 选项类似,您可以配置在存储对象时传递给 S3 的附加选项。例如,这对于配置从 S3 提供对象时返回的 Cache-control 标头很有用。有关可用选项的列表,请参阅 S3 SDK 文档

注意,以下选项是自动配置的,即使您通过 ObjectOptions 配置它,也会被忽略

  • 存储桶
  • 主体
  • 内容类型

为了使用对象 PUT 选项,您可以简单地向服务添加一个调用,以更改您需要的那些选项。

1
2
3
4
5
6
7
8
9
10
11
12
13
# app/config/services.yml

services:
    acme.imagine.cache.resolver.aws_s3_resolver:
        class: Liip\ImagineBundle\Imagine\Cache\Resolver\AwsS3Resolver
        arguments:
            - "@acme.amazon_s3"
            - "%amazon_s3.bucket%"
        calls:
             # This calls $service->setPutOption('CacheControl', 'max-age=86400');
             - [ setPutOption, [ CacheControl, "max-age=86400" ] ]
        tags:
            - { name: "liip_imagine.cache.resolver", resolver: "aws_s3_resolver" }

您还可以使用解析器的构造函数直接注入多个选项。

1
2
3
4
5
6
7
8
9
10
11
12
13
# app/config/services.yml

services:
    acme.imagine.cache.resolver.aws_s3_resolver:
        class: Liip\ImagineBundle\Imagine\Cache\Resolver\AwsS3Resolver
        arguments:
            - "@acme.amazon_s3"
            - "%amazon_s3.bucket%"
            - "public-read" # Aws\S3\Enum\CannedAcl::PUBLIC_READ (default)
            - { Scheme: https }
            - { CacheControl: "max-age=86400" }
        tags:
            - { name: "liip_imagine.cache.resolver", resolver: "aws_s3_resolver" }

您可以在 事件章节 中找到带有私有 ACL 和签名 URL 的示例。

本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本