将Symfony2资产转储到Amazon S3

bir*_*her 11 assets amazon-s3 symfony

我想我倾倒资产在生产我的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帐户的密钥和密码.

你能指出一个更好的解决方案,或者给我一些关于上述解决方案的详细信息.

Cas*_*ano 6

所以我做了什么,它正在发挥作用.

添加composer.json并安装它

"aws/aws-sdk-php": "2.6.16",
Run Code Online (Sandbox Code Playgroud)

创建服务:

<?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();
    }

}
Run Code Online (Sandbox Code Playgroud)

将服务声明为config.yml或包含为文件

services:
    my_amazon_s3:
        class: My\AcmeBundle\Amazon\StreamWrapperS3
        arguments: [%aws_key%, %aws_secret_key%, %aws_region%]
Run Code Online (Sandbox Code Playgroud)

添加参数 parameters.yml

覆盖boot()方法AppKernel.php:

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

config_prod.yml加:

framework:
    templating:
        assets_base_url: https://sa-east-1.amazonaws.com/your-bucket-name
assetic:
    write_to: 's3://your-bucket-name'
Run Code Online (Sandbox Code Playgroud)

最后使用您的资产添加过滤器以正确重写您的路径:

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

所以每次你改变了什么都需要运行:

php app/console cache:clear --env=prod
php app/console assets:install --env=prod
php app/console assetic:dump --env=prod
Run Code Online (Sandbox Code Playgroud)

一个非常重要的细节花了将近2天的时间,你需要更新Amazon S3的CORS以访问一些文件,例如在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>
Run Code Online (Sandbox Code Playgroud)


lee*_*eek 1

我还发现了这个: https: //github.com/symfony/symfony/pull/108,我可以在其中告诉AsseticBundle存储桶名称,但我没有找到在哪里为我的aws帐户提供密钥和秘密。

这应该可行 - 只需在指定 S3 存储桶 URL 时使用以下形式:

# config_prod.yml
assetic:
    write_to: s3://{key}:{secret}@{bucket}/
Run Code Online (Sandbox Code Playgroud)