将Symfony2的静态资源转储到Amazon S3

11

我想在使用capifony在Symfony 2中部署后,将我的资产转储到生产环境的s3存储桶中。我找到了一些解决方案,但没有找到最好的使用方法。

可以使用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

所以我做了一些事情,现在它正在运行。

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 中添加参数。
AppKernel.php 中覆盖 boot() 方法:
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天时间,您需要更新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>

如果我们需要重写URL规则,并且CSS包含相对URL的图像,由于图像未上传到S3,因此可能无法正常工作。 - GusDeCooL
不要为 Assetic 使用 asset(asset_url),否则我们将会得到两个版本的 assets,类似于 assets.css?version008?version008 - GusDeCooL

2
实际上,您并不需要在应用程序代码中放置密钥,甚至可能不应该这样做。在Amazon S3中,您可以通过发送方指定访问权限,在这种情况下,您的生产服务器地址。

请查看提供的帖子链接:https://forums.aws.amazon.com/thread.jspa?messageID=236066

这将允许您自由地从该服务器写入您的存储桶。还记得拒绝来自其他所有IP的访问。


1
我还发现了这个:https://github.com/symfony/symfony/pull/108,在那里我可以告诉AsseticBundle存储桶的名称,但我没有找到提供我的AWS账户密钥和秘钥的地方。
这应该可以解决问题 - 只需在指定S3存储桶URL时使用以下表单即可:
# config_prod.yml
assetic:
    write_to: s3://{key}:{secret}@{bucket}/

1
我应该在config_prod中添加什么内容?当我运行php app/console assetic:dump s3://my-cucket --env=prod时,它返回PHP Warning: is_dir(): Unable to find the wrapper "s3" - did you forget to enable it when you configured PHP? - Cassiano
@Cassiano 我遇到了同样的问题。你解决了吗? - Reusable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接