ヤマムギ

growing hard days.

*

Introduction to Amazon EKS Workshopの記録

   

AWS Workshop StudioのIntroduction to Amazon EKSの手順を実行しました。
Workshopのコンテンツが消えた後でも見返せるようにやったことを記録しておきます。

リージョンはバージニア北部(us-east-1)で実行しました

作業環境作成

Cloud9の準備

  • Cloud9をt2.microでデフォルト値で作成しました。
  • Cloud9のAWS managed temporary credentialsは無効化。
  • Cloud9で使用するEC2向けのIAMロールはAWS管理ポリシーAdministratorAccessをアタッチしました。

アイデンティティの確認

ロールを引き受けていることを確認

デフォルトリージョンの設定

us-east-1を確認

ページャーの無効化

手順に従って

eksctlコマンドのインストール

バージョン 0.165.0を確認

kubectlコマンドのインストール

インストール結果を確認

Client Version: v1.28.1-eks-43840fb
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3

クラスターの作成

EKS cluster “ekshandson” in “us-east-1” region is readyとなるまでだいたい15分でした。

マネジメントコンソールを見ると、ekshandsonクラスターができていて、ノードグループは3つのEC2インスタンスが指定したアベイラビリティゾーンで起動させるオートスケーリンググループで起動していました。

Control Planeはマネージドで見えなくて、Data PlaneはEC2を使用しているので、3つのノードとしてのインスタンスが見えています。
Control Planeが実行されたkubectlコマンドを受けて、ノード上でpodとしてコンテナを実行します。

デフォルトの名前空間とpod

デフォルトで4つの名前空間ができています。
* default
* kube-node-lease
* kube-public
* kube-system

kube-systemには3つのノードを使ってpodがいくつかできています。

ツール導入とコマンド補完設定

  • jq(jsonデータ処理)、bas-completion(コマンド補完)のインストール

  • docker composeの導入

  • kubectlのコマンド補完

  • eksctlのコマンド補完

  • dockerコマンド補完

  • k=kubectlのエイリアス設定

  • kube-ps1の導入

  • kubectxとkubensの導入

  • sternの導入

  • 設定の読み込み直し

サンプルアプリのデプロイ

3層のアプリケーションがサンプルで用意されていたのでデプロイしてみました。

DynamoDBテーブルの作成

マネジメントコンソールで作成しました。

テーブル名: messages
パーティションキー: uuid 文字列
オンデマンドモード

Dockerイメージの作成

sample-app.zipにはbackendとfrontendディレクトリがあり、それぞれにDpckerfile、app.py、requirements.txt、frontendのみtemplats/home.htmlがありました。

それぞれのDockerfileです。

frontend

backend

docker imagesコマンドで2つのイメージが作成されていることを確認しました。

ECRリポジトリの作成とイメージの登録

frontend用backend用それぞれのECRリポジトリを作成して、URIを変数にセットしました。

docker tagコマンドでリポジトリURIの別名を設定して、ECRにログインして、イメージをプッシュしました。

frontendアプリのデプロイ

作業用ディレクトリの準備

frontendアプリ用の名前空間を作成して切り替え

Deploymentマニフェストの作成

環境変数BACKEND_URLは、frontendのapp.pyから使用しています。

Deploymentの作成

Deploymentリソースを作成したことで、ReplicaSetが作成されて、ReplicaSetリソースによってPodが作成されました。

Serviceマニフェストの作成

type: LoadBalancerとすることで、デフォルトでClassic Load Balancerがデプロイされます。

Serviceの作成

Classic Load BalancerのDNSにブラウザからアクセスすると、frontendアプリにアクセスできます。
まだbackendアプリがないので、アプリが画面にエラーを出力してくれています。

backendアプリのデプロイ

frontend同様に、名前空間を作成、Deploymentマニフェストを作成、Deploymentを作成、Serviceマニフェストを作成、Serviceを作成しました。

backend名前空間を作成して切り替え

Deploymentマニフェストを作成

Deploymentを作成

Serviceマニフェストを作成

Serviceを作成

backendアプリができたので、ブラウザから確認するとメッセージが変わりました。

backendアプリのログを確認します。

botocore.exceptions.ClientError: An error occurred (AccessDeniedException) when calling the Scan operation: User: arn:aws:sts::123456789012:assumed-role/eksctl-ekshandson-nodegroup-ng-a21-NodeInstanceRole-Fkpspxkl2U2G/i-0aa365d55cd4db129 is not authorized to perform: dynamodb:Scan on resource: arn:aws:dynamodb:us-east-1:123456789012:table/messages because no identity-based policy allows the dynamodb:Scan action

DynamoDBテーブルに対してscanの権限がないというエラーです。

IAM Roles for Service Accountsを使用してアプリケーションにIAMロールを付与する。

OIDCプロバイダーの作成

IAMにOpenID Connectプロバイダが作成されました。

IAMポリシーの作成

IAMロールとServiceAccountの作成

CloudFromationスタックによってIAMロールとServiceAccountが作成されました。

名前空間backendに作成されたbackend-dynamodb-accessというServiceAccountに関連づいているIAMロールはOpenID ConnectプロバイダをからAssumeRoleが実行されています。

IAMロールの信頼ポリシー

Deploymentの修正

specにserviceAccountName: backend-dynamodb-accessの行を追加しました。

修正を適用しました。

ポッドが起動し直されます。

できました!!!

クリーンアップ

IAMロール、ServiceAccount、frontend、bakend名前空間、IAMポリシーを個別に削除して、クラスターをまとめて削除。
ECRリポジトリは私はまた使うのでとりあえず置いておきました。

アプリなどを削除するときに名前空間でまとめて削除できるのは便利ですね。


最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。

 - AWS , ,

ad

ad

  関連記事

「JAWS-UG 名古屋 2022年 “re:Invent”の復習~忘年会~」に参加しました

re:Inventのおみやげも飲み物、ピザ、お寿司もたくさん。 コラボベースさん …

Cloud9でAWS CDK環境

最初ローカルに作ろうと思ったのですが、環境依存がというか、Macbookの環境で …

Amazon ECSサービスでAWS App Meshを使用

AWS App MeshユーザーガイドのAWS App Mesh とAmazon …

slackのbotに天気を教えてもらう(Python on AWS Lambda + API Gateway)

slackのbotにAPIの定番ともいえる天気情報を教えてもらいました。 環境は …

Amazon Aurora Serverless 課金確認

Amazon Aurora Serverlessを使い始めてみましたの記事で書い …

AWS Organizationsからアカウントを新規作成してみて

AWS Organizationsでアカウントを新規作成することがありましたので …

API GatewayからLambdaを介さずにSNSトピックへ送信

やりたいこと APIリクエストをまずLambdaで受けて、SNSトピックへ送信す …

Amazon Elasticsearch ServiceにMySQLのデータを投入してkibanaで可視化してみる

MySQLのデータの可視化にAmazon Elasticsearch Servi …

AWSアカウントルートユーザーのMFAでYubicoセキュリティキーを設定した

先日Yubico セキュリティキーを購入して、USBにささなければならないのがな …

EC2 Auto ScalingカスタムメトリクスのモニタリングにCloudWatch検索式が便利でした

EC2 Auto Scalingで起動したインスタンスのカスタムメトリクス この …