【解決方法】Amazon EKSで`kubectl get svc`コマンドに失敗する

# 問題

Amazon EKSでクラスター作成後に`kubectl get svc`コマンドを実行しても失敗する

```shell-session
# Amazon EKSクラスターのkubeconfigを取得→成功
$ aws eks update-kubeconfig --name <cluster_name>
Added new context arn:aws:eks:us-west-2:xxxxx:cluster/<cluster_name> to /Users/<username>/.kube/config

# 失敗するコマンド
$ kubectl get svc
error: the server doesn't have a resource type "svc"
```

# 原因
EKSクラスタを作成したIAMユーザとAWS CLIのIAMユーザが異なっている

@ngyuki さんに情報をご提供いただきました🙇‍♂️

> 参考：[Amazon EKS の使用開始 \- Amazon EKS](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html#eks-create-cluster)
> コンソールを使用してクラスターを作成する場合は、クラスター上で kubectl コマンドを実行する際、同じ IAM ユーザー認証情報が AWS SDK 認証情報チェーンにあることを確認する必要があります。

# 解決方法

パターン1. AWS CLIのIAMユーザをEKSクラスタを作成したユーザに切り替える
パターン2. AWS CLIのIAMユーザでEKSクラスタを作り直す（[CLIでEKSクラスタを作り直す手順はこちら](https://qiita.com/NaokiIshimura/items/60f90d9d925ca2b103bb#1-aws-cli%E3%81%8B%E3%82%89eks%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)）

> 補足
> rootアカウントでの操作は非推奨([参考](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_root-user.html))のため、rootアカウントでログインしたコンソールでEKSクラスタを作成した場合は、EKSクラスタを削除して、別のユーザでEKSクラスタを作り直したほうがよいと思われます

---

# 以下は原因が不明だったときの解決方法です

ここより下の内容は原因が不明だったときに投稿した解決方法です。

# 調査

海外のフォーラムやブログなどで紹介されていた解決方法
もっとスマートな解決方法がありましたらご教示くださいm(_ _)m

解決方法 | 結果
:--- | :---
1. AWS CLIからEKSクラスターを作成する | ○：解決できた
2. AWS CLIにIAMを設定する | ×：解決しなかった
3. kubectlのバージョンを更新する | ×：解決しなかった
4. aws-iam-authenticatorを設定する | ×：解決しなかった

# 解決できた手順

## 1. AWS CLIからEKSクラスターを作成する

EKSクラスターをコンソールから作成すると本問題が発生していたが、AWS CLIからEKSクラスターを作成すると解決したとの情報を見かけて、実践したところ解決できた。

> 補足
> CloudFormationで作成したクラスターでも同様の問題が発生するようです
> コメント欄にて @ishigero さんから情報をご提供いただきました m(_ _)m

参考：[Amazon EKS の使用開始 \- Amazon EKS](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html)

### 手順1. 既存クラスターの設定を確認

AWSのコンソール上で作成したクラスターの

- Role ARN
- Subnets
- security groups

をメモしておく

![eks01.png](https://qiita-image-store.s3.amazonaws.com/0/141934/88bdffff-e2cb-4cef-9dff-8c3fd39fac67.png)

### 手順2. AWS CLIからクラスターを作成する

メモした情報を参考にAWS CLIからクラスターを作成する

> 補足
> `--role-arn`には**Role ARN**の値を指定する
> `--resources-vpc-config`には**Subnets**,**Security groups**の値を指定する

```shell-session
$ aws eks create-cluster --name <cluster_name> \
   --role-arn xxx \
   --resources-vpc-config \
   subnetIds=subnet-xxx,subnet-xxx,securityGroupIds=sg-xxx

{
    "cluster": {
        "status": "CREATING",
        "name": "<cluster_name>",
        "certificateAuthority": {},
        "roleArn": "xxx",
        "resourcesVpcConfig": {
            "subnetIds": [
                "subnet-xxx",
                "subnet-xxx"
            ],
            "vpcId": "vpc-xxx",
            "securityGroupIds": [
                "sg-xxx"
            ]
        },
        "version": "1.10",
        "arn": "arn:aws:eks:us-west-2:xxx:cluster/<cluster_name>",
        "platformVersion": "eks.2",
        "createdAt": xxx
    }
}
```

### 手順3. クラスターが作成されたことを確認

```shell-session
$ aws eks describe-cluster --name <cluster_name> --query cluster.status
"ACTIVE"
```

### 手順4. `kubectl get svc`コマンドが成功することを確認

```shell-session
# 作成したクラスターのkubeconfigを取得
$ aws eks update-kubeconfig --name <cluster_name>
Updated context arn:aws:eks:us-west-2:xxx:cluster/<cluster_name> in /Users/<username>/.kube/config

$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   3m
```

---

# 解決できなかった手順

## 2. AWS CLIにIAMを設定する

AWS CLIにIAMが設定されてないと本問題が発生するという情報を見かけたが、AWS CLIからAmazon EKSクラスターのkubeconfigが取得できることから、AWS CLIの設定は問題ないと判断した。

```shell-session
aws configure
AWS Access Key ID [****************WVJA]:
AWS Secret Access Key [****************LD/m]:
Default region name [us-west-2]: 
Default output format [None]:
```

```shell-session
# Amazon EKSクラスターのkubeconfigを取得→成功
$ aws eks update-kubeconfig --name <cluster_name>
Added new context arn:aws:eks:us-west-2:xxxxx:cluster/<cluster_name> to /Users/<username>/.kube/confi
```

## 3. kubectlのバージョンを更新する

kubectlのバージョンが1.10.xx以上じゃないと問題が発生するという情報を見かけたが、バージョンは問題ないと判断した。

```shell-session
$ kubectl version --short --client
Client Version: v1.10.3
```

参考：[kubectl のインストール \- Amazon EKS](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/install-kubectl.html)

## 4. aws-iam-authenticatorを設定する

aws-iam-authenticatorの設定が無いと問題が発生するという情報を見かけたが、設定は問題ないと判断した。

```shell-session
$ aws-iam-authenticator help
A tool to authenticate to Kubernetes using AWS IAM credentials
...
```

参考：[kubectl を Amazon EKS 用に設定します。 \- Amazon EKS](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/configure-kubectl.html)