「Amazon EKS Workshop」の環境準備とクラスター作成
今はアーカイブになっている1つ前のEKS Workshopの環境準備記録です。
こちらのワークショップパターンがいろいろあるので好きです。
そのうちページがなくなるかもですので、残せるものは残しておきたいと思います。
目次
Cloud9環境
以下の設定で構築しました。
* EC2
* Amazon Linux2023
* t3.small
* 接続: SSM
ツールのインストール
kubectlのインストール
1 2 3 4 5 |
sudo curl --silent --location -o /usr/local/bin/kubectl \ https://s3.us-west-2.amazonaws.com/amazon-eks/1.21.5/2022-01-21/bin/linux/amd64/kubectl sudo chmod +x /usr/local/bin/kubectl |
awscliのアップデート
1 2 3 4 |
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install |
jq、envsubset、bash-completionのインストール
1 2 |
sudo yum -y install jq gettext bash-completion moreutils |
yqのインストール
1 2 3 4 |
echo 'yq() { docker run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@" }' | tee -a ~/.bashrc && source ~/.bashrc |
パスの確認
1 2 3 4 5 |
for command in kubectl jq envsubst aws do which $command &>/dev/null && echo "$command in path" || echo "$command NOT FOUND" done |
正常な出力は以下です
kubectl in path
jq in path
envsubst in path
aws in path
kubectlのbash-completionによる自動補完の有効化
1 2 3 4 |
kubectl completion bash >> ~/.bash_completion . /etc/profile.d/bash_completion.sh . ~/.bash_completion |
AWS Load Balancer Controllerのバージョン固定
1 2 3 4 |
echo 'export LBC_VERSION="v2.4.1"' >> ~/.bash_profile echo 'export LBC_CHART_VERSION="1.4.1"' >> ~/.bash_profile . ~/.bash_profile |
Cloud9の認証設定
EC2向けのIAMロール作成と設定
Cloud9を実行しているEC2向けのIAMロールを作成しました。
手順に従ってAWS管理ポリシーのAdministratorAccessを許可ポリシーとして設定しました。
Cloud9のEC2に作成したIAMロールを設定しました。
Cloud9デフォルトのManaged Temporary Credentialsを無効化
1 2 3 |
aws cloud9 update-environment --environment-id $C9_PID --managed-credentials-action DISABLE rm -vf ${HOME}/.aws/credentials |
Managed Temporary Credentialsを無効化して.aws/credentialsを削除しています。
Managed Temporary Credentialsは設定メニューからも無効化できます。
環境変数にアカウントID、リージョン、アベイラビリティゾーンを設定
1 2 3 4 5 |
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` export AWS_REGION=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region') export AZS=($(aws ec2 describe-availability-zones --query 'AvailabilityZones[].ZoneName' --output text --region $AWS_REGION)) |
手順はIMDSv1ですので、IMDSv2向けのコマンドに変えて実行しています。
1 2 |
test -n "$AWS_REGION" && echo AWS_REGION is "$AWS_REGION" || echo AWS_REGION is not set |
確認コマンドの結果
リージョンコード(us-east-1はリージョンによって異なります。
AWS_REGION is us-east-1
1 2 3 4 5 6 |
echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile echo "export AZS=(${AZS[@]})" | tee -a ~/.bash_profile aws configure set default.region ${AWS_REGION} aws configure get default.region |
bash_profileに保存しました。
リポジトリのクローン
1 2 3 4 5 |
cd ~/environment git clone https://github.com/aws-containers/ecsdemo-frontend.git git clone https://github.com/aws-containers/ecsdemo-nodejs.git git clone https://github.com/aws-containers/ecsdemo-crystal.git |
KMSカスタマー管理キーの作成
1 2 3 4 |
aws kms create-alias --alias-name alias/eksworkshop --target-key-id $(aws kms create-key --query KeyMetadata.Arn --output text) export MASTER_ARN=$(aws kms describe-key --key-id alias/eksworkshop --query KeyMetadata.Arn --output text) echo "export MASTER_ARN=${MASTER_ARN}" | tee -a ~/.bash_profile |
暗号化キーを作成して環境変数にARNを設定して、bash_profileに保存しています。
eksctlのインストール
1 2 3 4 |
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp sudo mv -v /tmp/eksctl /usr/local/bin |
1 2 |
eksctl version |
バージョンを確認するとバージョン番号だけが返ってきます。
1 2 3 4 |
eksctl completion bash >> ~/.bash_completion . /etc/profile.d/bash_completion.sh . ~/.bash_completion |
補完を有効にします。
最初のクラスターの作成
クラスターの作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
cat << EOF > eksworkshop.yaml --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: eksworkshop-eksctl region: ${AWS_REGION} version: "1.30" availabilityZones: ["${AZS[0]}", "${AZS[1]}"] managedNodeGroups: - name: nodegroup desiredCapacity: 2 instanceType: t3.small spot: true ssh: enableSsm: true secretsEncryption: keyARN: ${MASTER_ARN} EOF |
eksworkshop.yamlを作成しました。
versionは最新にしています。
ノードでスポットインスタンスを使用したかったのでspot: trueにしています。
手順は3つのAZでしたが、2つにしています。
1 2 |
eksctl create cluster -f eksworkshop.yaml |
クラスターの作成を開始しました。
15分弱でクラスターとノードグループの作成が完了しました。
CloudFormationではクラスターとノードグループのスタック作成が完了していました。
EKSでもクラスターがアクティブになっていました。
1 2 |
kubectl get nodes |
Cloud9でコマンドで確認するとノードが2つ表示されました。
NAME STATUS ROLES AGE VERSION
ip-192-168-22-34.ec2.internal Ready
ip-192-168-33-113.ec2.internal Ready
kubeconfigの更新
kubeconfigを確認してみます。
1 2 |
kubectl config view |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://XXXXXXXXX.gr7.us-east-1.eks.amazonaws.com name: eksworkshop-eksctl.us-east-1.eksctl.io contexts: - context: cluster: eksworkshop-eksctl.us-east-1.eksctl.io user: i-032b2a62b94ab667b@eksworkshop-eksctl.us-east-1.eksctl.io name: i-032b2a62b94ab667b@eksworkshop-eksctl.us-east-1.eksctl.io current-context: i-032b2a62b94ab667b@eksworkshop-eksctl.us-east-1.eksctl.io kind: Config preferences: {} users: - name: i-032b2a62b94ab667b@eksworkshop-eksctl.us-east-1.eksctl.io user: exec: apiVersion: client.authentication.k8s.io/v1beta1 args: - eks - get-token - --output - json - --cluster-name - eksworkshop-eksctl - --region - us-east-1 command: aws env: - name: AWS_STS_REGIONAL_ENDPOINTS value: regional provideClusterInfo: false |
i-032b2a62b94ab667bはCloud9のEC2インスタンスです。
次のコマンドでeksworkshop-eksctlというユーザーを追加してデフォルトにしました。
1 2 |
aws eks update-kubeconfig --name eksworkshop-eksctl --region ${AWS_REGION} |
もう一度kubectl config viewで確認すると追加されていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://XXXXXXXXX.gr7.us-east-1.eks.amazonaws.com name: arn:aws:eks:us-east-1:079700436326:cluster/eksworkshop-eksctl - cluster: certificate-authority-data: DATA+OMITTED server: https://XXXXXXXXX.gr7.us-east-1.eks.amazonaws.com name: eksworkshop-eksctl.us-east-1.eksctl.io contexts: - context: cluster: arn:aws:eks:us-east-1:123456789012:cluster/eksworkshop-eksctl user: arn:aws:eks:us-east-1:123456789012:cluster/eksworkshop-eksctl name: arn:aws:eks:us-east-1:123456789012:cluster/eksworkshop-eksctl - context: cluster: eksworkshop-eksctl.us-east-1.eksctl.io user: i-032b2a62b94ab667b@eksworkshop-eksctl.us-east-1.eksctl.io name: i-032b2a62b94ab667b@eksworkshop-eksctl.us-east-1.eksctl.io current-context: arn:aws:eks:us-east-1:123456789012:cluster/eksworkshop-eksctl kind: Config preferences: {} users: - name: arn:aws:eks:us-east-1:079700436326:cluster/eksworkshop-eksctl user: exec: apiVersion: client.authentication.k8s.io/v1beta1 args: - --region - us-east-1 - eks - get-token - --cluster-name - eksworkshop-eksctl - --output - json command: aws env: null provideClusterInfo: false - name: i-032b2a62b94ab667b@eksworkshop-eksctl.us-east-1.eksctl.io user: exec: apiVersion: client.authentication.k8s.io/v1beta1 args: - eks - get-token - --output - json - --cluster-name - eksworkshop-eksctl - --region - us-east-1 command: aws env: - name: AWS_STS_REGIONAL_ENDPOINTS value: regional provideClusterInfo: false |
ROLE_NAME環境変数の設定
1 2 3 4 |
STACK_NAME=$(eksctl get nodegroup --cluster eksworkshop-eksctl -o json | jq -r '.[].StackName') ROLE_NAME=$(aws cloudformation describe-stack-resources --stack-name $STACK_NAME | jq -r '.StackResources[] | select(.ResourceType=="AWS::IAM::Role") | .PhysicalResourceId') echo "export ROLE_NAME=${ROLE_NAME}" | tee -a ~/.bash_profile |
AWS IAMユーザーへのクラスターへのアクセス権限追加
この時点ではマネジメントコンソールにサインインしているIAMユーザーやIAMロールにKubernetesクラスター内のオブジェクトへのアクセス権限がありません。
クラスターのアクセス設定をマネジメントコンソールで確認すると、「EKS APIとConfigMap」となっていました。
IAMアクセスエントリとConfigMapのaws-authの両方がKubernetesクラスターへのアクセスで有効になっています。
ワークショップの手順ではConfigMapとなっています。
ConfigMapで設定する場合
次のコマンドでCloud9環境を構築したIAMユーザー、またはIAMロールのARNをrolearn変数にセットします。
1 2 3 4 5 6 7 8 9 10 |
c9builder=$(aws cloud9 describe-environment-memberships --environment-id=$C9_PID | jq -r '.memberships[].userArn') if echo ${c9builder} | grep -q user; then rolearn=${c9builder} echo Role ARN: ${rolearn} elif echo ${c9builder} | grep -q assumed-role; then assumedrolename=$(echo ${c9builder} | awk -F/ '{print $(NF-1)}') rolearn=$(aws iam get-role --role-name ${assumedrolename} --query Role.Arn --output text) echo Role ARN: ${rolearn} fi |
次のコマンドでaws-auth ConfigMapにIAMロールとKubernetes system:mastersグループ、adminユーザーとのマッピングをaws-auth ConfigMapに追加します。
1 2 |
eksctl create iamidentitymapping --cluster eksworkshop-eksctl --arn ${rolearn} --group system:masters --username admin |
IAMアクセスエントリで設定する場合
[IAMアクセスエントリの作成]を押下して、IAMプリンシパルARNにIAMユーザー、IAMロールのARNを入力してスタンダードを選択しました。
ユーザーとグループは指定していません。
ユーザーは自動で新規作成されます。
アクセス権限と範囲はアクセスポリシーとスコープで設定します。
今回はクラスター全体としました。
指定したIAMロールでマネジメントコンソールからオブジェクトを確認できるようになりました。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
NATインスタンスを作成する
プライベートサブネットのEC2インスタンスからカスタムメトリクスとCloudWa …
-
RDSスナップショットのS3エクスポート結果確認
RDSのスナップショットをS3へエクスポートが日本語マネジメントコンソールでもで …
-
Amazon Connectから問い合わせ追跡レコード(CTR)をエクスポート
Amazon Connectから発信した電話に出たのか、出なかったのかを確認した …
-
API Gateway Lambdaプロキシ統合で渡されるリクエストを確認しました
API Gatewayの統合リクエストでLambdaを指定するときにプロキシ統合 …
-
Amazon EMR 「Hadoop を使用してビッグデータを分析」チュートリアルをやってみました
AWS認定データアナリティクス受験準備の一環で、Amazon EMRのチュートリ …
-
AWS Systems Manager セッションマネージャを使用するために必要な設定
AWS Systems Manager セッションマネージャを使用するために必要 …
-
CloudWatch LogsメトリクスフィルタでNginxのaccess_logから転送バイト数をモニタリングする
ユーザーガイドのApache ログからのフィールドの抽出を見てて、これ、Ngin …
-
GoogleForm,GASからAPI Gateway, Lambdaで入力情報をDynamoDBに格納する
vol.26 AWS認定試験テキスト認定クラウドプラクティショナーのデモ(Dyn …
-
AWSアカウント内のLambda関数を削除するLambda(Python)
やりたいこと 特定のAWSアカウントの特定リージョンのAWS Lambda関数を …
-
SIEM on Amazon OpenSearch Serviceを構築
このブログまわりのモニタリングをSIEM on Amazon OpenSearc …