AWS Elastic Beanstalk で CLB から ALB への移行

# 2018/04/12 の更新

[Elastic BeanstalkコンソールからALBが選択できるようになりました！](https://dev.classmethod.jp/cloud/aws/using-alb-on-elastic-beanstalk-by-aws-management-console/)

という発表で狂喜乱舞でしたが、よく調べるとこういうことでした。

* 新規作成時に、管理コンソールで、ALB/CLBを選択可能になった
* ALBの設定を、管理コンソールで更新できる
* CLBからALBへの移行は、やはり↓のように頑張る必要がある

# 前段

EBをALBで新規に立てるときは、以下のように簡単にできます。
https://dev.classmethod.jp/cloud/aws/elastic-beanstalk-support-alb/

しかし、いますでに本番でガッツリ運用してるEBを移行する方法は、ググっても出てきません。

いずれはウィザードでALBで組めるようになったり、設定画面でALBに組み直せたり、そうなってほしいですが、今日明日ではなさそうです。

私は今回、EBにWAFを付けたい要件が発生したため、ALBに移行しました。手順を確立するまではマジ四苦八苦でしたが、もう誰も苦しまないことを祈って記事に残します。

# 手順の図解

中央の列が開発者の作業で、上から順に進めます。左右に作業の入出力。

![hoge.jpg](https://qiita-image-store.s3.amazonaws.com/0/22947/edf3b21d-d303-ef2f-37b5-ed27e5065381.jpeg)

以下にサンプルなど添えつつ解説します。

# EB(CLB)の「環境の保存」

S3に設定がテキストファイルになっているので、ダウンロード＆編集＆アップロードします。

URLはこんなで、環境の保存でつけた名前のファイルが転がってます。

```
https://s3.console.aws.amazon.com/s3/buckets/elasticbeanstalk-ap-northeast-1-<account-id>/resources/templates/<environment-name>/
```

編集のポイントは、以下を含むCLB関連の設定をバッサリ削除することです。

* aws:elb:healthcheck
* aws:elb:loadbalancer
* aws:elb:listener
* aws:elb:listener:listener_port
* aws:elb:policies
* aws:elb:policies:policy_name

ここはawsebcliをうまく使えば、S3直接編集とか不要な気はするんですが、、、。

# .ebextensions でALBの設定を記述

ALBの設定は、ebextensionsで入れました。先程のS3のファイルに含めてもよいですが、こちらに入れておけばgitで管理できるので良い気がしています。

.ebextensions/01_loadbalancer.config みたいな名前で作成します。内容は、ALBは80,443で受ける。443にはCertificateManagerで作った証明書を付ける。80,443で受けたトラフィックは、EC2の80に流す。という記述です。

```yaml
option_settings:
  aws:elasticbeanstalk:environment:
    EnvironmentType: LoadBalanced
    LoadBalancerType: application
  aws:elbv2:listener:default:
    DefaultProcess: default
    ListenerEnabled: 'true'
    Protocol: HTTP
  aws:elbv2:listener:443:
    DefaultProcess: default
    ListenerEnabled: 'true'
    Protocol: HTTPS
    SSLCertificateArns: arn:aws:acm:ap-northeast-1:<account-id>:certificate/<certificate>
  aws:elasticbeanstalk:environment:process:default:
    Port: '80'
    Protocol: HTTP
    HealthCheckPath: /fabicon.ico
```

記述可能なすべての設定は公式マニュアルを参照してください。

* https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-options-general.html
* https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environments-cfg-applicationloadbalancer.html

HealthCheckPathはデフォが「/」なのですが、「/」がHTTP200以外を返すウェブアプリなら、上の例のようにfabicon.icoとか、なにか200になるものを指定してください。CLB構成のときにヘルスチェックパスを空欄にしておくと、「TCP80にpingして反応あればOK」でCLBを組んでくれてましたが、ALBはそういうのありません。

# eb create

elb-type、VPC設定をつけて、eb createすると、ALBなBeanstalk環境が起動します。

```bash
eb create eb-sample-alb \
--cfg eb-sample-clb \
--elb-type application \
--vpc \
--vpc.publicip \
--vpc.id <vpc-id> \
--vpc.ec2subnets <subnet-id-1>,<subnet-id-2> \
--vpc.elbpublic \
--vpc.elbsubnets <subnet-id-1>,<subnet-id-2> \
```

VPCまわりのオプション指定を端折ると、default VPCに立ちます。

# 環境のスワップ、クローン

最後に、デプロイまわりの都合があって、eb-sample-alb と作ったけど、どうにか eb-sample-clb にしたいので、以下のように進めました。

* eb-sample-alb と eb-sample-clb をCNAME Swap
* eb-sample-clb を削除
* 昼飯をくって消滅を待つ
* eb-sample-alb のクローンを、eb-sample-clb という名前で作る
* eb-sample-alb を削除

# 完了！
おつかれさまでした。

こうして組んだALBなEBに、WAFをつけようと思ったら、どうやらebextensionsのoption_settingsの記法では投入できず、CloudFormationの記法で頑張る必要があるらしいです。よくわかっていません。だいぶ萎えていますが、もう一声がんばります。