AWS構築手順EC2 WebAppサーバ構築(Ubuntu, Nginx)

本章では、WebAppサーバーのEC2インスタンスを作成し、UbuntuへのRubyやNginxのインストールと設定を行っていきます。
一からインスタンス作成をするのではなく、前章で作成したメンテサーバのAMIを取得して利用することで、SSH設定までの手順が完了した状態のインスタンスを素早く用意できます。

メンテサーバAMI取得

  1. EC2インスタンス一覧から、ec-trip-pro-ec2-mainteを選択し、アクション→イメージ→イメージの作成をクリックします。 EC2-1 AMIキャプチャ1
  2. イメージ名・説明を記入後、イメージの作成をクリックします(再起動しないのチェックはオフのままとします) EC2-1 AMIキャプチャ2
  3. 数分間待機すると、AMIの取得が完了します。AMIの一覧でステータスを確認できます。 EC2-1 AMIキャプチャ3 ステータスがavailableになったら完了です。

WebAppサーバ EC2インスタンス作成

作成したAMIを使ってWebAppサーバのEC2インスタンスを作成します。

  1. 前章のメンテサーバ同様に、EC2ダッシュボードからインスタンスを選択し、インスタンスの作成をクリックします。
    AMIの選択にて、「マイAMI」タブを選択すると、先程作成したAMIが表示されますので、それを選択します。 EC2-2 WebAppサーバキャプチャ4
  2. インスタンスタイプは、この手順では「t2.micro」としますが、運営されるサービスに沿って選択してください。 EC2-2 WebAppサーバキャプチャ5
  3. インスタンスのパラメータを設定します。
    ポイントは、VPC構築時にNATを利用しているか否かで設定が変わります。
    • NATを利用する場合、サブネットには「ec-trip-pro-subnet-webapp-az-a」を選択し、自動割り当てパブリックIPは「サブネット設定を仕様(無効)」とします。
    • NATを利用しない場合は、サブネットには「ec-trip-pro-subnet-public-az-a」を選択し、自動割り当てパブリックIPは「有効化」とします。
    キャプチャはNATゲートウェイを利用する設定となります。 EC2-2 WebAppサーバキャプチャ6
  4. ストレージはデフォルトのまま次へ進み、タグにはキー「Name」値「ec-trip-pro-ec2-webapp-az-a」として設定します。 EC2-2 WebAppサーバキャプチャ7
  5. セキュリティグループは「既存から選択」とし、ec-trip-pro-secgrp-webappec-trip-pro-secgrp-mainteの2つを選択します。 EC2-2 WebAppサーバキャプチャ8 確認と作成をクリックすると、SSHのPort22が許可されていないと警告が表示されますが、問題ないので次へをクリックします。
  6. 確認後、起動をクリックしてキーペアを指定します。ここでは、前章で作成したキーペア(ec-trip-demo)をリストから選択し、認識している同意にチェックをしてインスタンスの作成をクリックします。 EC2-2 WebAppサーバキャプチャ9

以上で完了です。WebAppサーバーを2台以上で冗長化する場合は、今回作成したWebAppインスタンスの中身を設定後、AMI取得→カスタムAMIからの作成でインスタンスを生成するので、ここではまだ作成しません。

WebAppサーバセットアップ

続けて、作成したWebAppサーバインスタンスのセットアップを行います。まず、メンテサーバを踏み台にして、WebAppサーバにSSH接続できることを確認します。

  1. 事前に、WebAppサーバのプライベートIPアドレスを把握しておきます。 EC2-2 WebAppサーバキャプチャ10
  2. SSH接続は、まずローカル端末からメンテナンスサーバへSSH接続をします(メンテナンスサーバが踏み台になります)。
    $ ssh ec-trip-pro-mainte
    
  3. 続けて、メンテナンスサーバからWebAppサーバにSSH接続をします。なお、接続鍵は前章で事前にメンテサーバへアップロード済みですので、これを利用します。
    # メンテサーバにSSH接続し、メンテサーバ上で以下を実行(WebAppサーバのプライベートIPアドレスを指定します)
    $ ssh -i ~/.ssh/aws-ec2.pem -p 22012 mainte@IPアドレス
    
    これでWebAppサーバの基本設定も完了済みとなります。続いて、WebAppサーバに必要な各種アプリケーションの設定を進めます。

WebAppサーバセットアップ

WebAppサーバにSSH接続した状態で以下を実行していきます。

ミドルウェアインストール

インストールする対象ミドルウェアは、EC-TRIPに必要なものを設定しています。

# 各種ミドルウェア, nginx, mysql-clientなど
$ sudo apt-get install -y nodejs nodejs-legacy npm imagemagick libmagickcore-dev libmagickwand-dev nginx apache2-utils

# bower
$ sudo npm install -g bower

アプリケーション配置ディレクトリ作成

アプリケーションを配置するディレクトリを作成しておきます。ただし、ここではGithubからのCloneは実施しません(デプロイ実施手順にて説明します)。

$ sudo chown -R mainte:www-data /var/www
$ sudo chmod 770 /var/www
$ mkdir -p /var/www/ec-trip/shared/log
$ mkdir -p /var/www/ec-trip/shared/tmp

Nginxの設定

