0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWSコンテナ入門】⑤eksctlでEKSクラスターを立てて簡単なアプリを動かしてみる

Last updated at Posted at 2025-11-13

🧭 はじめに

PJでコンテナ(EKS)上の基幹システム構築は経験しているんですが…

  • ロールの関係上、業務では全然コンテナに触らない
  • そもそも AWS周りのコンテナサービスに全然触ったことが無い!

ということで、
Japan AWS Jr.Championsの活動である 「コンテナ・サーバレス もくもく会」 に参加し、
AWSのコンテナサービスに触ったことをきっかけに、継続的にコンテナについて学んでみることにしました。

触った内容・学んだ内容を備忘として残しておければと思います。
(AWSコンテナ初学者の一助になれば良いなという想いもありつつ)


🛠️ 今回やること

  • eksctlでクラスターを構築して、簡単なアプリを動かしてみる

  • Kubernetesって何、、?EKSってどう動かすの、、、?状態ですが、
    Chatgptにも聞きながら、とりあえずeksctlを使ってサクッと動かしてみます!!


ハンズオン実施概要

  1. ツールのインストール(kubectl / eksctl)
  2. クラスター作成
  3. 動作確認:Nginx を外部公開
  4. ECR イメージをデプロイ

ハンズオン実施

0. 前提

  • AWS CLI セットアップ済み(aws configure 済)
  • Chocolatey 利用可(choco --version
  • ECR イメージが存在

1. ツールのインストール(kubectl / eksctl)

  • まずはEKSを操作するためのeksctl及びKubernetesを操作するためのkubectlをインストールします。
choco install kubernetes-cli -y
choco install eksctl -y

kubectl version --client
eksctl version
aws --version

2. クラスター作成

  • 続いて、EKS環境を構築していきます。
  • eksctl create clusterコマンドを使うと、EKSクラスターのみならず、VPC・サブネット・IAM等の周辺リソースまで一気に構築してくれます。
eksctl create cluster `
  --name demo-eks ` 
  --region ap-northeast-1 ` 
  --nodegroup-name demo-ng ` 
  --node-type t3.small `
  --nodes 2 `
  --with-oidc `
  --managed

コマンドの各オプションの意味

  • --name demo-eks
    作成する EKS クラスタ名。kubeconfig の context 名にも反映されます。

  • --region ap-northeast-1
    作成先の AWS リージョン。今回は東京。

  • --nodegroup-name demo-ng
    1つ目の マネージドノードグループの名前。
    ここに EC2 ワーカーノードが属します。

  • --node-type t3.small
    ノードグループの EC2 インスタンスタイプ

  • --nodes 2
    起動ノード数(Desired)。既定では min=2 / max=2 相当で固定。

  • --with-oidc
    IAM OIDC プロバイダをクラスタに紐づけて作成。
    これにより IRSA(ServiceAccount に IAM ロールを付与)が使えるようになります

  • --managed
    EKS マネージドノードグループとして作成。
    ローリングアップデートや起動設定の管理を AWS が面倒見てくれるモードです

  • 上記コマンドを実行後、CloudFormationコンソールを除くと以下の様なスタックが三つ作成されていました。
    image.png

作られる主なリソースと構成

以下リソースが作成されていました。

  • EKS コントロールプレーン(マネージド)
    • クラスタエンドポイント(通常は Public 有効)
    • クラスタ用セキュリティグループ(Nodeとの通信を許可)
  • VPC(新規)サブネット(自動)
    • 複数 AZ にまたがる public / private サブネット(3AZ)
    • Internet Gateway / ルートテーブル
    • NAT ゲートウェイ(private 側のアウトバウンド用)
      ※ 既定の VPC 自動作成時。既存VPCを使う設定にすれば作成しません
  • マネージドノードグループ(EC2)
    • 指定したインスタンスタイプ・台数で private サブネットに配置(既定)
    • ノード用 IAM ロール & インスタンスプロファイル(ECR 読み取り等の標準ポリシー)
    • ノード用セキュリティグループ(コントロールプレーン・Node間の通信を許可)
  • IAM OIDC プロバイダ--with-oidc 指定時)
    • IRSA(Pod 単位 IAM)を使うための OIDC プロバイダ

また、Kubectl側の以下設定も自動でやってくれていました。

  • aws-auth ConfigMap の設定
    • ノードロールを Kubernetes の system:node にマップ
  • kubeconfig 更新
    • ~/.kube/config にクラスタの context を追加

接続確認

  • kubectl config get-contextsでクラスターとユーザのペア(Context)が表示される
  • kubectl get nodesReady なノード×2 が見える
PS C:\WINDOWS\system32> kubectl config get-contexts
CURRENT   NAME                                           CLUSTER                             AUTHINFO                                       NAMESPACE
*         admin-user@demo-eks.ap-northeast-1.eksctl.io   demo-eks.ap-northeast-1.eksctl.io   admin-user@demo-eks.ap-northeast-1.eksctl.io


PS C:\WINDOWS\system32> kubectl get nodes
NAME                                                STATUS   ROLES    AGE   VERSION
ip-192-168-17-143.ap-northeast-1.compute.internal   Ready    <none>   21h   v1.32.9-eks-c39b1d0
ip-192-168-38-49.ap-northeast-1.compute.internal    Ready    <none>   21h   v1.32.9-eks-c39b1d0

3. Nginx を外部公開してみる

  • まずは、Nginxが公開しているイメージをサクッとデプロイしてみます。
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --type=LoadBalancer --port=80 --target-port=80
kubectl get svc nginx
  • サービスが作られていることが確認できます。
PS C:\WINDOWS\system32> kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP                                                                    PORT(S)        AGE
kubernetes   ClusterIP      10.100.0.1      <none>                                                                         443/TCP        22h
nginx        LoadBalancer   10.100.72.213   xxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com   80:31170/TCP   16s
  • 表示された EXTERNAL-IP にブラウザで http:/// へアクセス
  • Nginxのページが表示されました。
    image.png

4. ECR イメージをデプロイしてみる

  • 続いて、ECRにPush済みのイメージをデプロイしてみます。
  • 今回はHello ECSと表示するだけの簡単なイメージを事前に作成済み。

4.1 マニフェスト作成(例:C:\container-handson\helloECS.yaml)

  • マニフェストファイル(k8sリソースの設定ファイル)を作成します。
  • 今回はネームスペース・デプロイメント・サービスを作成します。
apiVersion: v1
kind: Namespace
metadata:
  name: ecr-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: handson-app
  namespace: ecr-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: handson-app
  template:
    metadata:
      labels:
        app: handson-app
    spec:
      containers:
        - name: app
          image: xxxxxxxxxxxx #ECRイメージURIを記載
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80       # アプリの待ち受けポートに合わせる(今回の検証では 80)
          resources:
            requests: { cpu: "100m", memory: "128Mi" }
          limits:
            cpu: "500m"
            memory: "512Mi"
          readinessProbe:
            httpGet: { path: "/", port: 80 }
            initialDelaySeconds: 5
            periodSeconds: 10
          livenessProbe:
            httpGet: { path: "/", port: 80 }
            initialDelaySeconds: 15
            periodSeconds: 20
---
apiVersion: v1
kind: Service
metadata:
  name: handson-svc
  namespace: ecr-demo
spec:
  type: LoadBalancer
  selector:
    app: handson-app
  ports:
    - name: http
      port: 80
      targetPort: 80

4.2 デプロイと確認

  • 作成したマニフェストファイルをApplyします。
kubectl apply -f "C:\container-handson\helloECS.yaml"
kubectl -n ecr-demo rollout status deployment/handson-app
kubectl -n ecr-demo get pods -o wide
kubectl -n ecr-demo get svc handson-svc
  • 作成したネームスペースの中にPodが立ち上がっていることが確認できます。
  • サービスも立ち上がっていますね。

PS C:\WINDOWS\system32> kubectl -n ecr-demo get pods -o wide
NAME                          READY   STATUS    RESTARTS   AGE   IP               NODE                                                NOMINATED NODE   READINESS GATES
handson-app-b58956865-4vfqz   1/1     Running   0          47s   192.168.35.55    ip-192-168-38-49.ap-northeast-1.compute.internal    <none>           <none>
handson-app-b58956865-4wfjz   1/1     Running   0          35s   192.168.22.116   ip-192-168-17-143.ap-northeast-1.compute.internal   <none>           <none>


PS C:\WINDOWS\system32> kubectl -n ecr-demo get svc handson-svc
NAME          TYPE           CLUSTER-IP      EXTERNAL-IP                                                                   PORT(S)        AGE
handson-svc   LoadBalancer   10.100.109.98   xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com   80:30948/TCP   11m

EXTERNAL-IP へアクセス。
Healthチェックパスに設定しているパスが表示されることを確認出来ました。
(ルートでは「Hello ECS」と表示するだけのアプリですが、ルートのページは撮り忘れました)

image.png

6. 後片付け

  • 今回、eksctlの既定値でリソースが作成されているため、放っておくとかなりコストが発生します。
    (Natgateway・EIP・Cluster等)

  • 以下コマンドだけで、作成されたリソースは跡形もなく削除されます。

#Namespace ごと削除(Service/ELB も順次削除)
kubectl delete ns ecr-demo

# クラスター削除(EKS 本体・ノード・関連リソース)
eksctl delete cluster `
  --name demo-eks `
  --region ap-northeast-1

これだけで簡単に作ったリソースがすべて削除されました。


まとめ

今回は、eksctlを使ってEKSを構築・ECRからイメージを取得して簡単なアプリケーションを動かしてみました。
Kubernetesってなに?EKSってなに?状態でも簡単なコマンドだけでポチポチ環境構築できてしまうため、PoCや検証にもってこいだと感じました。

次回以降は、今回ハンズオンで実施した内容を詳細に振り返ることで、k8sに対する理解を深めていきたいと思います。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?