ヤマムギ

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

  関連記事

AWS Lambdaで「Process exited before completing request」

AWS lambdaで「Process exited before comple …

Lambdaバージョンとエイリアスとトリガー

Lambdaのバージョン、エイリアスにはそれぞれ別のトリガーが設定できます。 上 …

Amazon EC2(Amazon Linux 2)にRedmine3.4をインストール

久しぶりに新しい環境でRedmineを構築したくなり、せっかくなのでAmazon …

AWS複数アカウントのリソースをLambda(Python)から一括操作したくて

AWSの複数アカウント(30ちょい)のリソースをまとめて自動処理したくて。 とり …

AWS Storage Gatewayボリュームゲートウェイを作成してWindowsから使用

ボリュームゲートウェイの作成 Storage Gateway作成メニューからボリ …

Amazon RDS MySQLでCSVをload data するときに「Access denied」発生

超小ネタです。 AWSのデータベースサービスの Amazon RDSのMySQL …

API Gateway Lambdaプロキシ統合で渡されるリクエストを確認しました

API Gatewayの統合リクエストでLambdaを指定するときにプロキシ統合 …

WordPressの年ごとのブログ投稿数を調べるSQL

毎年年末に使いそうなのでメモです。 [crayon-6640eeaa600d18 …

AWS DeepLens開封の儀

去年(2019年)7月にamazon.co.jpでDeepLens買えますやんっ …

AWS License ManagerでAMIからインスタンスの起動を制御

EC2 Image BuilderでRocket.ChatのAMIを作って起動テ …