はじめに
こんにちは。satyamです。
Amazon EKS では、Kubernetes の Deployment や Service を使用して、コンテナアプリケーションをクラスター上にデプロイできます。
本記事では、EKS クラスターとマネージド型ノードグループを作成し、カスタム Docker イメージを使用してアプリケーションを EKS にデプロイします。
また、カスタム Docker イメージは Amazon ECR に保存し、EKS のワーカーノードから取得して Pod として起動します。
この構成では、ワーカーノード作成、kubectl 設定、ECR からのイメージ取得、Pod 起動、LoadBalancer Service 経由のアクセスまでを確認します。
目次
- はじめに
- 目次
- 構成図
- 前提条件
- EKS クラスターの作成
- マネージド型ノードグループの作成とアクセス設定
- kubectl の設定とワーカーノードの確認
- ECR リポジトリの作成と Docker イメージのプッシュ
- ECR イメージを使用してアプリケーションを EKS にデプロイ
- 動作確認
- まとめ
構成図
以下は、本記事で構築する構成です。

動作フロー
- 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 の STATUS が Running で、READY が 1/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 デプロイ、ブラウザアクセスまでを確認できました。




