Я пытаюсь использовать 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 передавать класс вместо строки, которая ссылается на Credentials
class? Это моя вина или что-то сломалось в 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
- это мне кажется более правильным, не так ли?).