eksctl でクラスター作成しようとしたら RequestError が出た

記事タイトルとURLをコピーする

技術5課の松尾です。地元仙台にUターンで戻ってきて、今月から仙台オフィスで勤務しています。年末にはナメタガレイを食べました。 AWS初心者の私がEKSをeksctlでクラスターを作成しようとして、初心者ならではの凡ミスでのエラーを出してしまった際の小ネタです。

eksctlのインストール

まずはeksctlを使えるようにしました。 ドキュメントに沿ってeksctlのインストールをしました。 一通り終わったら、以下コマンドでeksctlがインストールされたか確認します。

$ eksctl version
[ℹ] version.Info{BuiltAt:"", GitCommit:"", GitTag:"0.11.1"}

バージョンが表示され、インストールが成功しました。

eksctlでクラスターを構築しようとした

以下コマンドでEKSクラスターを構築します。

$ eksctl create cluster \
--name クラスタ名 \
--version 1.14 \
--nodegroup-name ノードグループ名 \
--node-type インスタンスタイプ \
--nodes ノード数 \
--nodes-min 最小ノード数 \
--nodes-max 最大ノード数 \
--managed

すると、、、なんということでしょう! エラーがモリモリと出力されました。

[ℹ]  eksctl version 0.11.1
[ℹ]  using region us-west-2
[!]  retryable error (RequestError: send request failed
caused by: Put http://169.254.169.254/latest/api/token: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)) from ec2metadata/GetToken - will retry after delay of 35.680593ms
[!]  retryable error (RequestError: send request failed
caused by: Put http://169.254.169.254/latest/api/token: dial tcp 169.254.169.254:80: connect: host is down) from ec2metadata/GetToken - will retry after delay of 112.67894ms
[!]  retryable error (RequestError: send request failed
caused by: Put http://169.254.169.254/latest/api/token: dial tcp 169.254.169.254:80: connect: host is down) from ec2metadata/GetToken - will retry after delay of 188.116616ms
[!]  retryable error (RequestError: send request failed
caused by: Put http://169.254.169.254/latest/api/token: dial tcp 169.254.169.254:80: connect: host is down) from ec2metadata/GetToken - will retry after delay of 396.575112ms
[!]  retryable error (RequestError: send request failed
caused by: Put http://169.254.169.254/latest/api/token: dial tcp 169.254.169.254:80: connect: host is down) from ec2metadata/GetToken - will retry after delay of 677.903216ms
[!]  retryable error (RequestError: send request failed
caused by: Put http://169.254.169.254/latest/api/token: dial tcp 169.254.169.254:80: connect: host is down) from ec2metadata/GetToken - will retry after delay of 1.724015264s
retryable error (RequestError: send request failed caused by: Put http://169.254.169.254/latest/api/token: dial tcp 169.254.169.254:80: connect: host is down

と出力されているので、169.254.169.254 と通信できていないことによるエラーのようです。

169.254.169.254 って何?

169.254.169.254 とは何者なのか、、ということでドキュメントを確認しました。 169.254.169.254 は、インスタンスメタデータを取得できる URI でした。

次に、インスタンスメタデータとは何者か、、ということでドキュメントを確認しました。 インスタンスメタデータは、インスタンスに関するデータでした。

ということは、出力されたエラーはeksctl実行時にインスタンスメタデータの取得に失敗しているというエラーのようです。 「[ℹ] using region us-west-2」と出力された後に、169.254.169.154 と通信できていないことから、環境変数に誤りがあることを疑ってみました。

環境変数を改めて設定

私の環境では現在2つの名前付きプロファイルがあります。 使用したいプロファイルの環境変数が設定されていないのでは、と考え、以下コマンドで使用したいプロファイルの環境変数を改めて設定しました。

export AWS_PROFILE=ユーザー名

次に、eksctlコマンド実行時にエラーが出ないかを以下コマンドで確認してみました。

$ eksctl get cluster
No clusters found

エラー無く、実行結果が返ってきました。

eksctlでクラスターを構築

再度、以下コマンドでEKSクラスターを構築します。

$ eksctl create cluster \
--name クラスタ名 \
--version 1.14 \
--nodegroup-name ノードグループ名 \
--node-type インスタンスタイプ \
--nodes ノード数 \
--nodes-min 最小ノード数 \
--nodes-max 最大ノード数 \
--managed

すると、、今回は順調に構築が開始されました!

[ℹ]  eksctl version 0.11.1
[ℹ]  using region us-east-2
[ℹ]  setting availability zones to [us-east-2b us-east-2c us-east-2a]
[ℹ]  subnets for us-east-2b - public:x.x.x.x/19 private:x.x.x.x/19
[ℹ]  subnets for us-east-2c - public:x.x.x.x/19 private:x.x.x.x/19
[ℹ]  subnets for us-east-2a - public:x.x.x.x/19 private:x.x.x.x/19
[ℹ]  nodegroup "xxx-xxx-xxx" will use "ami-xxxxxxxx" [AmazonLinux2/1.14]
[ℹ]  using Kubernetes version 1.14
[ℹ]  creating EKS cluster "xxxx-xxx" in "us-east-2" region with un-managed nodes
〜snip〜

しばらく眺めていましたが、構築完了までに結構時間がかかりそうだったので他の作業をしました。 ランチ前や業務終了間際に実行すると良いかもしれません。

構築が完了したので、以下コマンドでクラスター一覧を確認しました。

$ eksctl get cluster
NAME        REGION
xxxxx-xxx   us-east-2

kubectlコマンドでservice一覧も取得できました。

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

環境変数って大事

環境変数の誤りという初歩的な間違いで、しょうもない箇所で躓いてしまいました。 環境変数って大事!