AWSのCloudFormationでSSL+LAMJ環境を構築してみた

前回はサンプルテンプレートをベースにしてSSL+LAMP環境を構築する手順でした。今回は前回のテンプレートからPHPを抜いて代わりにJDKとTomcatをインストールし、サーブレットアプリケーションを動作させるのに必要な環境構築を行いました。
使用するリソースは前回と代わりなくEC2、セキュリティグループ、 ElasticIPAssociationの3つのシンプルな構成です。
また、Googleが提供しているApacheの拡張モジュール「mod_pagespeed」のインストールと、標準で搭載されているmod_expires,mod_deflateの設定を行いました。これは後ほどLAMP環境を構築するテンプレートにも反映する予定です。
その他の細かい点は以下のような感じです。

  • インストールするTomcatは新規追加する入力項目により選択方式とする
    • 5.5,6,7,8,8.5のTomcatをインストール可能とする
    • Tomcatのバージョンに応じてインストールするJDKのバージョンも切り替える
  • mod_pagespeedをインストール&設定
  • mod_expires,mod_deflateを有効化&設定
  • apacheとTomcatをajp連携するついでにバーチャルホストを設定

インストールするTomcatとJDKのマッピングを作成しCloudFormationの組み込み関数の「FindInMap」により参照しました。
Tomcatは特定のディレクトリに展開して使いたいのでyumは使用せず、バージョンごとのダウンロード先とファイル名をマッピングに追加しました。

# TomcatのダウンロードリンクやインストールするJDKのバージョンのマッピング
TomcatSettings:
  '6':
    DownloadURL: >-
      https://archive.apache.org/dist/tomcat/tomcat-6/v6.0.53/bin/apache-tomcat-6.0.53.tar.gz
    TomcatFileName: apache-tomcat-6.0.53
    InstallJDKVersion: '7'
  '7':
    DownloadURL: >-
      https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.91/bin/apache-tomcat-7.0.91.tar.gz
    TomcatFileName: apache-tomcat-7.0.91
    InstallJDKVersion: '7'
  '8':
    DownloadURL: >-
      https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.53/bin/apache-tomcat-8.0.53.tar.gz
    TomcatFileName: apache-tomcat-8.0.53
    InstallJDKVersion: '8'
  '5.5':
    DownloadURL: >-
      https://archive.apache.org/dist/tomcat/tomcat-5/v5.5.36/bin/apache-tomcat-5.5.36.tar.gz
    TomcatFileName: apache-tomcat-5.5.36
    InstallJDKVersion: '6'
  '8.5':
    DownloadURL: >-
      https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.34/bin/apache-tomcat-8.5.34.tar.gz
    TomcatFileName: apache-tomcat-8.5.34
    InstallJDKVersion: '8'

以下はインストールするTomcatのバージョンを選択する項目です。

TomcatVersion:
  Description: Please set the version of Tomcat to be installed.
  Type: String
  Default: 7
  AllowedValues:
    - 5.5
    - 6
    - 7
    - 8
    - 8.5

