【ITニュース解説】Building an Amazon EKS Cluster with raw Terraform Resources
2025年09月11日に「Dev.to」が公開したITニュース「Building an Amazon EKS Cluster with raw Terraform Resources」について初心者にもわかりやすく解説しています。
ITニュース概要
TerraformでAWS EKSクラスターを、コミュニティモジュールを使わずゼロから構築する手順を解説。VPC、IAM、EC2など基盤となるAWSリソースを直接定義し、EKSの仕組みを深く理解する。最後にサンプルアプリをデプロイし動作確認まで行う。
ITニュース解説
この記事は、Amazon Web Services(AWS)上でKubernetesクラスターを構築できるサービスであるAmazon EKS(Elastic Kubernetes Service)を、インフラストラクチャをコードで管理するツールであるTerraformを用いて、ゼロから手動で構築する方法を解説している。一般的な構築ガイドでは、AWSコミュニティが提供する便利なTerraformモジュールが使われることが多いが、この記事ではそうしたモジュールを使わずに「生の(raw)Terraformリソース」を直接定義することで、EKSクラスターの背後で実際に何が動いているのか、AWSのネットワーク、IAM(Identity and Access Management)、コンピューティングリソースがどのように連携しているのかを深く理解することを目的としている。
まず、EKSクラスターを動かすための基盤となるネットワーク環境をAWS上に構築する。これは「VPC(Virtual Private Cloud)」と呼ばれる、AWSクラウド内に自分専用の仮想ネットワークを構築するサービスから始まる。高可用性、つまりシステムが停止しにくいように、VPCは複数のアベイラビリティゾーン(AZ)にまたがって設計される。各AZの中には、インターネットから直接アクセスできる「パブリックサブネット」と、直接アクセスできない「プライベートサブネット」がそれぞれ用意される。EKSの「ワーカーノード」となるEC2インスタンス(仮想サーバー)は、セキュリティを考慮してプライベートサブネットに配置される。これらのワーカーノードが、Docker HubやAmazon ECR(Elastic Container Registry)のようなインターネット上のリポジトリからコンテナイメージをダウンロードしたり、アップデートを取得したりする必要がある場合、パブリックサブネットに配置された「NAT Gateway」を経由してインターネットに接続する。これにより、ワーカーノードはインターネットから直接攻撃されることなく、必要なアウトバウンド通信が可能となる。EKSの「コントロールプレーン」(Kubernetesの頭脳部分で、AWSが管理してくれる)は、このVPC内でワーカーノードと安全に通信する仕組みになっている。
このネットワーク環境をTerraformで定義するには、まずaws_vpcリソースでVPC自体を作成する。次に、aws_subnetリソースを使って、指定したAZにパブリックサブネットとプライベートサブネットを複数作成する。パブリックサブネットにはインターネットからの通信を受け入れるためのaws_internet_gatewayを設定し、VPCに紐付ける。プライベートサブネットからインターネットへのアウトバウンド通信を可能にするために、aws_eipリソースで固定のパブリックIPアドレス(Elastic IP)を確保し、それを使ってaws_nat_gatewayリソースをパブリックサブネット内に作成する。ネットワークトラフィックの経路を制御するaws_route_tableリソースとaws_routeリソースも作成し、パブリックサブネットはインターネットゲートウェイを経由するルートを、プライベートサブネットはNATゲートウェイを経由するルートを持つように設定する。最後に、aws_route_table_associationリソースで各サブネットとルーティングテーブルを関連付ける。また、仮想ファイアウォールとして機能するaws_security_groupリソースも作成し、どの通信を許可・拒否するかを定義することで、セキュリティをさらに強化する。これらのリソース定義では、countやfor_eachといったTerraformの機能を使って、複数のサブネットやセキュリティグループを効率的に作成している。
次に、EKSクラスターとワーカーノードがAWSサービスにアクセスするための「IAMロールとポリシー」を作成する。IAMはAWSのリソースに対するアクセス権限を管理するサービスだ。ここでは主に二種類のロールが必要となる。一つはEKSクラスター自身がAWS内の他のリソース(例えばEC2インスタンスやVPC内のネットワーク設定など)を管理するために必要な「EKSクラスターロール」で、eks.amazonaws.comサービスがこのロールを引き受けることができるように設定する。これにはAmazonEKSClusterPolicyというAWS管理ポリシーをアタッチする。もう一つは、EKSワーカーノード(EC2インスタンス)がEKSクラスターと通信し、コンテナイメージをプルしたり、ネットワーク設定を操作したりするために必要な「ノードグループロール」で、ec2.amazonaws.comサービスがこのロールを引き受けることができるように設定する。これにはAmazonEKSWorkerNodePolicy、AmazonEC2ContainerRegistryReadOnly、AmazonEKS_CNI_Policyといった必要な権限を提供するAWS管理ポリシーをアタッチする。これらはaws_iam_roleとaws_iam_role_policy_attachmentリソースを使ってTerraformで定義する。
これらの基盤が整ったら、いよいよEKSクラスター本体をプロビジョニングする。aws_eks_clusterリソースを使って、EKSのコントロールプレーンを作成する。ここでは、事前に作成したEKSクラスターロールのARN(Amazon Resource Name)と、VPC内のサブネットID、セキュリティグループIDを指定し、クラスターが利用するネットワーク環境を紐付ける。このステップで、Kubernetesのマスターノード群がAWSによって管理されるようになる。次に、実際にアプリケーションのコンテナが動作するEC2インスタンスの集まりである「ノードグループ」を作成する。aws_eks_node_groupリソースを使い、クラスター名、ノードグループ名、ノードグループロールのARN、そしてワーカーノードを配置するプライベートサブネットのIDを指定する。scaling_configでは、ノードの最小数、最大数、希望する数を設定でき、これにより需要に応じてワーカーノードが自動的に増減(オートスケーリング)するようになる。さらに、インスタンスタイプやAMIタイプ(OSイメージの種類)、ディスクサイズなども指定する。EKSクラスターの機能を拡張する「EKSアドオン」(例えばVPC CNIなど)も、aws_eks_addonリソースを使って導入する。aws_iam_openid_connect_providerリソースは、KubernetesサービスアカウントがAWSリソースにアクセスするために必要なOIDC(OpenID Connect)プロバイダーを設定する。
EKSクラスターの構築が完了したら、ローカル環境からクラスターを操作できるように設定する。null_resourceというTerraformリソースとlocal-execプロビジョナーを利用して、aws eks update-kubeconfigコマンドを実行する。このコマンドは、AWS CLI(Command Line Interface)がインストールされた環境で実行されると、ローカルのkubeconfigファイルを更新し、作成したEKSクラスターへの接続情報が追加される。これにより、kubectlコマンド(Kubernetesクラスターを操作するためのツール)を使って、クラスターの状態確認やアプリケーションのデプロイなどの操作が可能になる。
最後に、構築したEKSクラスターが正しく機能していることを確認するため、サンプルアプリケーションとして有名な投票アプリをデプロイする。このアプリは、Python製のフロントエンド、Redis(投票収集)、.NET製のワーカー(投票処理)、Postgresデータベース、Node.js製の結果表示アプリという複数のマイクロサービスで構成されている。kubectl apply -f .コマンドを使って、これらのアプリケーションをKubernetesクラスターにデプロイする。デプロイ後、kubectl port-forwardコマンドを使うことで、クラスター内で動作しているサービスにローカルPCから一時的にアクセスし、ウェブブラウザで投票アプリの画面や結果画面を確認できるようになる。
この一連の作業が終わったら、不要な課金を避けるために、作成したすべてのリソースを削除することが重要だ。まずkubectl delete -f .コマンドでデプロイしたKubernetesアプリケーションを削除し、次にterraform destroyコマンドを実行して、Terraformで作成したAWS上のEKSインフラストラクチャ全体を削除する。
結論として、AWSコミュニティのTerraformモジュールに頼らず、生のTerraformリソースを使ってEKSクラスターをゼロから構築するこの経験は、AWSのネットワーク、IAM、コンピューティングリソースがKubernetesクラスターを本番環境で運用するためにどのように不可欠であるかという、基礎的かつ深い理解をもたらす。この実践的な知識は、単にクラスターを動かすだけでなく、将来的にインフラストラクチャをカスタマイズし、特定の要件に合わせて最適化する自信と能力を身につける上で非常に価値のあるものとなるだろう。