Как использовать S3 (AWS SDK v3) для кэширования изображений, созданных LiipImagineBundle

Я пытаюсь использовать S3 Cache Resolver LiipImagineBundle, чтобы загрузить мои кэшированные миниатюры на 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: ДЛЯ 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))") в src/AppBundle/Resources /views/Store/show.html.twig в строке 135.

Это вызывается SDK AWS, который ищет учетные данные и не находит их.

Таким образом, этот подход, кажется, не работает.

КОНФИГУРАЦИЯ 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:

InvalidArgumentException в строке 296 ClientResolver.php: для «учетных данных» указано недопустимое значение конфигурации. Ожидается Aws\Credentials\CredentialsInterface|array|bool|callable, но получена строка '@shq.amazon.s3Credentials' (length=25)

учетные данные: (Aws\Credentials\CredentialsInterface|массив|bool|вызываемый)

Указывает учетные данные, используемые для подписи запросов. Предоставьте объект Aws\Credentials\CredentialsInterface, ассоциативный массив «ключа», «секрета» и необязательный ключ «токен», false для использования нулевых учетных данных или вызываемый поставщик учетных данных, используемый для создания учетных данных или возврата нулевого значения. См. Aws\Credentials\CredentialProvider список встроенных поставщиков учетных данных. Если учетные данные не предоставлены, SDK попытается загрузить их из среды.

Похоже, что вместо класса Credentials, на который ссылается @shq.amazon.s3Credentials, передается просто строка @shq.amazon.s3Credentials, поэтому ClientResolver правильно сообщает, что переданный параметр неверен.

Так что эта конфигурация тоже не работает.

КОНФИГУРАЦИЯ 3: ПЕРЕДАЧА МАССИВА В 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, которое, похоже, не принимает массив в качестве параметра:

InvalidTypeException в строке 36 ScalarNode.php: неверный тип для пути «liip_imagine.resolvers.cache_thumb_purchase.aws_s3.client_config.HERE_THERE_IS_DIRECTLY_MY_AWS_KEY». Ожидается скаляр, но получен массив.

Я думаю, что правила конфигурации пакета должны быть обновлены, но я не знаю, как это сделать, потому что я еще не настолько уверен в таких вещах.

Итак, как я могу заставить LiipImagineBundle / Symfony передавать класс вместо строки, которая ссылается на Credentialsclass? Это моя вина или что-то сломалось в 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 - это мне кажется более правильным, не так ли?).


person Aerendir    schedule 03.08.2015    source источник
comment
проверьте этот подход: github.com/liip/LiipImagineBundle/issues/496   -  person Matteo    schedule 03.08.2015
comment
Я читал эту проблему, но, похоже, она для AWS SDK v2, а не для v3. Он возвращает мне следующее: во время рендеринга шаблона возникло исключение (ошибка при получении учетных данных с сервера метаданных профиля экземпляра. (ошибка cURL 28: время ожидания соединения истекло через 1006 миллисекунд (см. curl.haxx.se/libcurl/c/libcurl-errors.html))) в src/AppBundle /Resources/views/Myview/show.html.twig в строке 135.   -  person Aerendir    schedule 03.08.2015
comment
Я обновил вопрос, включая тест с этой конфигурацией.   -  person Aerendir    schedule 03.08.2015


Ответы (1)


Вы пробовали это?

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" прямо сейчас

person Cassiano    schedule 02.05.2016