2013-06-10 2 views
5

내 웹 사이트의 s3에서 정적 호스팅을 실행 중입니다. 예 : www.somedomain.com은 S3 버킷을 가리 킵니다.S3 Proxy to EC2 Inst

내 API에는 하위 도메인 api.somedomain.com이 있지만 도메인 간 문제를 처리하는 것은 귀찮습니다. www.somedomain.com/api/ ... -> api.somedomain.com/...을 게시하고 싶지만 게시 할 수 있기를 원하기 때문에 전체 리디렉션 (301)을 수행하지 않아도됩니다.

Cloudfront는 이러한 동작을 허용하지만 CDN이 필요하지 않으므로 조금 과잉이라고 생각합니다.

301 리디렉션과 함께 작동하는 라우팅 규칙을 얻었으나 어쨌든 s3이 내 요청을 ec2로 전달하도록 구성 했습니까? 감사!

+3

당신은 그렇게 할 수 없을 것입니다. S3는 단지 객체 저장소 시스템입니다. ec2 인스턴스 인 사용자 지정 원본을 사용할 수 있으므로 클라우드 프론트에서이 작업을 수행 할 수 있습니다. – datasage

+0

예. 이해해. 그러나 S3에는 mod_rewrite와 비슷한 사용자 지정 라우팅 규칙이 있습니다. 그들이 포워딩 할 수도 있다는 것을 알았습니다. = (Cloudfront를 종료했지만 비용은 더 많이 듭니다. – kungfoo

답변

3

이 문제를 해결하려면 패러다임을 전환해야합니다. EC2 인스턴스에서 웹 응용 프로그램과 별도로 바니시 또는 nginx와 같은 역방향 프록시를 실행하여 http://www.somedomain.com/api/ *의 트래픽을 웹 응용 프로그램에 라우팅합니다 (요청 URL을 다시 작성하여 "/ api"접두사 제거)하고 다른 모든 트래픽 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; 
    } 
} 

을, 당신은 당신이 좋아하는 경우에, 공상 얻을 건강에 경로 (53)를 사용하여 예를 들어 당신의 EC2 인스턴스를 확인하고 DNS 조회를 통해 실패 할 수 있습니다 s3 버킷에 연결하고 맞춤 캐싱 규칙을 구성하는 등의 작업을 수행 할 수 있습니다. 그러나 원하는 동작을 달성하는 데 필요한 것은 없습니다.

관련 문제