Дамп Symfony2 активов в Amazon S3 - PullRequest
11 голосов
/ 17 ноября 2011

Я бы хотел вывести свои активы в мое хранилище s3 в производственном режиме после развертывания с помощью capifony в Symfony 2. Я нашел какое-то решение, но на самом деле не нашел лучшего в использовании.

Возможно выгрузить ресурсы с Zend_Service_Amazon_S3, но я думаю, что импортировать инфраструктуру Zend только для этого немного излишне.- http://permalink.gmane.org/gmane.comp.php.symfony.symfony2/54

Я также нашел это: https://github.com/symfony/symfony/pull/108,, где я могу сказать AsseticBundle имя корзины, но я не нашел, где предоставить ключ и секрет для моей учетной записи aws.

Можете ли вы указать лучшее решение или дать мне подробную информацию о вышеупомянутых.

Ответы [ 3 ]

6 голосов
/ 01 октября 2014

Итак, что я сделал, и это работает.

Добавьте на composer.json и установите его

"aws/aws-sdk-php": "2.6.16",

Создайте сервис:

<?php

namespace My\AcmeBundle\Amazon;

use Aws\Common\Aws;

class StreamWrapperS3 {

    protected $s3;

    public function __construct($key, $secret, $region) {

        $aws = array(
            'key'    => $key,
            'secret' => $secret,
            'region' => $region
        );

        $this->s3 = Aws::factory($aws)->get('s3');

    }

    public function registerStreamWrapper() {
        $this->s3->registerStreamWrapper();
    }

}

Объявите службу на config.yml или включите ее в файл

services:
    my_amazon_s3:
        class: My\AcmeBundle\Amazon\StreamWrapperS3
        arguments: [%aws_key%, %aws_secret_key%, %aws_region%]

Добавьте параметры на parameters.yml

Переопределите boot() метод на AppKernel.php:

public function boot() {
    parent::boot();
    $s3client = $this->container->get('my_amazon_s3');;
    $s3client->registerStreamWrapper();
}

В config_prod.yml добавьте:

framework:
    templating:
        assets_base_url: https://sa-east-1.amazonaws.com/your-bucket-name
assetic:
    write_to: 's3://your-bucket-name'

Наконец добавьте фильтр с вашими активами, чтобы правильно переписать ваши пути:

{% stylesheets filter='cssrewrite'
    'bundles/...' %}
    <link rel="stylesheet" href="{{ asset_url }}" /> {# asset just to be sure that url will be right #}
{% endstylesheets %}

Так что каждый раз, когда вы что-то менялинужно запустить:

php app/console cache:clear --env=prod
php app/console assets:install --env=prod
php app/console assetic:dump --env=prod

Очень важная деталь, которая заняла почти 2 дня моего времени, вам нужно обновить CORS Amazon S3, чтобы получить доступ к некоторым файлам, когда шрифты добавляются, например, в twitter bootstrap css.Мои разрешения CORS таковы:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
2 голосов
/ 29 мая 2013

На самом деле вам на самом деле не нужно и, вероятно, даже не нужно, вставьте свой ключ в код приложения.В Amazon S3 вы можете указать доступ по отправителю, в этом случае вы используете адрес рабочего сервера.

Взгляните на предоставленную почтовую ссылку: https://forums.aws.amazon.com/thread.jspa?messageID=236066

Это позволит вам свободнонаписать с этого сервера в ваше ведро.Не забудьте также запретить доступ с любого другого ip.

1 голос
/ 22 января 2012

Я также нашел это: https://github.com/symfony/symfony/pull/108, где я могу сказать AsseticBundle имя корзины, но я не нашел где предоставить ключ и секрет для моей учетной записи aws.

Это должно работать - просто используйте следующую форму при указании URL-адреса корзины S3:

# config_prod.yml
assetic:
    write_to: s3://{key}:{secret}@{bucket}/
...