AWS
elb
ElasticBeanstalk
ALB

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

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に移行しました。手順を確立するまではマジ四苦八苦でしたが、もう誰も苦しまないことを祈って記事に残します。

手順の図解

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

hoge.jpg

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

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

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

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の記法で頑張る必要があるらしいです。よくわかっていません。だいぶ萎えていますが、もう一声がんばります。