2018/04/12 の更新
Elastic BeanstalkコンソールからALBが選択できるようになりました!
という発表で狂喜乱舞でしたが、よく調べるとこういうことでした。
- 新規作成時に、管理コンソールで、ALB/CLBを選択可能になった
- ALBの設定を、管理コンソールで更新できる
- CLBからALBへの移行は、やはり↓のように頑張る必要がある
前段
EBをALBで新規に立てるときは、以下のように簡単にできます。
https://dev.classmethod.jp/cloud/aws/elastic-beanstalk-support-alb/
しかし、いますでに本番でガッツリ運用してるEBを移行する方法は、ググっても出てきません。
いずれはウィザードでALBで組めるようになったり、設定画面でALBに組み直せたり、そうなってほしいですが、今日明日ではなさそうです。
私は今回、EBにWAFを付けたい要件が発生したため、ALBに移行しました。手順を確立するまではマジ四苦八苦でしたが、もう誰も苦しまないことを祈って記事に残します。
手順の図解
中央の列が開発者の作業で、上から順に進めます。左右に作業の入出力。
以下にサンプルなど添えつつ解説します。
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に流す。という記述です。
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環境が起動します。
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の記法で頑張る必要があるらしいです。よくわかっていません。だいぶ萎えていますが、もう一声がんばります。