EKS + ECR 入門:カスタム Docker イメージをクラスタにデプロイする

はじめに

こんにちは。satyamです。
Amazon EKS では、Kubernetes の Deployment や Service を使用して、コンテナアプリケーションをクラスター上にデプロイできます。

本記事では、EKS クラスターとマネージド型ノードグループを作成し、カスタム Docker イメージを使用してアプリケーションを EKS にデプロイします。

また、カスタム Docker イメージは Amazon ECR に保存し、EKS のワーカーノードから取得して Pod として起動します。

この構成では、ワーカーノード作成、kubectl 設定、ECR からのイメージ取得、Pod 起動、LoadBalancer Service 経由のアクセスまでを確認します。

目次

構成図

以下は、本記事で構築する構成です。

動作フロー

  • Amazon EKS コントロールプレーンは Kubernetes クラスターを管理し、Pod をワーカーノード上に配置します。
  • Admin EC2 インスタンスは、作業用ホストとして使用します。このインスタンス上でカスタム Docker イメージをビルドし、Amazon ECR リポジトリ eks-custom-app へプッシュします。また、kubectl で EKS リソースを操作します。
  • Deployment が作成されると、ワーカーノードは Amazon ECR から eks-custom-app:latest イメージを取得し、Pod 内で custom-app コンテナを起動します。
  • ユーザーからのアクセスは Network Load Balancer に送信され、Kubernetes Service custom-app-service を経由してアプリケーション Pod に転送されます。

検証構成

  • EKS クラスター:1
  • マネージド型ノードグループ:1
  • ワーカーノード:1
  • Admin EC2 インスタンス:1
  • ECR リポジトリ:1
  • コンテナイメージ:1
  • Kubernetes デプロイメント:1
  • Kubernetes サービス:1
  • Network Load balancer:1
  • アプリケーション Pod:1
  • コンテナ:1
  • VPC:1
  • アベイラビリティーゾーン:2
  • パブリックサブネット:2
  • IAM ロール:EKS クラスター用ロール、マネージド型ノードグループ用ロール、Admin EC2 用ロール

※ 注意点
EKS クラスター作成には2つ以上の AZ にまたがるサブネットが必要です。
本検証ではパブリックサブネットを2つ用意しますが、ワーカーノードは1台のみ、1つのサブネットに配置します。

前提条件

Admin EC2 インスタンスを事前に準備します。

Admin EC2 インスタンスの条件は以下の通りです。

  • OS:Amazon Linux
  • AWS CLI が使用できること
  • Docker がインストールされていること
  • IAM ロールがアタッチされていること

本記事のコマンドでは、以下の値を環境に合わせて置き換えてください。

  • <account-id>:ご自身の AWS アカウント ID
  • <region>:使用する AWS リージョン

Docker がインストールされていない場合は、以下の記事を参照してください。

コンテナの実行環境をEC2からECS on Fargateへ移行してみた - クロスパワークラウドブログ

Admin EC2 の IAM ロールには、少なくとも以下の IAM アクションを許可します。

EKS:
eks:DescribeCluster

ECR:
ecr:GetAuthorizationToken
ecr:BatchCheckLayerAvailability
ecr:InitiateLayerUpload
ecr:UploadLayerPart
ecr:CompleteLayerUpload
ecr:PutImage
ecr:BatchGetImage

EKS クラスターの作成

AWS マネジメントコンソールから以下の画面に移動します。

Amazon Elastic Kubernetes Service → クラスター → クラスターを作成

1: クラスターを設定

「設定オプション」では、以下を選択します。

「カスタム設定」

※ 注意点
本検証では、EKS オートモードは使用しません。
マネージド型ノードグループは、次の手順で個別に作成します。

「クラスター設定」では、以下の内容を設定します。

  • 名前:eks-custom-app-cluster
  • クラスター IAM ロール:AmazonEKSClusterRole
  • Kubernetes バージョン:1.35

クラスター IAM ロールが存在しない場合は、
コンソール画面の 「新しいロールの作成」 から作成します。

2: ネットワーキングを指定

次に、「ネットワーキングを指定」画面で、検証用 VPC とサブネットを選択します。

「ネットワーキング」では、以下のように設定します。

  • VPC:検証用 VPC
  • サブネット:2つ以上のアベイラビリティーゾーンにあるパブリックサブネット

本検証では、残りの設定はデフォルトのままにします。

設定内容を確認し、[作成] を選択します。

クラスターの作成には数分かかります。
ステータスが アクティブ になってから、次の手順に進みます。

マネージド型ノードグループの作成とアクセス設定

Step 1: ノード IAM ロールの作成

AWS マネジメントコンソールから以下の画面に移動します。

IAM → ロール → ロールを作成

ロールは以下の内容で設定します。

  • 信頼されたエンティティタイプ:AWS のサービス
  • ユースケース:EC2

許可ポリシー:

