目的
普段はオンプレミスのサーバでコンテンツを配信しているのですが、ネットワークの帯域やオンプレミスサーバの負荷が上昇したときの対策として、AWSのCloudFrontを利用したい。

なんかイベント的な配信をするらしいです・・・。
インフラ側のこともちょっと考えてほしいよなあ・・・
CloudFront準備
では、CloudFrontを準備していきます。
まずはAWSのページからCloudFrontをクリックします。

そして「Create Distribution」をクリック

今回はHTTP(S)を使用するためWebの方の「Get Start」をクリック

設定は以下な感じ。
基本的にいじらないが、赤枠の部分だけいじっております。


CORSを利用するのであれば、「Cache Base on Selected Request Headers」をWhiteListにして、Originを追加してください。

IPv6は使わないのでOFF

ここまで入れたらあとはDistributionを作成します。

こんな感じでStatusがDeployedになっていたら完了です。
※作成完了に10分~15分程度かかるようです。

CloudFront側は以上。
Cacheサーバの設定
今回、どうやってCloudFrontにトラフィックを流そうか考えましたが、Route53はドメイン管理者の都合で利用できず。
ので、今回はリダイレクトを使うことにしました。
現在の設定はこんな感じ。
user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  65536;
    use epoll;
    multi_accept on;
    accept_mutex off;
}
worker_rlimit_nofile 65536;
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  5;
    # log_format
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    # server config
    server {
        listen 443 ssl;
        server_name  main.hogehoge.com;
        access_log  /var/log/nginx/access.log  main;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_certificate_key /etc/nginx/ssl/main.hogehoge.com.key; #鍵指定
        ssl_certificate /etc/nginx/ssl/main.hogehoge.com.cer; #証明書指定
        ssl_prefer_server_ciphers  on;
        ssl_ciphers  HIGH:!aNULL:!eNULL:!MD5:!DH;
        
        location /
        {
            proxy_pass http://[OriginのIPアドレス];
            add_header 'Access-Control-Allow-Origin' $http_origin; #CORS用設定
            add_header 'Access-Control-Allow-Credentials' 'true'; #CORS用設定
        }
    }
}
現在は全てのリクエストをOriginサーバに送るようになっています。
これだとCloudFrontにリクエストを流せないので、リダイレクト設定を入れましょう。
とはいえ、Nginxにはコネクションが○○以上になったら~みたいなifが書けそうになかったので、「このコンテンツが来たときはCloudFrontに流す!」みたいなコンフィグにしてみました。
user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  65536;
    use epoll;
    multi_accept on;
    accept_mutex off;
}
worker_rlimit_nofile 65536;
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  5;
    # log_format
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    # server config
    server {
        listen 443 ssl;
        server_name  main.hogehoge.com;
        access_log  /var/log/nginx/access.log  main;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_certificate_key /etc/nginx/ssl/main.hogehoge.com.key; #鍵指定
        ssl_certificate /etc/nginx/ssl/main.hogehoge.com.cer; #証明書指定
        ssl_prefer_server_ciphers  on;
        ssl_ciphers  HIGH:!aNULL:!eNULL:!MD5:!DH;
        
        location /
        {
            proxy_pass http://[OriginのIPアドレス];
            add_header 'Access-Control-Allow-Origin' $http_origin; #CORS用設定
            add_header 'Access-Control-Allow-Credentials' 'true'; #CORS用設定
        }
        
        #To CloudFront
        location = /hogehogefile.html
        {
            return 301 https://xxxxxxxxxxxxx.cloudfront.net$request_uri;
            add_header 'Access-Control-Allow-Origin' $http_origin; #CORS用設定
            add_header 'Access-Control-Allow-Credentials' 'true'; #CORS用設定
        }
    }
}
これだと、例えばhttps://main.hogehoge.com/hogehogefile.html
とかいうリクエストが来た場合に、CloudFront側にトラフィックを流します。
コネクションで動的に流したい時は自分でスクリプトなりなんなりを組んで、デーモン化しておいて条件でnginx.confを書き換えたりするようにすればよいかと思います。
というか、本当はそこまでしたかったんだけど、さすがに時間がなさ過ぎた・・・。
nginx のifで以上、以下条件を指定できればいいんだけど・・・
まあ、nginxのifは害悪と言われているので、使わないに越したことはないですね。
ちなみに、リダイレクトするときにもCORS用のヘッダを入れておかないとエラーをはきやがりました。
それのせいで2時間ぐらい無駄にしました。
でも、よく考えたら当たり前ですよねー・・・。

 
  
  
  
  

コメント