メインコンテンツに移動
デベロッパーのためのクラウド活用方法
AWS for Games logo featuring a white game controller outline with directional pad and buttons, on a purple background.

Terraform を利用した Amazon EKS の構築

2024-07-17 | Author : 邵 正

はじめに

近年、インフラストラクチャのコード化が注目されており、多くの企業で導入が進んでいます。インフラストラクチャのコード化により、繰り返しの手作業を減らし、効率的な開発が可能になります。

本記事では、Amazon Elastic Kubernetes Service (EKS) クラスターの構築を例にとり、Terraform を活用してインフラストラクチャを自動化する方法を解説します。


X ポスト » | Facebook シェア » | はてブ »

builders.flash メールメンバー登録

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 

今すぐ特典を受け取る »

AWS for Games

AWS for Games はより早い開発、よりスマートな運営、そしてより楽しいゲームへの成長という Build、Run、Grow の 3 つの柱に沿ってサポートします。今回は Build の柱 クラウドゲーム開発 のお話になります。

A diagram in Japanese illustrating the stages of cloud game development: Build, Run, and Grow. The 'Build' section shows cloud game development, the 'Run' section includes game server, game security, and game database, and the 'Grow' section features LiveOps, game analytics, and AI & ML, with corresponding icons and colorful section headers.

Terraform の概要

Terraform は、インフラストラクチャを安全かつ効率的に構築、変更、バージョン管理するためのツールです。主な特徴は、まずインフラストラクチャをコード化できる点です。柔軟性の高い言語である HashiCorp Configuration Language(HCL) を使用してインフラを記述することで、アーキテクチャをバージョン管理し、再利用や共有が容易になります。次に、Terraform には「実行プラン」機能があり、これはリソースを反映する前に Terraform が何を行うかを示すプランを生成することが可能です。これにより、予期しない変更を防ぐことができます。

さらに、Terraform はリソースのグラフを構築し、依存関係のないリソースの作成や変更を並行して行います。インフラを効率的に構築でき、依存関係の把握も容易です。

Terraform は、aws provider を利用して AWS のリソースを構築するだけでなく、terraform-aws-modules のような高度なモジュールを利用することで、さらに簡単に構築できます。

EKS クラスター構築の実践例

EKS クラスターを構築する際には、多くのリソースが関与します。aws_eks_cluster を直接利用して構築する方法もできますが、今回は Terraform モジュール terraform-aws-eks を使用することで、簡単に本番環境で使用可能なクラスターを作成する手順を紹介します。

1. Terraform CLI のインストール

Terraform CLI をインストールします。検証環境として、Amazon EC2 上の Ubuntu 22.04 を使用しました。

bash
$ sudo apt-get update && sudo apt-get install -y gnupg software-properties-common

# HashiCorp repository の GPG key を import
$ wget -O- https://apt.releases.hashicorp.com/gpg | \
gpg --dearmor | \
sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null

# GPG キーの確認
$ gpg --no-default-keyring \
--keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg \
--fingerprint

$ echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
sudo tee /etc/apt/sources.list.d/hashicorp.list

# terraform package の install
$ sudo apt update
$ sudo apt-get -y install terraform

# tab key の自動補完機能を install
$ terraform -install-autocomplete
$ complete -C /usr/bin/terraform terraform

# terraform version の確認
$ terraform -version
Terraform v1.9.2
on linux_amd64

2. 最終構成

今回の最終構成は以下のようになります。

$ tree .
.
├── backend.tf
├── main.tf
├── outputs.tf
├── providers.tf
├── terraform.tfstate
├── terraform.tfvars
├── variables.tf
└── versions.tf

3. Providers の設定

3. Providers の設定を行います。

bash
$ cat << EOF > providers.tf
provider "random" {}

# https://registry.terraform.io/providers/hashicorp/aws/latest/docs#aws-configuration-reference
# 環境変数でも設定は可能です。ここでは Terraform に直接設定を入れてます。
provider "aws" {
  region = var.region
}
EOF

4. バックエンド設定

Backend の設定を行います。 設定を簡易化するため、Terraform の state ファイルをローカルに保存していますが、実際運用するときは、Amazon S3 のような安全な場所に入れておきましょう、一旦ローカルに保存したあとで、terraform init -migrate-state を使えば、自動的に S3 に移動することができるので便利です。

bash
$ cat << EOF > backend.tf
terraform {
  backend "local" {
    path = "terraform.tfstate"
  }
}
EOF

5. versions.tf

versions.tf では、terraform バージョンやプロバイダーのバージョンを指定するためのファイルです。このファイルは、terraform の構成の一貫性を保ち、互換性のないバージョンによる問題を防ぐ役割を果たします。

versions.tf の内容

スクリプト

