2

我正在尝试使用 S3 Cache ResolverLiipImagineBundle将我的缓存缩略图上传到 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:的配置似乎具有仅适用于 AWS SDK 2 的配置规则,并且使用缓存解析器LiipImagineBundle会导致“误报” 。aws_s3

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

配置 1:适用于 AWS 开发工具包 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 ))") 在 src/AppBundle/Resources/views/Store/show.html.twig 第 135 行。

这是由正在搜索凭证但未找到它们的 AWS 开发工具包引发的。

因此,这种方法似乎行不通。

配置 2:使用Aws\Credentials(AWS 开发工具包 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但我收到此错误 FROM Aws\ClientResolver

ClientResolver.php 第 296 行中的 InvalidArgumentException:为“凭据”提供的配置值无效。预期 Aws\Credentials\CredentialsInterface|array|bool|callable,但得到字符串“@shq.amazon.s3Credentials” (长度=25)

凭据:(Aws\Credentials\CredentialsInterface|array|bool|callable)

指定用于签署请求的凭据。提供 Aws\Credentials\CredentialsInterface 对象、“key”、“secret”和可选“token”键的关联数组,false以使用 null 凭证,或用于创建凭证或返回 null 的可调用凭证提供程序。有关内置凭证提供程序的列表,请参阅 Aws\Credentials\CredentialProvider。如果未提供凭据,SDK 将尝试从环境中加载它们。

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

因此,此配置也不起作用。

配置 3:将数组传递给S3Client(AWS SDK 3)

实例化 a 的第三种方法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

(另外,我不明白的奇怪的事情,而不是在路径中使用术语“key”,而是使用“key”的值,即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-我似乎更正确,不是吗?)。

4

1 回答 1

0

你试过这个吗?

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"

于 2016-05-02T18:29:51.917 回答