ゼロから始めるAWS Elastic Beanstalk #2~ 独自ドメイン対応、HTTPS対応、HTTP→HTTPSへのリダイレクト対応、Auto Scaling設定 ~


概要

本編

ALB(Application Load Balancer)をHTTPSに対応する

Elastic BeanstalkでつくったWebアプリをHTTPSに対応させるため、拡張設定用のYAMLファイルを作る。
プロジェクトのルートに .ebextensionsというディレクトリをつくり、そこにalb-secure-listener.configというファイルを作成する。

elastic-beantalk-java-app
├── .ebextensions
│   └── alb-secure-listener.config
・
・ その他のファイル達
・

alb-secure-listener.configは以下のようにする

alb-secure-listener.config
option_settings:
  aws:elbv2:listener:default:
    ListenerEnabled: 'false' 
  aws:elbv2:listener:443:
    DefaultProcess: https
    ListenerEnabled: 'true'
    Protocol: HTTPS
    SSLCertificateArns: arn:aws:acm:ap-northeast-1:123456789:certificate/abcdef-01234-6123-caca-123456789b
  aws:elasticbeanstalk:environment:process:https:
    Port: '80'
    Protocol: HTTP  



以下、設定内容の説明をしていく。

設定その1:「HTTPは受け付けません」

  aws:elbv2:listener:default:
    ListenerEnabled: 'false' 

aws:elbv2:listener:defaultはデフォルトのリスナー(ポート80)の設定を意味する。
ここでListenerEnabled: 'false'としていったんポート80、つまり、HTTPは利用不可とした。つまりHTTPでのアクセスを受け付けない設定にした。

(「こういう設定もアリだよね」という例のためで、後で変更してHTTP(ポート80)でアクセス来たらHTTPS(ポート443)にリダイレクトするように構成する。)

設定その2:「HTTPSを受け付けます、証明書はこれです。」

  aws:elbv2:listener:443:
    DefaultProcess: https
    ListenerEnabled: 'true'
    Protocol: HTTPS
    SSLCertificateArns: arn:aws:acm:ap-northeast-1:123456789:certificate/abcdef-01234-6123-caca-123456789b

aws:elbv2:listener:443はポート443の設定。
ここでは、HTTPSでつかうポート443についての設定で、HTTPSプロトコルで使うことを指定している。
SSLCertificateArnsにはACM(Certificate Mangaer)で取得した証明書のARNを指定する

設定その3:「ロードバランサーにHTTPSでアクセス来たら、ロードバランサーはEC2のポート80番にHTTPでつなぎます」

aws:elbv2:listener:443:以下にあったDefaultProcess: httpsの部分だが、
このhttpsというのは、以下の設定にあるaws:elasticbeanstalk:environment:process:https:httpsに対応している。つまり単なる名前。httpsじゃなくてもOK。

  aws:elasticbeanstalk:environment:process:https:
    Port: '80'
    Protocol: HTTP  

これで、ロードバランサーにHTTPSでアクセスがきたら、その先にあるEC2の80番ポートにつなぎに行くという設定ができた。
つまり、以下の赤マルの部分の設定ができた。

Auto Scalingを構成する

  aws:autoscaling:asg:
    Availability Zones: Any
    MaxSize: '1'
    MinSize: '1'    

っこではaws:autoscaling:asgでAuto Scalingグループで使用するインスタンスの最小数と最大数を、それぞれ1に設定した。つまりこれはスケールしない設定。

最大数を2以上に設定した場合Availability Zones: Anyになってるときは、使用可能なAvailability Zone間で均等にインスタンスを起動するようになる。

HTTPSのみ有効で、AutoScaleしないalb-secure-listener.configの内容

ここまでの内容まとめると
alb-secure-listener.configは以下のようにする

ファイルの置き場所
elastic-beantalk-java-app
├── .ebextensions
│   └── alb-secure-listener.config
・
・ その他のファイル達
・