AmazonEKSWorkerNodePolicy
AmazonEKS_CNI_Policy
AmazonEC2ContainerRegistryPullOnly

ロール名:eks-custom-app-node-role

設定内容を確認し、[ロールを作成] を選択します。

Step 2: マネージド型ノードグループの作成

EKS クラスターの詳細画面を開き、以下の画面に移動します。

Amazon EKS → クラスター → eks-custom-app-cluster → コンピューティング → ノードグループ → 追加

「ノードグループの設定」では、以下の内容を設定します。

  • 名前:eks-custom-node-group
  • ノード IAM ロール:eks-custom-app-node-role

次に、「ノードグループのスケーリング設定」では、以下の内容を設定します。

  • 希望のサイズ:1
  • 最小サイズ:1
  • 最大サイズ:1

残りの設定はデフォルトのままにします。

ネットワーキングでは、EKS クラスター作成時に選択したものと同じパブリックサブネットを選択します。

※ 注意点
パブリックサブネットにワーカーノードを配置するため、対象サブネットでパブリック IPv4 アドレスの自動割り当てが有効であることを確認します。

設定内容を確認し、[作成] を選択します。

Step 3: Admin EC2 IAM ロールに Kubernetes アクセスを付与

kubectl 設定前に、Admin EC2 の IAM ロールへ Kubernetes アクセス権限を付与します。

AWS マネジメントコンソールから、以下の画面に移動します。

Amazon EKS → クラスター → eks-custom-app-cluster → アクセス → アクセスエントリ → 作成

1. IAM アクセスエントリを設定

「IAM アクセスエントリを設定」画面で、以下を設定します。

  • IAM プリンシパル ARN:< Admin EC2 IAM ロール ARN >
  • タイプ:スタンダード

[次へ] を選択します。

2. アクセスポリシーを追加

「アクセスポリシーを追加」画面で、以下を設定します。

  • ポリシー名:AmazonEKSClusterAdminPolicy
  • アクセスの範囲:クラスター
  • Kubernetes 名前空間:スコープはクラスター ワイドです

[次へ] を選択します。

設定内容を確認し、[作成] を選択します。

これにより、Admin EC2 IAM ロールから EKS クラスターに対して kubectl コマンドやその他の検証コマンドを実行できるようになります。

kubectl の設定とワーカーノードの確認

Admin EC2 上で kubectl を設定し、ワーカーノードを確認します。

Step 1: kubectl のインストールと設定

SSH で Admin EC2 に接続し、root ユーザーに昇格して以下を実行します。

curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.35.3/2026-04-08/bin/linux/amd64/kubectl     
chmod +x ./kubectl            
mv ./kubectl /usr/local/bin/

インストールされたバージョンを確認します。

kubectl version --client

実行結果:

Client Version: v1.35.3-eks-bbe087e            
Kustomize Version: v5.7.1

次に、EKS クラスター用の kubeconfig ファイルを更新します。

aws eks update-kubeconfig \
  --region <region> \
  --name eks-custom-app-cluster

実行結果の例:

Updated context arn:aws:eks:<region>:<account-id>:cluster/eks-custom-app-cluster in /root/.kube/config

kubectl が正しいクラスターコンテキストを使用していることを確認します。

kubectl config current-context

実行結果の例:

arn:aws:eks:<region>:<account-id>:cluster/eks-custom-app-cluster

Step 2: ワーカーノードの確認

ワーカーノードがクラスターに参加していることを確認します。

kubectl get nodes -L eks.amazonaws.com/nodegroup

実行結果の例:

NAME                           STATUS   ROLES    AGE   VERSION               NODEGROUP
<ip>.<region>.compute.internal Ready    <none>   9m    v1.35.5-eks-3385e9b   eks-custom-node-group

ノードのステータスが Ready になっていれば、EKS クラスターおよびマネージド型ノードグループは、アプリケーションをデプロイする準備ができています。

ECR リポジトリの作成と Docker イメージのプッシュ

この手順では、ECR リポジトリを作成し、Docker イメージをビルドしてプッシュします。

Step 1: ECR リポジトリの作成

AWS マネジメントコンソールを開き、以下の画面に移動します。

Amazon ECR → リポジトリ → リポジトリを作成

リポジトリを以下の内容で設定します。

  • 可視性設定:プライベート
  • リポジトリ名:eks-custom-app

設定内容を確認し、[作成] を選択します。

Step 2: Docker イメージのビルドとプッシュ

作業用ディレクトリを作成します。

mkdir eks-custom-app && cd eks-custom-app

index.html ファイルを作成します。

vi index.html

