Mirai Translate TECH BLOG

株式会社みらい翻訳のテックブログ

EKS の aws-auth をいじって Fargate が立ち上がらなくなった話

こんにちは。みらい翻訳 SRE チームの jeff です。

遅くなりましたが みらい翻訳 Advent Calendar 2022 の 8日目です。


EKS を触ってて表題の件で少しハマったので書き記しておこうと思います。

aws-authkubernetes の ConfigMap リソースで IAM エンティティ(IAM ロール、 IAM ユーザー)に対して kubernetes の権限を付与するための設定になります。

現在 SRE チームで管理している EKS クラスターの aws-auth ConfigMap は terraform で管理していて以下のように定義しています

resource "kubernetes_config_map" "aws-auth" {
  data = {
    "mapRoles" = file("./auth-configmap-role.yml")
    "mapUsers" = file("./auth-configmap-user.yml")
  }
  metadata {
    name      = "aws-auth"
    namespace = "kube-system"
  }
}

上記 tf の中で参照している auth-configmap-role.yml は以下となります(auth-configmap-user.yml の中身は今回の話では重要ではないので割愛)。

- groups:
  - system:bootstrappers
  - system:node-proxier
  - system:nodes
  rolearn: arn:aws:iam::{aws account id}:role/{role name}
  username: system:node:{{SessionName}}

特になんともない aws-auth です。

この aws-auth ですが EKS の fargate profile を作成すると自動で mapRoles に fargate profile に指定した role が以下のように追加されます。

- groups:
  - system:bootstrappers
  - system:node-proxier
  - system:nodes
  rolearn: arn:aws:iam::{aws account id}:role/{fargate profile role name}
  username: system:node:{{SessionName}}

この role があるために fargate で pod を立ち上げることができます。

fargate profile が上記の定義を自動で追加するため aws-auth を terraform で変更しようとすると、以下のような変更点が出てきます。

Terraform will perform the following actions:

  # kubernetes_config_map.aws-auth will be updated in-place
  ~ resource "kubernetes_config_map" "aws-auth" {
      ~ data        = {
          ~ "mapRoles" = <<-EOT
                - groups:
                  - system:bootstrappers
                  - system:nodes
                  - system:node-proxier
                  rolearn: arn:aws:iam::{aws account id}:role/{role name}
                  username: system:node:{{SessionName}}
              - - groups:
              -   - system:bootstrappers
              -   - system:node-proxier
              -   - system:nodes
              -   rolearn: arn:aws:iam::{aws account id}:role/{fargate profile role name}
              -   username: system:node:{{SessionName}}
              + 
            EOT
            # (1 unchanged element hidden)
        }
        id          = "kube-system/aws-auth"
        # (1 unchanged attribute hidden)

        # (1 unchanged block hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

ここで定義していたロールは {role name} = {fargate profile role name} となっていました。「同じロールなのでどちらかが削除されても問題ない」という判断でこの変更を terraform apply します。特に aws-auth の変更自体は問題ありません。 ただ、この後にこのロールを使用している Fargate Profile を使用したサービスの Pod を立ち上げようとすると・・・。

Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  53s   fargate-scheduler  Misconfigured Fargate Profile: fargate profile {fargate profile name} blocked for new launches due to: Pod execution role is not found in auth config or does not have all required permissions for launching fargate pods.

このような Warning が出て Pod が起動しなくなります。


すでに aws-auth で管理されているロールでも同じとはいえ削除されると Pod の起動に影響が出ることがわかりました(ロールは同じだが system:node:{{SessionName}} で区別されている)。

そのためこのロールを yaml に追加し terraform apply -refresh-only で実際のリソースと同期して変に修正されたり削除されないように対応を行いました。その後、同じ事象は発生していません。

aws-auth を terraform で管理する場合、 fargate profile が自動で追加するロールに関してもしっかりコード管理できるようにするべきという反省を今回得られました。

みらい翻訳ではSREを募集しています

EKS の構築・運用に興味がある方、その他運用改善など SRE に興味がある方を募集しております。 ご興味がおありの方は下記のリンクからご応募・お問い合わせをお待ちしております。

miraitranslate.com