AWS S3 解析器
The AwsS3Resolver
解析器启用使用 Aws\S3\S3Client
通过 Amazon S3 进行缓存解析。
配置
首先,您必须将您的 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
键,而是将 key
和 secret
键放在与 region
和 bucket
相同的级别。
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
键,而是将 key
和 secret
键放在与 region
和 bucket
相同的级别。
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
提示
如果您想为其他图像使用其他存储桶,只需更改参数名称并创建其他服务。
附加选项
您可以在链中将 Cache 和 Proxy 解析器与当前解析器一起使用。您只需要使用定义的选项来配置它们。
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 的示例。