EC-TRIPではWebサーバーにNginxを利用します(アプリケーションサーバはUnicornを利用します)。 Nginxを以下の通り設定します。
本資料では、基本的な設定にとどめますので、必要に応じてカスタマイズしてください。

  1. nginxの設定ファイル(conf)を以下の内容で作成します。
    ec-tripの部分は、サービス名に変更してください。

    $ sudo vi /etc/nginx/conf.d/ec-trip.conf
    
      error_log  /var/www/ec-trip/shared/log/nginx.error.log;
      access_log /var/www/ec-trip/shared/log/nginx.access.log;
    
      upstream app_server {
        server unix:/var/www/ec-trip/shared/tmp/sockets/.unicorn.sock fail_timeout=0;
      }
    
      server {
        listen 80 default;
        client_max_body_size 200M;
        server_name ec-trip.site;
        # 以下はSSL証明書の設定完了まではコメントアウトしておく
        #  set $https_c 0;
        #  if ($http_x_forwarded_proto != "https") {
        #      set $https_c 1;
        #  }
        #  # ELBヘルスチェックはHTTPのまま
        #  if ($http_user_agent = "ELB-HealthChecker/2.0") {
        #      set $https_c 0;
        #  }
        #  if ($https_c = 1) {
        #      return 301 https://$host$request_uri;
        #  }
    
        # nginx so increasing this is generally safe...
        keepalive_timeout 5;
    
        # path for static files
        root /var/www/ec-trip/current/public;
    
        # Basic認証を有効化する場合は以下を設定
        # set $auth "Restricted";
        # if ($http_user_agent = "ELB-HealthChecker/2.0") {
        #     set $auth off;
        # }
    
        # page cache loading
        try_files $uri/index.html $uri.html $uri @app;
        location @app {
          # HTTP headers
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_redirect off;
          proxy_pass http://app_server;
          # Basic認証を有効化する場合は以下を設定
          # auth_basic $auth;
          # auth_basic_user_file /etc/nginx/.htpasswd;
        }
        error_page 500 502 503 504 /500.html;
        location = /500.html {
          root /var/www/ec-trip/current/public;
        }
      }
    
  2. また、nginxではデフォルトで有効になっているsites-enabledを無効化しておきます。
    $ sudo unlink /etc/nginx/sites-enabled/default
    
  3. サービス稼働前など、Basic認証をかけたい場合は以下を実行します。
    $ sudo htpasswd -c /etc/nginx/.htpasswd ec-trip
    # この場合、Basic認証のIDは「ec-trip」になります。
    
    ec-trip.confから以下のコメントアウトをはずす。
    $ sudo vi /etc/nginx/conf.d/ec-trip.conf
    
    # 31行目あたり
    set $auth "Restricted";
    if ($http_user_agent = "ELB-HealthChecker/2.0") {
        set $auth off;
    }
    
    # 47行目あたり
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
    
  4. 最後にNginxを再起動しておきます。
    # confが正常か確認
    $ sudo nginx -t
    # 設定ファイル読み込み
    $ sudo nginx -s reload
    
    以上でNginxの設定は完了です。

ELBの設定

続けて、AWSコンソール上からELB(Elastic Load Balancer)の設定を行い、インターネットからアプリケーションへの入り口を設けます。
なお、WebAppサーバーを冗長化せずに1台構成で運営する場合でも、ELBを設置することをおすすめします。

  1. EC2ダッシュボード→ロードバランサーを選択し、ロードバランサーの作成をクリックします。 EC2-2 WebAppサーバキャプチャ13
  2. Application Load Balancerを選択します。 EC2-2 WebAppサーバキャプチャ14
  3. 以下のパラメータで作成します。 EC2-2 WebAppサーバキャプチャ15

    基本的な設定

    名前 ec-trip-pro-elb
    スキーマ インターネット向け
    IPアドレスタイプ ipv4

    リスナー

    プロトコル ポート
    HTTP 80
    SSL通信をするサービスであっても、現時点ではHTTP(80)のみを有効化します。HTTPSプロトコルの設定は、SSL証明書の設定時に行います。

    アベイラビリティーゾーン

    VPCにec-trip-pro-vpcを選択し、以下の2つのPublicサブネットを指定します。
    • ec-trip-pro-subnet-public-az-a
    • ec-trip-pro-subnet-public-az-b
  4. セキュリティ設定の構成では警告が表示されますが、これは後で設定するので現時点ではそのまま次へ進みます。
  5. セキュリティグループの設定
    既存のセキュリティグループからec-trip-pro-secgrp-elbを選択します。 EC2-2 WebAppサーバキャプチャ16
  6. 以下の通りルーティングの設定を行います。 EC2-2 WebAppサーバキャプチャ18 ターゲットグループ
    ターゲットグループ 新しいターゲットグループ
    名前 ec-trip-pro-elb-target-http
    プロトコル HTTP
    ポート 80
    ターゲットの種類 instance
    ヘルスチェック
    プロトコル HTTP
    パス /
  7. ターゲットの登録にて、このELBにぶら下げるWebAppサーバーを指定します。ここではec-trip-pro-ec2-webapp-az-aを選択し、登録済みに追加をクリックします。 EC2-2 WebAppサーバキャプチャ19
  8. 確認した上で作成をクリックしてELBの設定完了です。 EC2-2 WebAppサーバキャプチャ20 なお、この段階ではアプリケーションをデプロイしていないので、ELBのヘルスチェックは失敗となります。

メンテナンスサーバーのSSH Config設定

最後に、メンテナンスサーバーからのWebAppサーバーへのSSH configを設定します。

  1. メンテサーバーへSSH接続してSSH configを編集します。
    vi ~/.ssh/config
    
    # 以下を追記
    Host ec-trip-pro-webapp1
      User mainte
      Port 22012
      IdentityFile ~/.ssh/aws-ec2.pem
      HostName 10.0.1.161
    
  2. 設定できたら、メンテサーバーから以下のコマンドだけでWebAppサーバーへSSH接続可能なことを確認します。
    $ ssh ec-trip-pro-webapp1
    
    なお、この設定は後述のデプロイ作業で必要となります。

以上でWebAppサーバの設定を完了します。次章では、RDSを設定してデータベースを構築します。