以下の HTML コンテンツをファイルに貼り付けます。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>EKS + ECR Demo</title>
  <style>
    body {
      margin: 0;
      height: 100vh;
      display: flex;
      justify-content: center;
      align-items: center;
      background: linear-gradient(135deg, #111827, #1f2937);
      color: white;
      font-family: Arial, sans-serif;
    }

    .box {
      text-align: center;
      padding: 40px 60px;
      border-radius: 18px;
      background: rgba(255, 255, 255, 0.08);
      box-shadow: 0 15px 40px rgba(0, 0, 0, 0.4);
    }

    h1 {
      font-size: 42px;
      margin-bottom: 15px;
    }

    p {
      font-size: 18px;
      color: #d1d5db;
    }

    .tag {
      margin-top: 25px;
      color: #34d399;
      font-weight: bold;
    }
  </style>
</head>
<body>
  <div class="box">
    <h1>Hello from EKS + ECR 🚀</h1>
    <p>This image is deployed from Amazon ECR.</p>
    <div class="tag">Running on Amazon EKS with Network Load Balancer</div>
  </div>
</body>
</html>

Dockerfile を作成します。

vi Dockerfile

以下の Dockerfile の内容をファイルに貼り付けます。

FROM nginx:latest
COPY index.html /usr/share/nginx/html/index.html

Docker イメージをビルドします。

docker build -t eks-custom-app:latest .

Amazon ECR 用にイメージへタグを付与します。

docker tag eks-custom-app:latest <account-id>.dkr.ecr.<region>.amazonaws.com/eks-custom-app:latest

Amazon ECR にログインします。

aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com

イメージを Amazon ECR にプッシュします。

docker push <account-id>.dkr.ecr.<region>.amazonaws.com/eks-custom-app:latest

これにより、カスタム Docker イメージが ECR リポジトリにアップロードされます。

ECR イメージを使用してアプリケーションを EKS にデプロイ

Deployment マニフェストファイルを作成します。

vi custom-app-deployment.yaml

以下の Deployment 設定をファイルに貼り付けます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: custom-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: custom-app
  template:
    metadata:
      labels:
        app: custom-app
    spec:
      containers:
      - name: custom-app
        image: <account-id>.dkr.ecr.<region>.amazonaws.com/eks-custom-app:latest
        ports:
        - containerPort: 80

ファイルを保存して終了します。

次に、Service マニフェストファイルを作成します。

vi custom-app-service-nlb.yaml

以下の Service 設定をファイルに貼り付けます。 本記事では、外部公開用の Network Load Balancer を作成する Service 設定を使用します。

apiVersion: v1
kind: Service
metadata:
  name: custom-app-service
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  selector:
    app: custom-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

ファイルを保存して終了します。

Deployment マニフェストを適用します。

kubectl apply -f custom-app-deployment.yaml

実行結果の例:

deployment.apps/custom-app created

Service マニフェストを適用します。

kubectl apply -f custom-app-service-nlb.yaml

実行結果の例:

service/custom-app-service created

これで Deployment と Service が EKS 上に作成されます。

動作確認

Step 1: Deployment の確認

Deployment を確認します。

kubectl get deployment custom-app

実行結果の例:

NAME         READY   UP-TO-DATE   AVAILABLE   AGE
custom-app   1/1     1            1           1m

READY の値が 1/1 になっていることを確認します。

[Deployment の実行結果のスクリーンショットを挿入]

Step 2: Pod ステータスの確認

Pod が起動していることを確認します。

kubectl get pods -l app=custom-app

実行結果の例:

NAME                         READY   STATUS    RESTARTS   AGE
custom-app-xxxxxxxx-yyyyy    1/1     Running   0          2m

Pod の STATUSRunning で、READY1/1 になっていることを確認します。

Step 3: Pod で使用されている ECR イメージの確認

Pod が ECR イメージを使用していることを確認します。

kubectl describe pod -l app=custom-app | grep Image:

実行結果の例:

Image: <account-id>.dkr.ecr.<region>.amazonaws.com/eks-custom-app:latest

これにより、Pod が Amazon ECR からカスタムコンテナイメージを取得していることを確認できます。

Step 4: Service の確認

LoadBalancer Service を確認します。

kubectl get svc custom-app-service

実行結果の例:

NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP          PORT(S)        AGE
custom-app-service   LoadBalancer   <cluster-ip>   <nlb-dns-name>       80:32400/TCP   2m

EXTERNAL-IP の値をコピーします。

Step 5: アプリケーションへのアクセス

ブラウザで以下の URL を開きます。

http://<EXTERNAL-IP>

以前作成したイメージが表示されていることを確認してください。

まとめ

本記事では、Amazon EKS 上でカスタムコンテナアプリケーションを動作させました。

EKS クラスターとマネージド型ノードグループを作成し、カスタム Docker イメージをビルドして Amazon ECR にプッシュしました。その後、Kubernetes の Deployment と Service を使用して、EKS クラスター上にアプリケーションをデプロイしました。

また、ワーカーノードがクラスターに参加していること、Pod が正常に起動していること、ECR からイメージが取得されていること、そして Network Load Balancer 経由でアプリケーションにアクセスできることを確認しました。

これにより、イメージ作成から ECR 保存、EKS デプロイ、ブラウザアクセスまでを確認できました。