ヤマムギ

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認定クラウドプラクティショナー 改訂第2版」という本を書きました。

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

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

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

 - AWS , ,

ad

ad

  関連記事

ALBにWAFを関連付けて特定のヘッダー以外はブロックする

おかげさまで、ブログのアクセスも増えてきて、t3.nano EC2インスタンス単 …

AWS CloudFormationでAmazon DynamoDBテーブルを作ってアイテムを追加する

デモ用にDynamoDBテーブルを作って消して、ということをたまにするので、Cl …

EC2にSystems MangerからCloudWatchエージェントをインストール

CloudWatchエージェント EC2の標準メトリクスでは収集できないメモリの …

X-Ray SDK for Python でライブラリへのパッチ適用

boto3でのAWS呼び出しとrequestsでの外部API呼び出しにパッチ適用 …

AWS EC2でAMI(Amazon Machine Image)を作成しておく

前回まででひとまずRedmineを構築するところまで出来たので、念のためスナップ …

Systems Manager パッチマネージャでベースラインを作成して適用する

ベースラインの作成 Systems Managerのパッチマネージャーでパッチベ …

AWS Lambda(Python3)でSelenium + Chrome Headless + でwebスクレイピングする

インターネット上に公開されている情報をDynamoDBにつっこみたいだけなので、 …

Amazon Linux 2023、T4Gインスタンス、PHP8にWordPressを移行しました

ブログをAmazon Linux 2からAmazon Linux 2023に移行 …

試したい事があるのでAWS でとりあえずAmazon Linuxのサーバを作る

1年間の無料キャンペーン期間中に検証する とある勉強会でせっかくAWSのアカウン …

slackのbotをAWS Lambda(Python)+API Gatewayで構築

slackで投稿した内容に応じて返信したり調べ物したりしてくれるbotですが、こ …