EKS のメジャーバージョンをあげようと励んでいる時、なぜか「コンテナが Crash して再起動を繰り返す。」現象が起きた。特にエラーログは吐かれていない。
結果として、ログ出力を増やしたところ、Aurora との接続でハングしていて timeout で再起動していたらしい。( timeout ぐらい出してよ ... と思いつつ。
terraform 的にはメジャーバージョンアップ前は以下のようにしてた。
❯ tree
.
├── common // 共通インフラ置いてる
│ ├── db
│ │ ├── aurora.tf
│ │ ├── main.tf
│ │ ├── output.tf
│ │ ├── provider.tf
│ │ ├── sg.tf
│ │ └── variable.tf
│ └── eks
│ ├── eks.tf
│ ├── dns.tf
│ ├── main.tf
│ ├── output.tf
│ ├── provider.tf
│ ├── sg.tf
│ └── variable.tf
├── foo_service // 各種マイクロサービスに必要なインフラは個別で
│ ├── dns.tf
│ ├── ecr.tf
│ └── main.tf
└── hoge_service
├── dns.tf
├── ecr.tf
└── main.tf
それがメジャーアップデートで並列でクラスタを持って Route53 でラウンドロビンしてブルーグリーンデプロイしようとなったのでこう変えた。
❯ tree
.
├── common
│ └── eks
│ ├── blue // 元々のクラスタ(メイン)
│ │ ├── eks.tf
│ │ ├── main.tf
│ │ ├── output.tf
│ │ ├── provider.tf
│ │ ├── sg.tf
│ │ └── variable.tf
│ └── green // 並列した最新のクラスタ
│ ├── eks.tf
│ ├── main.tf
│ ├── output.tf
│ ├── provider.tf
│ ├── sg.tf
│ └── variable.tf
green の方を反映して、徐々にトラフィックを流していき、メインクラスタにトラフィックを流さなく変更したところで、AWS コンソールからバージョンを一つずつ上げていく戦略。戦略自体はいいと思う(我ながら)。
問題はクラスタとDBの接続にあり、 common/db/sg
に接続許可設定を定義していた。
だって、**「Aurora のセキュリティグループ」**だもん。自然だと思うでしょ?
かくして「クラスタとDBの疎通は済んでいるもの。」という先入観が生まれ死ぬほどハマりましたとさ。
今回のパターンで言うと、blue/green それぞれの sg 設定に「接続先の ingress 」を定義すると上手くいく。
SG を設定する時は「接続先」を設定するようにしよう!おにいさんとの約束だぞ!な!!