bash
$ cat << EOF > versions.tf
terraform {
  # required Terraform version
  required_version = ">= 1.9.2"

  required_providers {
    random = {
      source = "hashicorp/random"
      version = ">= 3.6.1"
    }
    aws = {
      source  = "hashicorp/aws"
      version = ">= 5.48.0"
    }
  }
}
EOF

6. Amazon VPC の構築

Amazon VPC の構築を行います。

terraform-aws-vpc を利用することで、Amazon VPC や関連する Subnet、Nat Gateway、Route Table などのリソースをまとめて作成できます。

terraform-aws-vpc コード

Amazon VPC や関連する Subnet、Nat Gateway、Route Table などのリソースをまとめて作成できます。

bash
$ cat << EOF > main.tf

# 共通で使う変数の設定
locals {
  azs = slice(data.aws_availability_zones.available.names, 0, 3)

  tags = {
    project    = var.name_prefix
    managed_by = "Terraform"
  }
}

# data を利用して現在のリージョンから使える aws availability zones を取得します。
# この手法を使えば様々なリソースを Dynamic に生成できます。
# 他によく使われている例としてたとえば、Amazon Linux や Ubuntu の AMI の取得が挙がられます。
data "aws_availability_zones" "available" {}

# VPC 関連のリソースを構築
module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "~> 5.0"

  name                  = var.name_prefix
  cidr                  = var.vpc_cidr
  secondary_cidr_blocks = var.secondary_cidr_blocks

  azs = local.azs

  private_subnets = [for k, v in local.azs : cidrsubnet(var.vpc_cidr, 2, k)]
  public_subnets  = [for k, v in local.azs : cidrsubnet(var.secondary_cidr_blocks.0, 2, k)]
  intra_subnets   = [for k, v in local.azs : cidrsubnet(var.secondary_cidr_blocks.1, 2, k)]

  map_public_ip_on_launch = true
  enable_nat_gateway      = true
  single_nat_gateway      = true
  create_egress_only_igw  = true
  
  public_subnet_tags = {
    "subnet-type"            = "public"
    
    # 外向けの ELB はこちらの Subnet を利用
    "kubernetes.io/role/elb" = 1
  }

  private_subnet_tags = {
    "subnet-type"                     = "private"
    
    # 内向けの ELB はこちらの Subnet を利用
    "kubernetes.io/role/internal-elb" = 1
  }

  tags = local.tags
}

7. EKS 構築

EKS 本体の構築を行います。 こちらの例では Managed Group の EKS を構築する例となります。トラブルシューティングがやすいように SSH を設定したり、addon を入れる方法も示しています。

8. variables.tf および terraform.tfvars の設定

variables.tf および terraform.tfvars のファイルでは、今回利用していた変数の定義をこのように設定しています。

bash
$ cat << EOF > variables.tf
variable "eks_version" {
  type = string
  description = "The EKS version to use"
}

variable "vpc_cidr" {
  type = string
  description = "The CIDR block for the VPC"
}

variable "secondary_cidr_blocks" {
  type = list(string)
  description = "The secondary CIDR blocks for the VPC"
}

variable "name_prefix" {
  type = string
  description = "The prefix to use for all resources"
}

variable "region" {
  type = string
  description = "The AWS region to deploy to"
}
EOF

$ cat << EOF > terraform.tfvars
eks_version           = "1.29"
name_prefix           = "terraform-eks-example"
vpc_cidr              = "10.0.0.0/16"
secondary_cidr_blocks = ["10.1.0.0/16", "10.2.0.0/16"]
region                = "ap-northeast-1"
EOF

9. 構築

構築してみましょう。

bash
$ terraform init
$ terraform plan -out ./plan
$ terraform apply ./plan

まとめ

本記事では、Terraform を使ってインフラストラクチャを自動化する方法について詳しく解説しました。

Terraform を活用することで、インフラストラクチャの自動化が簡単に行えます。例えば、AWS のリソースをコードで管理したり、再利用可能なモジュールを使って設定を効率化することが可能です。

また、Terraform を使用する際のトラブルシューティングも簡単です。環境変数に TF_LOG=DEBUG を設定することで、Terraform の実行時に行われる API リクエストの詳細な内容を確認することができます。これにより、問題の特定や解決が迅速に行えます。

この記事を参考に、あなたの環境で Terraform を実際に試してみて、インフラストラクチャの管理を効率化しましょう !

筆者プロフィール

邵 正
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト

Linux カーネル、コンテナ、データベースにフォーカスしています。お客様と協力して様々なクラウドインフラストラクチャのチャレンジを一緒に解決することで、よりヘルシーな設計・運用ができるように、サポートしています。

A portrait of an individual wearing glasses and a dark sweater, set against a dark background.