⚠️

AWS EKS Terraform moduleではData Sourcesとしてaws_eks_clusterを使わない方がいい理由

2023/03/19に公開

結論、バージョンによってはエラーを引きますよ、というのが理由です。

ちょっとした話ですが、私がハマったので記録として残しておきます。

やめた方がいい書き方

以下のようなサンプルコードはやめて、ちゃんと公式のサンプルコードに合わせた書き方にしましょうという話です。

やめた方がいい書き方
module "my-cluster" {
  "terraform-aws-modules/eks/aws"
  # ... 省略
}

# ↓ここがダメなところです
data "aws_eks_cluster" "cluster" {
  name = module.my-cluster.cluster_id
}

data "aws_eks_cluster_auth" "cluster" {
  name = module.my-cluster.cluster_id
}

provider "kubernetes" {
  host                   = data.aws_eks_cluster.cluster.endpoint # これも変えるべきです
  cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data) # これも変えるべきです
  token                  = data.aws_eks_cluster_auth.cluster.token
}

これは後述するエラーに遭遇することになるのでやめましょう。結構ネットに落ちていがちなサンプルコードです。

何せ私もコピペしてエラーを引いた人ですから…

修正版はこちら

エラーに遭遇するのはdata "aws_eks_cluster" "cluster" {の行で、これを使うのをやめるとエラーが解消します。

あと、おまけにoutpostの仕様の影響っぽいですが、cluste_idは使わずにcluster_nameを使うようにというアナウンスもあるので、そこも書き換えておきます。

https://github.com/terraform-aws-modules/terraform-aws-eks/blob/master/docs/UPGRADE-19.0.md

こう書くべき
module "my-cluster" {
  "terraform-aws-modules/eks/aws"
  # ... 省略
}

data "aws_eks_cluster_auth" "cluster" {
  name = module.my-cluster.cluster_name
}

provider "kubernetes" {
  host                   = module.my-cluster.cluster_endpoint
  cluster_ca_certificate = base64decode(module.my-cluster.cluster_certificate_authority_data)
  token                  = data.aws_eks_cluster_auth.cluster.token
}

ちなみに、ちゃんと公式のサンプルコードを見てみるとそんな感じで書いていますので、困ったら公式のサンプルコードを見るべきというところが今回の学びです。
https://github.com/terraform-aws-modules/terraform-aws-eks/blob/master/examples/complete/main.tf

やめた方がいい書き方をしていて遭遇したエラー

毎週ちょっとずつ作っては消し、を繰り返したら突如エラーを吐き出したので、バージョンアップで挙動変わってエラーになったのだろうと思います。特にバージョンの指定をしていなかったのが敗因ですが、ちゃんとベストプラクティスを学べたという収穫もありました。


│ Error: reading EKS Cluster (xxxx): couldn't find resource
│ 
│   with module.backend.data.aws_eks_cluster.xxxx,
│   on modules/backend/main.tf line 457, in data "aws_eks_cluster" "xxxx":
│  457: data "aws_eks_cluster" "xxxx" {
│ 

※xxxxは実際のリソースの名前になっていますが、各々のリソース名で置き換えてお読みください。

パッと見た感じdepends_onで解決しそうに見えて、それを入れると循環しちゃうらしく、その瞬間、詰んだ…と思いました。

同じ症状に陥った話がこちらです。
https://discuss.hashicorp.com/t/cycle-dependency-in-plan/50789/8

おまけ

Bingのチャットで聞いてみました。
ちゃんと書くべきでない書き方はしないで書いてくれますね。さすがです!

cluster_versionが今使えないバージョンだったり、cluster_nameを使うべきところで、cluster_idを使ってますけど(^-^;

Discussion