2011-11-17 31 views
11

Tôi muốn đổ tài sản của mình vào thùng s3 của tôi trong sản xuất, sau khi triển khai với capifony trong Symfony 2. Tôi đã tìm thấy một số giải pháp, nhưng không thực sự tìm ra cách tốt nhất để sử dụng .Dump Symfony2 tài sản cho Amazon S3

Có thể kết xuất nội dung với Zend_Service_Amazon_S3 nhưng tôi nghĩ rằng hơi quá mức cần thiết để nhập khung Zend chỉ cho điều này. - http://permalink.gmane.org/gmane.comp.php.symfony.symfony2/54

Tôi cũng tìm thấy điều này: https://github.com/symfony/symfony/pull/108, nơi tôi có thể nói AsseticBundle tên nhóm, nhưng tôi không tìm thấy nơi cung cấp khóa và bí mật cho tài khoản aws của mình.

Bạn có thể chỉ ra giải pháp tốt hơn hoặc cung cấp cho tôi một số thông tin chi tiết về những điều được đề cập ở trên.

Trả lời

1

Tôi cũng đã tìm thấy này: https://github.com/symfony/symfony/pull/108, nơi tôi có thể nói AsseticBundle tên xô, nhưng tôi đã không tìm thấy nơi để cung cấp các Khoá và bảo mật cho tài khoản AWS của tôi.

này nên làm việc - chỉ cần sử dụng các hình thức sau khi xác định URL xô S3:

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

Tôi nên thêm gì khác trong config_prod? Khi tôi chạy: 'php app/console assetic: dump s3: // my-cucket --env = prod' nó trả về' PHP Warning: is_dir(): Không thể tìm thấy trình bao bọc "s3" - bạn đã quên bật nó chưa khi bạn cấu hình PHP? ' – Cassiano

+0

@Cassiano Tôi gặp phải vấn đề tương tự. Bạn đã giải quyết nó chưa? – Reusable

+0

@Không thể sử dụng giải pháp của tôi ở trên http://stackoverflow.com/a/26146698/1983572 – Cassiano

2

Trên thực tế bạn không thực sự cần và có lẽ thậm chí không nên, đưa chìa khóa của bạn trong mã ứng dụng . Trong Amazon S3, bạn có thể chỉ định quyền truy cập của người gửi, trong trường hợp này bạn là địa chỉ máy chủ sản xuất.

Hãy nhìn vào các post link cung cấp: https://forums.aws.amazon.com/thread.jspa?messageID=236066

này sẽ cho phép bạn tự do viết từ đó máy chủ để xô của bạn. Hãy nhớ cũng từ chối truy cập từ mọi ip khác.

6

Vì vậy, những gì tôi đã làm và nó đang hoạt động.

Thêm ít composer.json và cài đặt nó

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

Tạo một dịch vụ:

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

} 

Khai báo các dịch vụ tại config.yml hay kể cả nó như là một tập tin

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

Thêm các thông số tại parameters.yml

Override boot() phương pháp tại AppKernel.php:

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

Tại config_prod.yml add:

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

Cuối cùng thêm bộ lọc với tài sản của mình để viết lại một cách chính xác đường dẫn của bạn:

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

Vì vậy, mỗi thời gian mà bạn đã thay đổi một cái gì đó cần phải chạy:

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

Một chi tiết rất quan trọng mất gần 2 ngày thời gian của tôi, bạn cần cập nhật CORS của Amazon S3 để truy cập một số tệp như phông chữ thêm bên trong css bootstrap css chẳng hạn. Quyền của CORS của tôi như sau:

<?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> 
+0

không hoạt động tốt nếu chúng tôi đã viết lại quy tắc url và css chứa hình ảnh thành url tương đối vì hình ảnh không được tải lên S3 – GusDeCooL

+0

không làm 'asset (asset_url)' cho assetic hoặc chúng ta sẽ nhận được phiên bản asset hai lần 'assets.css? version008? version008' – GusDeCooL