2013-06-10 6 views
5

私は自分のウェブサイトのs3で静的ホスティングを実行しています。例えば。 www.somedomain.comはS3バケットを指しています。S3 Proxy to EC2 Inst

私のapiにはサブドメインapi.somedomain.comがありますが、クロスドメインの問題に対処するのは面倒です。私はwww.somedomain.com/api/ ... - > api.somedomain.com/...をマップしたいが、私は投稿できるようにしたいので完全なリダイレクト(301)をしない。

クラウドフロントではこの動作が許可されていますが、CDNは必要ないので少しオーバーキルです。

私は301のリダイレクトで動作するようにルーティングルールを取得しましたが、とにかくs3が私の要求をec2に渡すように設定していますか?ありがとう!

+3

あなたはそれを行うことができません。 S3は単なるオブジェクトストアシステムです。 ec2インスタンスであるカスタム原点を使用できるので、クラウドフロントで行うことができます。 – datasage

+0

はい。意味をなさないしかし、S3にはmod_rewriteに似たカスタムルーティングルールがあります。彼らは転送するかもしれないと考えています。 =(Cloudfrontの設定を終了しましたが、それ以上の費用がかかります – kungfoo

答えて

3

この問題を解決するには、パラダイムを切り替えるだけです。あなたのEC2のインスタンスでは、ちょうどあなたのWebアプリケーションとは別に、ワニスやnginxのようなリバースプロキシを実行して、http://www.somedomain.com/api/ *のトラフィックをWebアプリケーションにルーティングします(「/ api」プレフィックスを削除するリクエストURLを書き換えることもできます) S3へ。これを行うためにnginxまたはvarnishを設定するのはかなり簡単です(数日ではなく数日です)。

次に、www.somedomain.com DNSレコードをS3の代わりにec2インスタンスを指すように切り替えます。これを行うにニスのための

サンプル非LINTED VCL:この後

backend s3 { 
    .host = "s3.amazonaws.com"; 
    .port = "80"; 
} 

backend app { 
    .host = "localhost"; 
    .port = "8080"; 
} 

sub vcl_recv { 
    if (req.url ~ "^/api/.*") { 
     set req.backend = app; 
     set req.url = regsub(req.url, "^/api", ""); 
     set req.http.Host = "api.somedomain.com"; /* If your web app cares about host */ 
    } 
    else { 
     set req.backend = s3; 
    } 
} 

をあなたが好きなら、あなたはあなたのEC2インスタンスをチェックし、DNSルックアップをフェールオーバーの健康へのルート53を使用して、たとえば、など空想得ることができますそれがダウンしているときにあなたのs3バケツに、カスタムキャッシングルールを設定するなど、あなたが望む振る舞いを達成する必要はありません。

関連する問題