メインコンテンツまでスキップ

Terraformを使用する

警告

Terraformを使用したワークショップクラスターの作成は現在プレビュー中です。発生した問題はGitHubリポジトリで報告してください。

このセクションでは、HashiCorp Terraformを使用して実習用クラスターを構築する方法を説明します。これはTerraformインフラストラクチャ・アズ・コードの使用に慣れている学習者を対象としています。

terraform CLIはIDE環境に事前にインストールされているため、すぐにクラスターを作成できます。クラスターとその支援インフラストラクチャを構築するために使用される主なTerraform設定ファイルを確認しましょう。

Terraform設定ファイルについて

providers.tfファイルはインフラストラクチャを構築するために必要なTerraformプロバイダーを設定します。このケースでは、awskuberneteshelmプロバイダーを使用します:

provider "aws" {
default_tags {
tags = local.tags
}
}

terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 4.67.0"
}
}

required_version = ">= 1.4.2"
}

main.tfファイルは、現在使用されているAWSアカウントとリージョンを取得するためのTerraformデータソースと、いくつかのデフォルトタグを設定します:

locals {
tags = {
created-by = "eks-workshop-v2"
env = var.cluster_name
}
}

vpc.tf設定は、VPCインフラストラクチャが作成されることを保証します:

locals {
private_subnets = [for k, v in local.azs : cidrsubnet(var.vpc_cidr, 3, k + 3)]
public_subnets = [for k, v in local.azs : cidrsubnet(var.vpc_cidr, 3, k)]
azs = slice(data.aws_availability_zones.available.names, 0, 3)
}

data "aws_availability_zones" "available" {
state = "available"
}

module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 6.0"

name = var.cluster_name
cidr = var.vpc_cidr

azs = local.azs
public_subnets = local.public_subnets
private_subnets = local.private_subnets
public_subnet_suffix = "SubnetPublic"
private_subnet_suffix = "SubnetPrivate"

enable_nat_gateway = true
create_igw = true
enable_dns_hostnames = true
single_nat_gateway = true

# Manage so we can name
manage_default_network_acl = true
default_network_acl_tags = { Name = "${var.cluster_name}-default" }
manage_default_route_table = true
default_route_table_tags = { Name = "${var.cluster_name}-default" }
manage_default_security_group = true
default_security_group_tags = { Name = "${var.cluster_name}-default" }

public_subnet_tags = merge(local.tags, {
"kubernetes.io/role/elb" = "1"
})
private_subnet_tags = merge(local.tags, {
"karpenter.sh/discovery" = var.cluster_name
"kubernetes.io/role/internal-elb" = "1"
})

tags = local.tags
}

最後に、eks.tfファイルはマネージドノードグループを含むEKSクラスター設定を指定します:

locals {
remote_node_cidr = var.remote_network_cidr
remote_pod_cidr = var.remote_pod_cidr
}

module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "~> 21.0"

cluster_name = var.cluster_name
cluster_version = var.cluster_version
cluster_endpoint_public_access = true
enable_cluster_creator_admin_permissions = true

cluster_addons = {
vpc-cni = {
before_compute = true
most_recent = true
configuration_values = jsonencode({
env = {
ENABLE_POD_ENI = "true"
ENABLE_PREFIX_DELEGATION = "true"
POD_SECURITY_GROUP_ENFORCING_MODE = "standard"
}
nodeAgent = {
enablePolicyEventLogs = "true"
}
enableNetworkPolicy = "true"
})
}
}

vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.private_subnets

create_cluster_security_group = false
create_node_security_group = false
cluster_security_group_additional_rules = {
hybrid-node = {
cidr_blocks = [local.remote_node_cidr]
description = "Allow all traffic from remote node/pod network"
from_port = 0
to_port = 0
protocol = "all"
type = "ingress"
}

hybrid-pod = {
cidr_blocks = [local.remote_pod_cidr]
description = "Allow all traffic from remote node/pod network"
from_port = 0
to_port = 0
protocol = "all"
type = "ingress"
}
}

node_security_group_additional_rules = {
hybrid_node_rule = {
cidr_blocks = [local.remote_node_cidr]
description = "Allow all traffic from remote node/pod network"
from_port = 0
to_port = 0
protocol = "all"
type = "ingress"
}

hybrid_pod_rule = {
cidr_blocks = [local.remote_pod_cidr]
description = "Allow all traffic from remote node/pod network"
from_port = 0
to_port = 0
protocol = "all"
type = "ingress"
}
}


cluster_remote_network_config = {
remote_node_networks = {
cidrs = [local.remote_node_cidr]
}
# Required if running webhooks on Hybrid nodes
remote_pod_networks = {
cidrs = [local.remote_pod_cidr]
}
}

eks_managed_node_groups = {
default = {
instance_types = ["m5.large"]
force_update_version = true
release_version = var.ami_release_version
use_name_prefix = false
iam_role_name = "${var.cluster_name}-ng-default"
iam_role_use_name_prefix = false

min_size = 3
max_size = 6
desired_size = 3

update_config = {
max_unavailable_percentage = 50
}

labels = {
workshop-default = "yes"
}
}
}

tags = merge(local.tags, {
"karpenter.sh/discovery" = var.cluster_name
})
}

Terraformでワークショップ環境を作成する

この設定に基づいて、Terraformは以下のワークショップ環境を作成します:

  • 3つのアベイラビリティーゾーンにまたがるVPC
  • EKSクラスター
  • IAM OIDCプロバイダー
  • defaultという名前のマネージドノードグループ
  • プレフィックス委任を使用するように設定されたVPC CNI

Terraformファイルをダウンロードします:

~$mkdir -p ~/environment/terraform; cd ~/environment/terraform
~$curl --remote-name-all https://raw.githubusercontent.com/aws-samples/eks-workshop-v2/pull/1662/head/cluster/terraform/{main.tf,variables.tf,providers.tf,vpc.tf,eks.tf}

以下のTerraformコマンドを実行して、ワークショップ環境をデプロイします:

~$export EKS_CLUSTER_NAME=eks-workshop
~$terraform init
~$terraform apply -var="cluster_name=$EKS_CLUSTER_NAME" -auto-approve

このプロセスは通常、完了するまでに20〜25分かかります。

次のステップ

クラスターの準備ができたら、ラボのナビゲーションセクションに進むか、トップナビゲーションバーを使用してワークショップの任意のモジュールに直接進んでください。ワークショップが完了したら、以下の手順に従って環境をクリーンアップしてください。

クリーンアップ(ワークショップが終わったら実行するステップ)

警告

以下は、EKSクラスターの使用が終了した後、リソースをクリーンアップする方法を示しています。これらのステップを完了することで、AWSアカウントへのさらなる課金を防ぐことができます。

IDE環境を削除する前に、前のステップでセットアップしたクラスターをクリーンアップします。

まず、delete-environmentを使用して、サンプルアプリケーションと残っているラボのインフラストラクチャが削除されることを確認します:

~$delete-environment

次に、terraformを使用してクラスターを削除します:

~$cd ~/environment/terraform
~$terraform destroy -var="cluster_name=$EKS_CLUSTER_NAME" -auto-approve

これでクリーンアップに進んでIDEを片付けることができます。