次にTomcatをセットアップするコマンドは以下のようになりました。
JDKはデフォルトでインストールされていましたが微妙に古いのと他のバージョンをインストールできるようにするため一旦アンインストールしています。アンインストールの過程でaws-**というパッケージが依存関係によって削除されてしまいます。目的のJDKをインストールした後にaws-**のパッケージもインストールしなおしています。
Tomcatはいつものコマンドによって/usr/local以下に配置しています。
sedによる置換はTomcat7でしか検証していません(^q^
sedのiオプションの後ろに.orgとかつけるとバックアップを作成してくれるということを今回知りました( ・`ー・´)+

SetupTomcat:
  commands:
    remove_and_install_jdk:
      command: !Join 
        - ''
        - - |
            yum -y remove java-1.*
          - |+

          - yum -y install java-1.
          - !FindInMap 
            - TomcatSettings
            - !Ref TomcatVersion
            - InstallJDKVersion
          - |
            .0-openjdk
          - |+

          - >
            # Reinstall the package that was deleted together when
            deleting the JDK
          - >-
            yum -y install yum install aws-apitools-as
            aws-apitools-common aws-apitools-ec2 aws-apitools-elb
            aws-apitools-mon
    tomcat_install_and_configure:
      command: !Join 
        - ''
        - - |
            wget $TOMCAT_DOWNLOAD_PATH
          - |
            tar zxvf $TOMCAT_FILENAME.tar.gz
          - |
            mv $TOMCAT_FILENAME /usr/local/tomcat
          - |+

          - |
            # replace ajp settings.
          - >
            sed -i.org -e 's:^    <Connector port="8009"
            protocol="AJP/1.3" redirectPort="8443" />:    <Connector
            port="8009" protocol="AJP/1.3" redirectPort="8443"
            URIEncoding="UTF-8" />:' /usr/local/tomcat/conf/server.xml
          - |+

          - |
            # remove 8080 port settings.
          - >
            sed -i -e ':lbl1;N;s:<Connector port="8080"
            protocol="HTTP/1.1".*redirectPort="8443" />::;b lbl1;'
            /usr/local/tomcat/conf/server.xml
          - |+

          - |
            # start tomcat when EC2 startup.
          - >
            sed -i -e "$ a /usr/local/tomcat/bin/startup.sh"
            /etc/rc.local
          - |+

          - |
            # restart httpd and start tomcat.
          - |
            /etc/init.d/httpd restart
          - /usr/local/tomcat/bin/startup.sh
      env:
        TOMCAT_DOWNLOAD_PATH: !FindInMap 
          - TomcatSettings
          - !Ref TomcatVersion
          - DownloadURL
        TOMCAT_FILENAME: !FindInMap 
          - TomcatSettings
          - !Ref TomcatVersion
          - TomcatFileName
      cwd: '~'

以下はEC2立ち上げ時に新規作成したファイルです。

  • /etc/httpd/conf.d/httpd-ajp.conf
    • ajp連携を行う設定ファイルです。EC2に初回ログインしたタイミングでバーチャルホストを有効にするためこのファイル自体は削除しています。
  • /etc/httpd/conf.d/httpd-vhost.tmp
    • httpdのバーチャルホスト用のファイルです。EC2に初回ログインしたときに有効化したいため拡張子をtmpにしています。
  • /etc/yum.repos.d/mod-pagespeed.repo
    • mod_pagespeedのリポジトリ情報です。
  • /etc/httpd/conf.d/mod-deflate-and-expires.tmp
    • httpdのmod_deflate,mod_expiresの設定を記述したファイルです。バーチャルホストの設定ファイルと同様にEC2に初回ログインしたときに有効化するため拡張子をtmpにしています。
/etc/httpd/conf.d/httpd-ajp.conf:
  content: !Join 
    - ''
    - - |
        NameVirtualHost *:80
      - |
        <VirtualHost *:80>
      - '    ServerName '
      - !Ref DomainName
      - |+

      - |2
            ProxyPass / ajp://localhost:8009/
      - |
        </VirtualHost>
  mode: '000644'
  owner: root
  group: root
/etc/httpd/conf.d/httpd-vhost.tmp:
  content: !Join 
    - ''
    - - |
        NameVirtualHost *:80
      - |
        <VirtualHost *:80>
      - '    ServerName '
      - !Ref DomainName
      - |+

      - |+

      - |2
            RewriteEngine On
      - |2
            RewriteCond %{HTTPS} off
      - |2
            RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
      - |+

      - |2
            ProxyPass / ajp://localhost:8009/
      - |
        </VirtualHost>
      - |+

      - |
        NameVirtualHost *:443
      - |
        <VirtualHost *:443>
      - '    ServerName '
      - !Ref DomainName
      - |+

      - '    ErrorLog logs/'
      - !Ref DomainName
      - |
        .ssl_error_log
      - '    TransferLog logs/'
      - !Ref DomainName
      - |
        .ssl_access_log
      - |2
            LogLevel warn
      - |+

      - |2
            SSLEngine on
      - |2
            SSLProtocol All -SSLv2 -SSLv3
      - |2
            SSLProxyProtocol All -SSLv2 -SSLv3
      - |+

      - '    SSLCertificateFile /etc/letsencrypt/live/'
      - !Ref DomainName
      - |
        /cert.pem
      - '    SSLCertificateKeyFile /etc/letsencrypt/live/'
      - !Ref DomainName
      - |
        /privkey.pem
      - '    SSLCertificateChainFile /etc/letsencrypt/live/'
      - !Ref DomainName
      - |
        /chain.pem
      - |2
            ProxyPass / ajp://localhost:8009/
      - |
        </VirtualHost>
  mode: '000644'
  owner: root
  group: root
/etc/yum.repos.d/mod-pagespeed.repo:
  content: !Join 
    - ''
    - - |
        [mod-pagespeed]
      - |
        name=mod-pagespeed
      - >
        baseurl=http://dl.google.com/linux/mod-pagespeed/rpm/stable/x86_64
      - |
        enabled=1
      - gpgcheck=0
  mode: '000644'
  owner: root
  group: root
/etc/httpd/conf.d/mod-deflate-and-expires.tmp:
  content: !Join 
    - ''
    - - |
        <ifModule mod_expires.c>
      - |2
            ExpiresActive On
      - |2
            ExpiresByType image/png "access plus 3 weeks"
      - |2
            ExpiresByType image/jpeg "access plus 3 weeks"
      - |2
            ExpiresByType image/gif "access plus 3 weeks"
      - |2
            ExpiresByType image/svg+xml "access plus 3 weeks"
      - |2
            ExpiresByType text/css "access plus 3 weeks"
      - |2
            ExpiresByType text/javascript "access plus 3 weeks"
      - |2
            ExpiresByType application/x-javascript "access plus 3 weeks"
      - |2
            ExpiresByType application/x-shockwave-flash "access plus 3 weeks"
      - |2
            ExpiresDefault "access plus 1 days"
      - |
        </ifModule>
      - |+

      - |
        <IfModule mod_deflate.c>
      - |2
            SetOutputFilter DEFLATE
      - |+

      - |2
            BrowserMatch ^Mozilla/4\.0[678] no-gzip
      - |2
            BrowserMatch ^Mozilla/4 gzip-only-text/html
      - |2
            BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
      - |+

      - |2
            SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
      - |2
            SetEnvIfNoCase Request_URI _\.utxt$ no-gzip
      - |+

      - |2
            AddOutputFilterByType DEFLATE text/plain
      - |2
            AddOutputFilterByType DEFLATE text/html
      - |2
            AddOutputFilterByType DEFLATE text/xml
      - |2
            AddOutputFilterByType DEFLATE text/css
      - |2
            AddOutputFilterByType DEFLATE text/javascript
      - |2
            AddOutputFilterByType DEFLATE application/xhtml+xml
      - |2
            AddOutputFilterByType DEFLATE application/xml
      - |2
            AddOutputFilterByType DEFLATE application/rss+xml
      - |2
            AddOutputFilterByType DEFLATE application/atom_xml
      - |2
            AddOutputFilterByType DEFLATE application/x-javascript
      - |2
            AddOutputFilterByType DEFLATE application/x-httpd-php
      - </IfModule>
  mode: '000644'
  owner: root
  group: root

その他としてSSL証明書を発行するタイミングではapacheとTomcatはajp連携しているためcertbotのWebrootプラグインで指定するルートディレクトリを変更しました。

- >-
  yes | certbot-auto certonly --agree-tos --debug --webroot -w
  /usr/local/tomcat/webapps/ROOT/ -d 
- !Ref DomainName
- ' --email '
- !Ref EMailAddress
- |2
   --non-interactive
- |+

スタックの作成が完了したときの様子です。
約2分で完了したようです。
EC2にSSHで初回ログインしたときに証明書が発行され、ブラウザでアクセスした先の画面がTomcatのホーム画面になっていれば正常に動作しています。
今回は画面のキャプチャを取るのを忘れてしまいましたのでこれでおしまい。次回こそはリソース増やした少し複雑なスタックを作成してみたいと思います。

スポンサーリンク
GoogleAdsense



GoogleAdsense



シェアする