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 を設定する時は「接続先」を設定するようにしよう!おにいさんとの約束だぞ!な!!