機能を安全に閉じる方法
作成日: 2024-10-23 作成者: Morix
少し大きめのサービスを運用していると、とある機能がいらなくなる時が来る。
たとえば外部公開用API。アーキテクチャを変更しサーバーも変更したため、旧APIが不要になったり・・・
あとは他社と接続するためのプロキシサーバーとかだと、その他社と連携することがなくなり不要になったり・・・
いろんな場面で機能を閉じる機会がやってくる。
ここで出てくる「機能」とはサーバーを伴うなにかしらの機能のことだ。図で表すと↓こういうもの。
これはAWSの構成だけど、本当によくある構成だと思う。
KubernetesやECSみたいなのでも同じような構成のアプリケーションはたくさんあるだろう。
今回はこの構成の機能をどうやって安全に閉じるかを解説していくよ!だいぶAWSに寄った説明をしているので注意。
構成の説明
- Route53
- DNS。例では
example.com
というDNSレコードを持ちそのAレコードはALBを指してる。
- DNS。例では
- Application Load Balancer(ALB)
- ユーザーからのアクセスを受けるLB。TargetGroupに紐づくEC2に負荷分散する。
- 図にはないが専用のSecurity Groupと紐づく。
- ユーザーからのアクセスを受けるLB。TargetGroupに紐づくEC2に負荷分散する。
- Target Group
- LBからのアクセスを受けるEC2を登録するリソース。ALBとASGと紐づく。
- LBからのアクセスを受けるEC2を登録するリソース。ALBとASGと紐づく。
- Auto Scaling Group(ASG)
- EC2の数を動的に増減させるリソース。TargetGroupと紐づく。
- EC2の数を動的に増減させるリソース。TargetGroupと紐づく。
- EC2
- アプリケーションを載せるVMインスタンス。
- 図にはないが専用のSecurity Groupと紐づく。
- アプリケーションを載せるVMインスタンス。
- RDS
- データーベース。
- 図にはないが専用のSecurity Groupと紐づく。
- データーベース。
- CloudWatch
- 各リソースの監視をしている。
- 外形監視 / HttpStatus監視 / サーバーリソース監視 / DBメトリクス監視 など
- 各リソースの監視をしている。
安全な閉じ方
- アクセスログを見てアクセスがないことを確認する
- 監視機能を無効化する
- サーバーを0台にしてアクセスログを監視する
- DNSレコードを削除する
- ASGを削除する
- ALBを削除する
- Target Groupを削除する
- DBを削除する
- Security Groupを削除する
- 最後のお片付け
1. アクセスログを見てアクセスがないことを確認する
まずはその機能が確実に使われていないことを確認する。
EC2に乗ってるアプリケーションのアクセスログを見よう。
ALBのログを見ることも有効だけど、ALBのログだけだと万が一EC2に直接アクセスするなにかがいた場合気付けない。
アクセスログにALBなどのヘルスチェックのアクセス以外がいないか確認する。
存在したら何者かを調べる。
ここで確認するログの期間は広めで確認しよう。
どのくらいの期間のログを見たらいいかはその機能の特性にもよるのでなんともいえないけど、1ヶ月なにもアクセスがなければ問題ないといってもいいと思う。
なにかしらアクセスが来てる場合、そのアクセスを遮断してもいいという判断をして次に進めても良い。
2. 監視機能を無効化する
これからサーバーを削除しアクセスを遮断するので、これによって発生するアラートを抑制するために監視設定をすべて無効化or削除しよう。
これをやらないと不要なアラートが鳴り続けてしまい、他の機能のアラートに気づきにくくなる。それを防止するために先に監視を止めるのが有効だ。
3. サーバーを0台にしてアクセスログを監視する
アクセスログは見たけど本当に問題ないかを確認するために、アプリケーションをシャットダウンしよう。
ASGのようなサーバーの増減をするリソースがある場合、その希望台数を0台にしてしまおう。
このサーバーの増減が一番復旧が楽なのだ。
なにか問題あれば希望台数を増やし復旧させてしまえば良い。
いきなりDNSレコードを削除してしまうと、大事なアクセスがあった場合検知できないし復旧もちょっとめんどい。
0台にしたあともしばらく様子を見よう。
監視を止めているため、大事なアクセスがあっても気付けないので、必ずアクセスログを見て問題ないか確認しよう。
4. DNSレコードを削除する
ここまで来たらあとは削除するだけなので、依存関係順に消していく。
まずはDNSレコードを削除しよう。これでこれから削除するリソースには一切のアクセスが来なくなる。
5. ASGを削除する
Target GroupがASGと紐づいてるのでASGを削除する。
6. ALBを削除する
Target GroupがALBと紐づいているのでALBを削除する。
7. Target Groupを削除する
Target Groupに紐づくリソースがいなくなったので削除する。
8. DBを削除する
DBに限らず、削除する機能のみが参照していたデータソースはこのタイミングで削除できる。
9. Security Groupを削除する
最後に各リソースに紐づいていたSecurity Groupを削除する。
Security Group同士も依存関係があるので、それに気をつけつつ削除しよう。
10. 最後のお片付け
これで主要なリソースは削除し終わったので、他になにか消すものがあれば消そう。
たとえば・・・
- 監視ダッシュボード
- IaCのコード
- サーバー管理表やアーキテクチャ図に載ってたら削除
IaCのコードについて触れておこう。
この構成をTerraformなどでコード化してる場合は、可能な限りIaC上で消していこう。
削除の順番もチームでレビューできるし、証跡も残る。
ペアワークで手で一気に消してあとでコードを一括削除という手もあり。これが楽かもしれない。