AWS EKS Terraform moduleではData Sourcesとしてaws_eks_clusterを使わない方がいい理由
結論、バージョンによってはエラーを引きますよ、というのが理由です。
ちょっとした話ですが、私がハマったので記録として残しておきます。
やめた方がいい書き方
以下のようなサンプルコードはやめて、ちゃんと公式のサンプルコードに合わせた書き方にしましょうという話です。
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
を使うようにというアナウンスもあるので、そこも書き換えておきます。
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
}
ちなみに、ちゃんと公式のサンプルコードを見てみるとそんな感じで書いていますので、困ったら公式のサンプルコードを見るべきというところが今回の学びです。
やめた方がいい書き方をしていて遭遇したエラー
毎週ちょっとずつ作っては消し、を繰り返したら突如エラーを吐き出したので、バージョンアップで挙動変わってエラーになったのだろうと思います。特にバージョンの指定をしていなかったのが敗因ですが、ちゃんとベストプラクティスを学べたという収穫もありました。
│ 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で解決しそうに見えて、それを入れると循環しちゃうらしく、その瞬間、詰んだ…と思いました。
同じ症状に陥った話がこちらです。
おまけ
Bingのチャットで聞いてみました。
ちゃんと書くべきでない書き方はしないで書いてくれますね。さすがです!
cluster_versionが今使えないバージョンだったり、cluster_nameを使うべきところで、cluster_idを使ってますけど(^-^;
Discussion