[アップデート]EKSを使う際にaws-iam-authenticatorが不要になりました!

はじめに

おはようございます、加藤です。先日、EKSのドキュメントヒストリを眺めているとある変更がありました。

Document History for Amazon EKS - Amazon EKS

Change Description Date
AWS CLI get-token command The aws eks get-token command was added to the AWS CLI so that you no longer need to install the AWS IAM Authenticator for Kubernetes to create client security tokens for cluster API server communication. Upgrade your AWS CLI installation to the latest version to take advantage of this new functionality. For more information, see Installing the AWS Command Line Interface in the AWS Command Line Interface User Guide. May 10, 2019

とりあえず、読めないのでGoogle先生の力を借ります。

aws eks get-tokenコマンドがAWS CLIに追加されたため、クラスターAPIサーバー通信用のクライアントセキュリティトークンを作成するためにKubernetes用のAWS IAM Authenticatorをインストールする必要がなくなりました。
この新機能を利用するには、AWS CLIインストールを最新バージョンにアップグレードしてください。 詳細については、AWS Command Line Interfaceユーザーガイドの「AWS Command Line Interfaceのインストール」を参照してください。

AWS CLIに新しいコマンドが追加され、AWS IAM Authenticatorが不要になったようですね。

やってみた

AWS CLI

最新のAWS CLIがインストールされている必要があります。
私の環境は下記の通りです。

aws-cli/1.16.156 Python/3.7.3 Darwin/18.5.0 botocore/1.12.146

これより古い場合は、下記のドキュメントに従ってpip3からAWS CLIをインストールしてください。Homebrewで既にインストールされたAWS CLIがある場合は、brew uninstall or brew unlinkで対応してください。

Installing the AWS CLI - AWS Command Line Interface

kubeconfigの比較

aws eks update-kubeconfig --name ${CLUSTER_NAME}で、kubeconfigを再作成して比較してみました。

- name: arn:aws:eks:ap-northeast-1:${YOUR_ACCOUNT_ID}:cluster/${YOUR_CLUSTERNAME}
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      args:
      - token
      - -i
      - ${YOUR_CLUSTERNAME}
      command: aws-iam-authenticator
      env: null
users:
- name: arn:aws:eks:ap-northeast-1:${YOUR_ACCOUNT_ID}:cluster/${YOUR_CLUSTERNAME}
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      args:
      - eks
      - get-token
      - --cluster-name
      - ${YOUR_CLUSTERNAME}
      command: aws

args, command, env が変更になっていますね。新しい方だとaws-iam-authenticatorを使用せず、AWS CLIだけで完結しています。
新の方ではenvが省略されていますが、aws eks update-kubeconfigを使う際にプロファイルを指定すると、AWS_PROFILEが設定されました。

MFA問題は解消したか

EKSには、MFAが有効化されたアカウントでkubectlを叩くと毎回MFAを効かれるという問題がありました。流石に面倒すぎるので、今までは下記のブログに書いた方法で対処していました。

[超小ネタ] Amazon Elastic Container Service for Kubernetes(EKS)でkubectlする際に毎回MFAを求められて面倒なのを回避する

このアップデートを見た時、これ解決するんじゃね?と淡い期待を抱きました。
結果は残念ながら対応していませんでした...引き継ぎ上のブログに書いた方法で対処していきます。

Twitterでポジティブな Tori(@toricls)さんに教えて頂きましたが、今までも実はオプションを追加すれば、クレデンシャルキャッシュされたようです。これは目から鱗でした!

さらにさらに!新しい方式でもクレデンシャルキャッシュを使えるように、bashスクリプトを公開されています。
前述したdirenv, assume-roleを使った一時クレデンシャルを生成する方法が合わない方はこちらを利用すると幸せになれますね!

なにが嬉しいのか?

このアップデートによって改善されたのは、aws-iam-authenticatorをインストールしなくて良いという一点だけです。
ローカル端末からkubectlを叩いているシチュエーションでは、インストールはそこまで手間では無く、大きな変化はないと考えています。しかし、下記のブログのようにCodeBuildからkubectlを叩いている場合は結構嬉しいです。

aws-auth ConfigMapをEKSクラスタにCodeシリーズで自動デプロイする仕組みを構築してみた

上記ブログから抜粋しますが、下記はkubectlを叩く為のDockerfileです。

FROM alpine:3.8
 
# install AWS CLI
ENV AWS_CLI_VERSION 1.16.26
RUN apk --update --no-cache add \
        python \
        py-pip \
        && \ 
    pip install --upgrade awscli==${AWS_CLI_VERSION} && \
    apk -v --purge del py-pip
 
# install kubectl
ENV KUBECTL_VERSION 1.11.3
RUN wget -O /usr/local/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/linux/amd64/kubectl && \
    chmod +x /usr/local/bin/kubectl
 
# install AWS IAM Authenticator
ENV AWS_IAM_AUTHENTICATOR_RELEASE_DATE 2018-07-26
ENV AWS_IAM_AUTHENTICATOR_VERSION 1.10.3
RUN wget -O /usr/local/bin/aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/${AWS_IAM_AUTHENTICATOR_VERSION}/${AWS_IAM_AUTHENTICATOR_RELEASE_DATE}/bin/linux/amd64/aws-iam-authenticator && \
    chmod +x /usr/local/bin/aws-iam-authenticator

AWS CLI, kubectl, aws-iam-authenticatorの3つをインストール、そしてバージョンアップし続ける必要がありますね。
aws-iam-authenticatorが不要になるので、数十MBコンテナ容量が小さくなりバージョン管理の手間が軽減されます。細かいですが、このアップデートの嬉しさはこういうところかなと感じました。

あとがき

劇的なアップデートという訳では無いですが、こういう細かい所も改善してくれるのはとても嬉しいですね。個人的感想ですが、AWSはEKSに力を入れているんだなーと改めて感じました。
また、公式ドキュメントとして、eksctlを使った場合のGetting Startedも公開されドンドンドキュメントや機能が充実していくなーと感じる日々です。

Getting Started with eksctl - Amazon EKS

以上でした!