EC2からECSへ切り替える一番簡単な方法
これは「「はじめに」の Advent Calendar 2021」7日目の記事です。
TL;DR
- ALBのListenerRuleを利用して切り換える方法が一番簡単
1. EC2アプリケーションはALB配下にある
以下のような単純なアプリケーションを例にします。
- ALBのバックエンドでEC2アプリケーションが動いているとします。
- Stickyセッションも利用しておらず、Statelessで動作しており、EC2は複数台に同じアプリケーションが動いているとします。
2. ECSアプリケーションを追加する
ECSアプリケーションをALBに追加します。追加したあとは以下のようになります。
ListenerRuleのPriorityは以下のようにします。
Priority | Rule | Target |
---|---|---|
1 | HeaderName=X-ECS-Application , Value=1234567890abcdef
|
ECSアプリケーション |
2 | Path=* | EC2アプリケーション |
- 事前にテスト等などリリースに必要な準備は完了しておりEC2と同等のECSが準備済みであるとします。
- ※HeaderNameはアプリケーションが利用していない任意のキーにします。
- ※Valueは何でもよいです。
以下のようなChrome拡張を使いヘッダーを変更して動作の確認をします。
※同じアプリケーションなので動作に違いはないので、アプリケーションのSideCarにNginxを立てて特定のヘッダーをレスポンスに含めるようにしておく、などで判別できるようにするのがおすすめです。
3. ListenerRuleを変更して切り換える
正常稼働が確認できたら、ECSアプリケーションに向いているListenerRuleから条件を消し、すべてのパスがECSアプリケーションに向くようにします。
Priority | Rule | Target |
---|---|---|
1 | Path=* | ECSアプリケーション |
2 | Path=* | EC2アプリケーション |
これで切り替え完了です。ListenerRule変更の適用後、1分弱でECSにアクセスが切り替わります。
ロールバックするときはECSアプリケーションに向けているLisenerRuleに消した条件を復活させれば戻ります。
注意点
あくまで、最も素早く切り替える方法なので、もう少し慎重に切り替えたい場合は、加重ターゲットグループを利用して少しずつアクセスを流すほうが良いでしょう。
また、一時的にアプリケーション数は増えるので、バックエンド(RDBなど)のコネクション数、特にコネクションプールを起動時に確保するなどのライブラリを利用している場合は、予め設定をチェックしておいたほうが良いでしょう。
アプリケーション内でバックグラウンドプロセスが動作しており、RDBに書き込むような処理がある、とかSQSキューから取得して処理するプロセスがある、とかhttp以外の処理を行う場合はこの手順が使えるかどうかは考える必要があります。
まとめ
多分これが一番速くて簡単だと思います(フラグ)
他には
- CloudFrontのBehaviorで切り換える
- Route53で切り換える
方法もありますが、どちらも反映にある程度の時間を要します。Route53の加重レコードを利用するぐらいなら、ALBの加重ターゲットグループを利用したほうが良いです。
Discussion