如何使用S3 (AWS SDK v3)缓存LiipImagineBundle生成的图像


How to use S3 (AWS SDK v3) to cache images generated by LiipImagineBundle

我试图使用LiipImagineBundle的S3缓存解析器将我缓存的缩略图上传到S3,但我遇到了一些奇怪的问题。

我正在使用AWS SDK v ^3.2:

"aws/aws-sdk-php": "^3.2",

我正在使用Symfony2和在我的services.yml中,我已经配置了Aws'Credentials'Credentials类和Aws'S3'S3Client,使用它来创建客户端:

shq.amazon.s3Credentials:
    class: Aws'Credentials'Credentials
    arguments: ["%amazon.s3.key%", "%amazon.s3.secret%"]
shq.amazon.s3:
    class: Aws'S3'S3Client
    arguments:
        - version: %amazon.s3.version%
          region: %amazon.s3.region%
          credentials: "@shq.amazon.s3Credentials"

一切正常,我可以上传文件到S3。

现在,LiipImagineBundle的配置:似乎LiipImagineBundle的配置规则仅适用于AWS SDK 2,并且使用aws_s3缓存解析器会导致"误报"。

我已经尝试了至少三种不同的配置。

配置1:FOR AWS SDK 2

liip_imagine:
    resolvers:
        default:
            web_path: ~
        cache_s3:
           aws_s3:
               client_config:
                    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'
    cache: cache_s3
    filter_sets:
        thumb_purchase:
            filters:
                thumbnail: { size: [250, 250], mode: outbound }
                interlace:
                    mode: line

抛出一个异常:

在呈现模板期间抛出异常从实例配置文件元数据检索凭据时出错服务器。cURL错误28:1006毫秒后连接超时(见http://curl.haxx.se/libcurl/c/libcurl-errors.html)) insrc/AppBundle/资源/视图/商店/show.html。第135行。

这是由AWS SDK在搜索凭证时抛出的,但是没有找到它们。

所以,这种方法似乎不起作用。

配置2:使用Aws'Credentials (AWS SDK 3)

将凭据传递给S3Client的方式是传递Aws'Credentials的实例。我通过一个服务来做到这一点,这样我就可以在其他服务中重用相同的凭据(当我使用它将文件上传到S3时,这是有效的!):

shq.amazon.s3Credentials:
    class: Aws'Credentials'Credentials
    arguments: ["%amazon.s3.key%", "%amazon.s3.secret%"]

config.yml中的:

liip_imagine:
    resolvers:
       cache_thumb_purchase:
           aws_s3:
               client_config:
                    version: %amazon.s3.version%
                    region: %amazon.s3.region%
                    credentials: "@shq.amazon.s3Credentials"
               bucket: %amazon.s3.bucket%
               get_options:
                   Scheme: 'https'
               put_options:
                   CacheControl: 'max-age=86400'
    filter_sets:
        thumb_purchase:
            cache: cache_thumb_purchase
            filters:
                thumbnail: { size: [250, 250], mode: outbound } # Transforms 50x40 to 32x26, no cropping
                interlace:
                    # mode can be one of none,line,plane,partition
                    mode: line

如您所见,我将Credentials服务传递给LiipImagineBundle,但我从Aws'ClientResolver获得此错误:

ClientResolver.php第296行InvalidArgumentException:为"凭据"提供的配置值无效。预期的Aws'Credentials'CredentialsInterface|array|bool|可调用,但得到字符串'@shq.amazon。s3Credentials ' <我>(长度= 25)

凭证:凭证(Aws ' ' CredentialsInterface | |数组bool |可调用)

指定用于签署请求的凭据。提供一个Aws'Credentials'CredentialsInterface对象,"key"的关联数组,"secret"和可选的"token"密钥,false使用null凭据,或一个可调用的凭据提供程序,用于创建凭据或返回null。有关内置凭据的列表,请参阅Aws'Credentials'CredentialProvider提供者。如果没有提供凭据,SDK将尝试加载它们来自环境。

似乎没有传递@shq.amazon.s3Credentials引用的类Credentials,而是简单地传递字符串@shq.amazon.s3Credentials,因此ClientResolver正确地报告传递的参数是不正确的。

所以,这个配置也不能工作。

配置3:PASSING AN ARRAY TO S3Client (AWS SDK 3)

实例化S3Client的第三种方法是传递一个关联数组来硬编码凭证。

所以我尝试了这个配置:

liip_imagine:
    resolvers:
       cache_thumb_purchase:
           aws_s3:
               client_config:
                    version: %amazon.s3.version%
                    region: %amazon.s3.region%
                    #credentials: "@shq.amazon.s3Credentials"
                    credentials:
                        key: %amazon.s3.key%
                        secret: %amazon.s3.secret%
    ...

但是这次我收到LiipImagineBundle的错误,似乎不接受数组作为参数:

ScalarNode.php第36行InvalidTypeException:路径类型无效"liip_imagine.resolvers.cache_thumb_purchase.aws_s3.client_config.HERE_THERE_IS_DIRECTLY_MY_AWS_KEY"。

我认为包的配置规则必须更新,但我不知道如何做到这一点,因为我还没有对这样的事情很有信心。

那么,我如何使LiipImagineBundle/Symfony传递类而不是引用Credentials类的字符串?是我的错,还是LiipImagineBundle坏了?

(也,奇怪的事情,我不明白,而不是在路径中使用术语"键",它使用"键"的值是HERE_THERE_IS_DIRECTLY_MY_AWS_KEY。所以它报告一个路径像这样的liip_imagine.resolvers.cache_thumb_purchase.aws_s3.client_config.HERE_THERE_IS_DIRECTLY_MY_AWS_KEY而不是路径像liip_imagine.resolvers.cache_thumb_purchase.aws_s3.client_config.key -这对我来说似乎更正确,不是吗?

你试过吗?

liip_imagine:
    resolvers:
        cache_thumb_purchase:
            aws_s3:
                client_config:
                    credentials:
                        key:    %amazon.s3.key%
                        secret: %amazon.s3.secret%
                    version: %amazon.s3.version%
                    region: %amazon.s3.region%
                bucket: %amazon.s3.bucket%
                get_options:
                    Scheme: 'https'
                put_options:
                    CacheControl: 'max-age=86400'
    filter_sets:
        thumb_purchase:
            cache: cache_thumb_purchase
            filters:
                thumbnail: { size: [250, 250], mode: outbound } # Transforms 50x40 to 32x26, no cropping
                interlace:
                    # mode can be one of none,line,plane,partition
                    mode: line

services:
    admin.amazon.s3:
        class: Aws'S3'S3Client
        factory_class: Aws'S3'S3Client
        factory_method: 'factory'
        arguments:
            - key: %amazon.s3.key%
              secret: %amazon.s3.secret%
              region: %amazon.s3.region%
              version: %amazon.s3.version%

我现在开始做这个LiipImagineBundle + KnpGaufretteBundle + "aws/aws-sdk-php": "^3.18"

相关文章:
  • 没有找到相关文章