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

# 概要
- [ゼロから始めるJavaでAWS Elastic Beanstalk ＃１～ EB CLIを使ったJava Webアプリ環境構築 ～](https://qiita.com/riversun/items/9d53238fef611ce7d466)の続編です
- Elastic Beanstalkで構築するWebアプリを以下のようにします
   - **HTTPS**対応
   - **独自ドメイン対応**
   - うっかり**HTTP**でリクエスト来たら**HTTPSにリダイレクト**
   - Auto Scalingは不要

- ということで、以下のように構成するときの設定例をみていきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/6834766c-dc5b-b835-5c33-c088030800a0.png)

# 本編

## 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**は以下のようにする

```YAML: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  
```


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

### 設定その１：「HTTPは受け付けません」

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

[aws:elbv2:listener:default](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-options-general.html#command-options-general-elbv2-listener-default)はデフォルトのリスナー(ポート80)の設定を意味する。
ここで``ListenerEnabled: 'false'``としていったん<font color=red>ポート80、つまり、**HTTP**は利用不可</font>とした。つまりHTTPでのアクセスを受け付けない設定にした。

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



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

```YAML
  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](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-options-general.html#command-options-general-elbv2-listener)はポート443の設定。
ここでは、**HTTPS**でつかうポート443についての設定で、**HTTPS**プロトコルで使うことを指定している。
**SSLCertificateArns**には[ACM(Certificate Mangaer)](https://ap-northeast-1.console.aws.amazon.com/acm/)で取得した証明書のARNを指定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/1c856280-9b95-0a34-1261-fa796415a0a3.png)


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

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


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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/f0757082-fa91-7ff7-3b7b-d4f472f4b36b.png)

## Auto Scalingを構成する

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

っこでは[aws:autoscaling:asg](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-options-general.html#command-options-general-autoscalingasg)でAuto Scalingグループで使用するインスタンスの最小数と最大数を、それぞれ1に設定した。つまりこれはスケールしない設定。

[最大数を2以上に設定した場合](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.managing.as.html)、**Availability Zones: Any**になってるときは、使用可能なAvailability Zone間で均等にインスタンスを起動するようになる。

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

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

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

```

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

```YAML: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'     
```

## アプリをデプロイする

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

```shell
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 に行き、対象ドメインを選択して**レコードセットの作成**をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/a0f8e550-36e0-606c-7e24-3b1a55b53d55.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/2829f752-d8c1-3394-9ce0-d35ac29103bd.png)

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

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

https://example.com

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

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

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

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

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

↓

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

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

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

https://ap-northeast-1.console.aws.amazon.com/elasticbeanstalk

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/4210551e-9da6-8073-ddae-f2f7a872772b.png)

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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/a69a55d9-1097-5031-be3c-a92b75af52ac.png)

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


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

https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#LoadBalancers:

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/3042fcb9-4aaf-dd6e-3508-87de49f5a40d.png)

ルール設定画面で![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/579317ee-b7d7-684e-7a0e-de247d32164b.png)ボタンをクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/1ba165c7-4ce5-210b-7300-bfb9077a5539.png)

次に、![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/5c4fab12-a05f-35ca-9ffb-d7cd875595b3.png)をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/c696c0e3-32ef-8857-f1c2-db5443a20084.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/ebbcae01-3190-0ec4-a42c-a19db7c05d3a.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/910a2562-4a71-dedb-019c-f7bb8e1e58dc.png)

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

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

実際に、

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

# まとめ

- [ゼロから始めるJavaでAWS Elastic Beanstalk ＃１～ EB CLIを使ったJava Webアプリ環境構築 ～](https://qiita.com/riversun/items/9d53238fef611ce7d466)の続編として、Elastic BeanstalkのWebアプリを独自ドメイン、HTTPS、HTTPからのリダイレクトに対応するための方法について説明しました

- シンプルな設定・操作で実用に耐える環境を構築できるElastic Beanstalkは本番環境構築だけでなく、プロトタイピングなどのラピッドな開発にも向いており色々なシーンで重宝しそうです。

**説明した構成**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/6834766c-dc5b-b835-5c33-c088030800a0.png)

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