ヤマムギ

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

  関連記事

Amazon Linux2のジャンボフレーム

ユーザーガイドのEC2 インスタンスのネットワークの最大送信単位 (MTU)を試 …

EC2インスタンスプロファイルによってAssumeRoleされた認証情報の有効期限は短くできるのでしょうか

「EC2インスタンスプロファイルによってAssumeRoleされた認証情報の有効 …

「Fin-JAWS 第14回 Fin人類育成計画」で話させていただきました!

「Fin-JAWS 第14回 Fin人類育成計画」で話させていただきました。 久 …

AWS X-Ray SDK for PythonをOrganizations組織内にLambda Layersで共有しました

ローカルでパッケージ作成 インストールコマンドはこちらAWS X-Ray SDK …

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

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

AWS CodeDeployからEC2 Auto Scalingにデプロイするチュートリアル

公式チュートリアルチュートリアル: アプリケーションを CodeDeployグル …

AWSアカウントのルートユーザーのセキュリティ認証情報

アカウント作成時にはMFA設定するためにIAMダッシュボードからアクセスするので …

AWS Toolkit for Eclipseで「Error Message: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.」

AWS Toolkit for Eclipseをセットアップ(2021年版)の環 …

API GatewayをトリガーにしたときのLambdaリソースベースポリシー

先日、SwaggerからAPI Gatewayを作ったときに、API Gatew …

API Gateway 作成済REST APIの定義をSwaggerの形式でエクスポート

SAMで似たようなAPIを作りたくて、エクスポートしました。 Swaggerは、 …