HTTPSのみ有効で、AutoScaleしないalb-secure-listener.configの内容

alb-secure-listener.config
option_settings:
  aws:elbv2:listener:default:
    ListenerEnabled: 'false' 
  aws:elbv2:listener:443:
    DefaultProcess: https
    ListenerEnabled: 'true'
    Protocol: HTTPS
    SSLCertificateArns: arn:aws:acm:ap-northeast-1:456509554684:certificate/fa982b4b-01f3-4efe-9db6-782e1144a88b
  aws:elasticbeanstalk:environment:process:https:
    Port: '80'
    Protocol: HTTP
  aws:autoscaling:asg:
    Availability Zones: Any
    MaxSize: '1'
    MinSize: '1'     

アプリをデプロイする

さて、ここまで設定したところでアプリをデプロイする

eb create my-jetty-app-test2 --instance_type t2.small --elb-type application --vpc.id vpc-xxxxxxxxxxxxxxxxx --vpc.elbpublic --vpc.elbsubnets subnet-xxxxxxxxxxxxxxxxx,subnet-yyyyyyyyyyyyyyyyy --vpc.publicip --vpc.ec2subnets subnet-xxxxxxxxxxxxxxxxx,subnet-yyyyyyyyyyyyyyyyy

独自ドメイン対応

アプリのデプロイが終わったら、Elastic Beanstalkを独自ドメインに対応する

Webコンソールから Route 53 に行き、対象ドメインを選択してレコードセットの作成をクリック

エイリアス を選択し、エイリアス先から Elastic Beanstalk環境グループのなかから、このドメインを割り当てたい環境を選択し作成をクリックすればOK

これで、ドメインがElastic Beanstalkに作った環境にひもづいた。

ドメイン名は仮にexample.comとすると

で無事アプリが公開できた。
ここまでで独自ドメイン+HTTPS化が終了。

HTTPアクセスのHTTPSへのリダイレクト対応

ALB(Application Loadbalancer)の機能アップにより、ALBの設定だけでHTTP→HTTPSへのダイレクトができるようになっている。

さきほどは、alb-secure-listener.configの設定で以下のようにHTTPを無効にしてしまったが、これを有効にする

alb-secure-listener.config(HTTP無効)
option_settings:
  aws:elbv2:listener:default:
    ListenerEnabled: 'false' 

alb-secure-listener.config(HTTP有効)
option_settings:
  aws:elbv2:listener:default:
    ListenerEnabled: 'true' 

既にデプロイしているなら、Webコンソールから有効にしてもOK

Webコンソールから有効にするには、Elastic Beanstalkにアクセスし、

ElasticBeanstalk>変更したい環境>設定>ロードバランサーとメニューを選択して、変更をクリック

ロードバランサーの変更画面で、無効になっているポート80を有効にして、適用をクリックすればOK

5分程度まつと、構成の更新が終了する。

ポート80のリスナーが有効になったらロードバランサーのリダイレクト設定をする

Elastic Beanstalkが自動生成したロードバランサーを選択し、リスナータブを選択する。

HTTP:80のリスナーのルールを表示をクリックする

ルール設定画面でボタンをクリックする

次に、をクリック

IFTHENの条件式を設定できるので、
- IFにはパスが・・・を選択し、値として *(アスタリスク=ワイルドカード) を入力
- THENには、アクションの追加で リダイレクト先 を選択する

リダイレクト先として HTTPSを選択し、ポート番号として443と入力する

できたら、保存をクリック。

これで、HTTPにアクセスが来たらHTTPSにリダイレクトする設定は完了。

実際に、

http://example.com にアクセスしてみると、ちゃんと https://example.com にリダイレクトされる。

まとめ

説明した構成

本稿で使用したソースコード
https://github.com/riversun/java-jetty-app-on-elasticbeanstalk/tree/https_conf_with_ebextensions_dir