在Symfony 2中使用capifony部署之后,我想将我的资产转储到生产中的s3存储桶。我已经找到了一些解决方案,但是并没有真正找到最好的解决方案。
使用Zend_Service_Amazon_S3转储资产是可能的,但我认为仅为此导入Zend框架有点过分。 - http://permalink.gmane.org/gmane.comp.php.symfony.symfony2/54
我也发现了这个:https://github.com/symfony/symfony/pull/108,我可以告诉AsseticBundle存储桶名称,但我没有找到为我的帐户提供密钥和密码的位置。
你能指出一个更好的解决方案,或者给我一些关于上述问题的详细信息。
答案 0 :(得分: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
在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天的时间,你需要更新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>
答案 1 :(得分:2)
实际上,您并不需要,甚至可能不应该将您的密钥放在应用程序代码中。在Amazon S3中,您可以指定发件人的访问权限,在这种情况下,您是生产服务器地址。
查看提供的帖子链接: https://forums.aws.amazon.com/thread.jspa?messageID=236066
这将允许您从该服务器自由写入您的存储桶。还要记得拒绝其他所有IP的访问。
答案 2 :(得分:1)
我也发现了这个:https://github.com/symfony/symfony/pull/108, 我可以告诉AsseticBundle桶名,但我没有找到 在哪里为我的账户提供密钥和秘密。
这应该可行 - 在指定S3存储区URL时只需使用以下格式:
# config_prod.yml
assetic:
write_to: s3://{key}:{secret}@{bucket}/