AWS CodeBuildからAmazon EKS APIへのアクセス認証エラー対処
AWS CodeBuildからAmazon EKS APIへのアクセス認証エラーの原因と解決方法を詳しく解説。ConfigMapへのIAMロールの追加手順やCloudWatchログのトラブルシューティング方法を紹介しています。
目次
はじめに
AWS CodePipelineからAmazon EKSに対して、CI/CDをおこなう機会があり、AWS CodeBuild処理時にEKSクラスター API認証エラーとなり時間を溶かしましたので備忘録として記録します。
事象
AWS CodeBuildのビルド設定ファイルに次のコマンドを設定しており、エラーになっている状態です。
エラー例①
EKSクラスターへの認証情報が正しくない場合や、クラスターのAPIサーバへ到達できない場合に出るエラーメッセージとなります。
kubectl apply -f deployment.yaml
error: error validating "deployment.yaml": error validating data: failed to download openapi: the server has asked for the client to provide credentials; if you choose to ignore these errors, turn validation off with --validate=false
エラー例②
EKSクラスターAPIサーバへのリクエストが認証に失敗したことを示しており、認証情報の不足やアクセス権限の不足が疑われます。
kubectl get pods --v=9
[
{
"metadata": {},
"status": "Failure",
"message": "the server has asked for the client to provide credentials",
"reason": "Unauthorized",
"details": {
"causes": [
{
"reason": "UnexpectedServerResponse",
"message": "unknown"
}
]
},
"code": 401
}
]
→※抜粋して記載しております。
前提条件
-
認証情報設定
aws eks update-kubeconfig --region {リージョン名} --name {クラスター名}
コマンドが成功している状態とします。
- CodePipelineでCodeBuildを使用していることを前提とします。
- EKSクラスターの作成はすでにおこなわれている状態とします。
調査
Amazon EKS API サーバーの不正サーバーエラーの解決 | AWS re:Post
注:Amazon EKS オーセンティケーターログを有効にします。 このクエリは、クラスター作成者としてマッピングされた IAM エンティティを返します:
上記サイトに記載の通り、Amazon EKSオーセンティケーターログを確認することで解決の糸口が分かりますのでこちらのログを確認します。
ログはCloudWatchログに次のような形式で吐かれます。
- CloudWatchロググループ名:
/aws/eks/{クラスター名}/cluster
- ログストリーム名:
authenticator-{変動する文字羅列}
次のような形で認証エラーに関するログが吐かれることを確認しました。
見やすくするため加工しております。
このエラーメッセージは、EKSクラスターの認証に問題が発生していることを示しており、CodeBuildにアタッチしているIAMロール(mysystem-codebuild-role
)がEKSクラスターのアクセス権限マッピングに含まれていない為、出ています。
denied"
arn="arn:aws:iam::{AWSアカウント12桁}:role/mysystem-codebuild-role"
client="127.0.0.1:38884"
error="Identity
is
not
mapped"
method=POST
path=/authenticate
対処
原因が分かりましたので対処します。
CodeBuildのサービスロールをRBACユーザーにマッピングします。
ここで言うと、configMapにあります、aws-auth
へ記載するようにします。
-
参考記事
-
- CodeBuild のサービスロールを Kubernetes RBAC ユーザーにマッピングします。EKS クラスターを接続したターミナル Cloud9 から、次のコマンドを使用して、configMap aws-auth に IAM ロール eks-CodeBuildServiceRole の正しいエントリがあることを確認します。
-
Amazon EKS API サーバーの不正サーバーエラーの解決 | AWS re:Post
注:Amazon EKS オーセンティケーターログを有効にします。
このクエリは、クラスター作成者としてマッピングされた IAM エンティティを返します:
-
念の為、参考記事を記載しておます。
とても参考になりますのでお時間のある方は覗いてみてください。
kubectl edit -n kube-system configmap/aws-auth
こちらのコマンドを使用してマッピングします。
追記箇所を分かりやすく示しておりますので、ご参考ください。
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
mapRoles: |
- groups:
- system:bootstrappers
- system:nodes
- system:node-proxier
rolearn: arn:aws:iam::{awsアカウント12桁}:role/mysystem-eks-fargate-pod-execution-role
username: system:node:{{SessionName}}
- groups:
- eks-console-dashboard-full-access-group
rolearn: arn:aws:iam::{awsアカウント12桁}:role/test-role
username: test-iam-role
# ===========================================================================================
# ここから↓
- groups:
# master にマッピングしないと権限エラーになるので注意。
- system:masters
# CodeBuild のロールを指定する。
rolearn: arn:aws:iam::{awsアカウント12桁}:role/mysystem-codebuild-role
username: mysystem-codebuild-role
# ここまで追記↑
# ===========================================================================================
mapUsers: |
- groups:
- eks-console-dashboard-full-access-group
userarn: arn:aws:iam::{awsアカウント12桁}:user/test-user
username: test-iam-user
kind: ConfigMap
metadata:
creationTimestamp: "2024-11-27T00:15:47Z"
name: aws-auth
namespace: kube-system
resourceVersion: "3922938"
uid: 15ca1b80-ea0d-41cc-94ce-29612300d2a8
動作確認
CodeBuildを発火させ、冒頭に記載したapplyコマンドやgetコマンドでエラーなく通れば問題ありません。
それぞれのログは見やすく加工しております。
調査解説部分で記載しております、Amazon EKSオーセンティケーターログを再度確認し次のようなログが吐かれていることを確認します。
time="2024-12-07T12:29:05Z"
level=info
msg="access
granted"
arn="arn:aws:iam::{awsアカウント12桁}:role/mysystem-codebuild-role"
client="127.0.0.1:36628"
groups="[system:masters]"
method=POST
path=/authenticate
uid="aws-iam-authenticator:{awsアカウント12桁}:AROA2AKHZ2S5YWUTHZL7A"
username=mysystem-codebuild-role
また、CodeBuildのIAMロールに対してEKSクラスターへのIAMロール引き受けを許可している設定をIAMロールへおこなっている為、次のログも確認しています。
time="2024-12-07T12:29:05Z"
level=info
msg="STS
response"
accesskeyid=ASIA2AKHZ2S5XMHJMHRA
accountid={awsアカウント12桁}
arn="arn:aws:sts::{awsアカウント12桁}:assumed-role/mysystem-codebuild-role/AWSCodeBuild-3e19932d-afa7-4ad6-9e90-4e25075cfbfa"
client="127.0.0.1:36628"
method=POST
path=/authenticate
session=AWSCodeBuild-3e19932d-afa7-4ad6-9e90-4e25075cfbfa
userid=AROA2AKHZ2S5YWUTHZL7A
まとめ
CodeBuildのIAMロール設定をしただけでは、EKSクラスターで持っている認証情報で弾かれるためちゃんと両方設定しないといけないということが分かりました。
今年ももう年の瀬に近づいてきましたね。
時が経つのは早いものです。