すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Terraform を使用した ACK Serverless Kubernetes クラスターの作成

最終更新日:Dec 23, 2025

本トピックでは、Terraform を使用して ACK Serverless Kubernetes クラスターを作成する方法について説明します。

説明

本トピックのサンプルコードは、ワンクリックで実行できます。ワンクリックで実行

前提条件

  • Container Service for Kubernetes が有効化されていること。Terraform を使用して ACK を有効化する方法については、Terraform を使用した ACK の有効化とロールへの権限付与をご参照ください。

  • ログインに使用する Resource Access Management (RAM) ユーザーAccessKey ペアが作成されていること。

    説明

    デフォルトでは、Alibaba Cloud アカウント (root ユーザー) は、そのアカウントに属するすべてのリソースに対する完全な権限を持っています。資格情報が漏洩した場合の潜在的なセキュリティリスクを最小限に抑えるため、リソース権限が制限されている RAM アカウントを使用することを推奨します。

  • Terraform でコマンドを実行するために使用する RAM ユーザーに、次のポリシーがアタッチされていること。このポリシーには、Terraform でコマンドを実行するために必要な最小限の権限が含まれています。詳細については、RAM ユーザーへの権限付与をご参照ください。

    このアクセスポリシーにより、RAM ユーザーは VPC (Virtual Private Cloud)、vSwitch、セキュリティグループ、および ACK クラスターの作成、表示、削除が可能になります。

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "vpc:CreateVpc",
                    "vpc:CreateVSwitch",
                    "vpc:DescribeVpcAttribute",
                    "vpc:DescribeRouteTableList",
                    "vpc:DescribeVSwitchAttributes",
                    "ecs:CreateSecurityGroup",
                    "ecs:ModifySecurityGroupPolicy",
                    "ecs:DescribeSecurityGroups",
                    "ecs:DescribeSecurityGroupAttribute",
                    "ecs:ListTagResources",
                    "cs:CreateCluster",
                    "cs:DescribeTaskInfo",
                    "cs:DescribeClusterDetail",
                    "vpc:DeleteVpc",
                    "vpc:DeleteVSwitch",
                    "cs:DeleteCluster",
                    "ecs:DeleteSecurityGroup"
                ],
                "Resource": "*"
            }
        ]
    }
  • Terraform のランタイム環境は、次のいずれかの方法で準備します。

    • Explorer:Alibaba Cloud は Terraform のオンラインランタイム環境を提供します。インストール不要で、環境にログインして Terraform を使用できます。低コスト、高効率、かつ便利な方法で Terraform を使用およびデバッグする必要があるシナリオに適しています。

    • Cloud Shell:Cloud Shell には Terraform がプリインストールされており、認証情報も設定済みです。Cloud Shell で Terraform コマンドを実行できます。低コスト、高効率、かつ便利な方法で Terraform を使用およびアクセスする必要があるシナリオに適しています。

    • ローカルマシンへの Terraform のインストールと設定:ネットワーク接続が不安定な場合や、カスタム開発環境が必要なシナリオに適しています。

    重要

    Terraform のバージョンが 0.12.28 以降であることを確認してください。terraform --version コマンドを実行してバージョンを確認できます。

リソース

説明

本トピックの一部のリソースには料金が発生します。不要になったリソースは、予期しない課金を避けるためにリリースしてください。

Terraform を使用した ACK Serverless Kubernetes クラスターの作成

  1. 作業ディレクトリを作成します。作業ディレクトリに main.tf という名前の設定ファイルを作成し、次のコードを main.tf ファイルにコピーします。

    provider "alicloud" {
      region = var.region_id
    }
    
    variable "region_id" {
      type    = string
      default = "cn-shenzhen"
    }
    
    variable "cluster_spec" {
      type        = string
      description = "The cluster specifications of kubernetes cluster,which can be empty. Valid values:ack.standard : Standard managed clusters; ack.pro.small : Professional managed clusters."
      default     = "ack.pro.small"
    }
    
    variable "k8s_name_prefix" {
      description = "The name prefix used to create ASK cluster."
      default     = "ask-example"
    }
    
    variable "ack_version" {
      type        = string
      description = "Desired Kubernetes version. "
      default     = "1.31.1-aliyun.1"
    }
    
    # デフォルトのリソース名。
    locals {
      k8s_name_ask = substr(join("-", [var.k8s_name_prefix, "ask"]), 0, 63)
      new_vpc_name = "tf-vpc-172-16"
      new_vsw_name = "tf-vswitch-172-16-0"
      new_sg_name  = "tf-sg-172-16"
    }
    
    data "alicloud_eci_zones" "default" {}
    
    resource "alicloud_vpc" "vpc" {
      vpc_name   = local.new_vpc_name
      cidr_block = "172.16.0.0/12"
    }
    
    resource "alicloud_vswitch" "vsw" {
      vswitch_name = local.new_vsw_name
      vpc_id       = alicloud_vpc.vpc.id
      cidr_block   = cidrsubnet(alicloud_vpc.vpc.cidr_block, 8, 8)
      zone_id      = data.alicloud_eci_zones.default.zones.0.zone_ids.0
    }
    
    resource "alicloud_security_group" "group" {
      security_group_name = local.new_sg_name
      vpc_id              = alicloud_vpc.vpc.id
    }
    
    resource "alicloud_cs_serverless_kubernetes" "serverless" {
      name                           = local.k8s_name_ask
      version                        = var.ack_version # この値を、作成したいクラスターのバージョンに置き換えます。
      cluster_spec                   = var.cluster_spec
      vpc_id                         = alicloud_vpc.vpc.id
      vswitch_ids                    = split(",", join(",", alicloud_vswitch.vsw.*.id))
      new_nat_gateway                = true
      endpoint_public_access_enabled = true
      deletion_protection            = false
      security_group_id              = alicloud_security_group.group.id
      # RRSA を使用して ServiceAccount を設定します。
      enable_rrsa             = true
      time_zone               = "Asia/Shanghai"
      service_cidr            = "10.13.0.0/16"
      service_discovery_types = ["CoreDNS"]
    
      # タグ
      tags = {
        "cluster" = "ack-serverless"
      }
      # アドオン
      addons {
        name = "nginx-ingress-controller"
        # インターネットを使用します。
        config = "{\"IngressSlbNetworkType\":\"internet\",\"IngressSlbSpec\":\"slb.s2.small\"}"
        # イントラネットを使用する場合は、次の設定を使用します。
        # config = "{\"IngressSlbNetworkType\":\"intranet\",\"IngressSlbSpec\":\"slb.s2.small\"}"
      }
      addons {
        name = "metrics-server"
      }
      addons {
        name = "knative"
      }
      addons {
        name = "managed-arms-prometheus"
      }
      addons {
        name = "logtail-ds"
        # sls_project_name を指定します。
        # config = "{\"sls_project_name\":\"<ご利用のSLSプロジェクト名>}\"}"
      }
    }
  2. 次のコマンドを実行して、Terraform ランタイム環境を初期化します。

    terraform init

    次の出力は、Terraform が初期化されたことを示します。

    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
  3. 次のコマンドを実行して、実行計画を作成します。

    terraform plan

    次の出力は、実行計画が作成されたことを示します。作成されるリソースの詳細をプレビューできます。

    Refreshing Terraform state in-memory prior to plan...
    The refreshed state will be used to calculate this plan, but will not be
    persisted to local or remote state storage.
    ...
    Plan: 4 to add, 0 to change, 0 to destroy. 
    ...
  4. 次のコマンドを実行して、クラスターを作成します。

    terraform apply

    プロンプトが表示されたら、yes と入力して Enter キーを押します。コマンドが完了するまで待ちます。次の出力は、ACK クラスターが作成されたことを示します。

    ...
    Do you want to perform these actions?
      Terraform will perform the actions described above.
      Only 'yes' will be accepted to approve.
    
      Enter a value: yes
    ...
    alicloud_cs_serverless_kubernetes.serverless: Creation complete after 8m26s [id=************]
    
    Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
  5. 検証結果

    terraform show コマンドの実行

    次のコマンドを実行して、Terraform によって作成されたリソースの詳細を表示できます。

    terraform show

    ACK コンソールへのログイン

    Container Service for Kubernetes コンソールにログインして、作成されたクラスターを表示します。

リソースのクリーンアップ

本トピックで作成したリソースが不要になった場合は、terraform destroy コマンドを実行してリソースをリリースします。terraform destroy コマンドの詳細については、一般的なコマンドをご参照ください。

terraform destroy

完全な例

説明

本トピックのサンプルコードは、ワンクリックで実行できます。ワンクリックで実行

provider "alicloud" {
  region = var.region_id
}

variable "region_id" {
  type    = string
  default = "cn-shenzhen"
}

variable "cluster_spec" {
  type        = string
  description = "The cluster specifications of kubernetes cluster,which can be empty. Valid values:ack.standard : Standard managed clusters; ack.pro.small : Professional managed clusters."
  default     = "ack.pro.small"
}

variable "k8s_name_prefix" {
  description = "The name prefix used to create ASK cluster."
  default     = "ask-example"
}

variable "ack_version" {
  type        = string
  description = "Desired Kubernetes version. "
  default     = "1.31.1-aliyun.1"
}

# デフォルトのリソース名。
locals {
  k8s_name_ask = substr(join("-", [var.k8s_name_prefix, "ask"]), 0, 63)
  new_vpc_name = "tf-vpc-172-16"
  new_vsw_name = "tf-vswitch-172-16-0"
  new_sg_name  = "tf-sg-172-16"
}

data "alicloud_eci_zones" "default" {}

resource "alicloud_vpc" "vpc" {
  vpc_name   = local.new_vpc_name
  cidr_block = "172.16.0.0/12"
}

resource "alicloud_vswitch" "vsw" {
  vswitch_name = local.new_vsw_name
  vpc_id       = alicloud_vpc.vpc.id
  cidr_block   = cidrsubnet(alicloud_vpc.vpc.cidr_block, 8, 8)
  zone_id      = data.alicloud_eci_zones.default.zones.0.zone_ids.0
}

resource "alicloud_security_group" "group" {
  security_group_name   = local.new_sg_name
  vpc_id = alicloud_vpc.vpc.id
}

resource "alicloud_cs_serverless_kubernetes" "serverless" {
  name                           = local.k8s_name_ask
  version                        = var.ack_version # この値を、作成したいクラスターのバージョンに置き換えます。
  cluster_spec                   = var.cluster_spec
  vpc_id                         = alicloud_vpc.vpc.id
  vswitch_ids                    = split(",", join(",", alicloud_vswitch.vsw.*.id))
  new_nat_gateway                = true
  endpoint_public_access_enabled = true
  deletion_protection            = false
  security_group_id              = alicloud_security_group.group.id
  # RRSA を使用して ServiceAccount を設定します。
  enable_rrsa             = true
  time_zone               = "Asia/Shanghai"
  service_cidr            = "10.13.0.0/16"
  service_discovery_types = ["CoreDNS"]

  # タグ
  tags = {
    "cluster" = "ack-serverless"
  }
  # アドオン
  addons {
    name = "nginx-ingress-controller"
    # インターネットを使用します。
    config = "{\"IngressSlbNetworkType\":\"internet\",\"IngressSlbSpec\":\"slb.s2.small\"}"
    # イントラネットを使用する場合は、次の設定を使用します。
    # config = "{\"IngressSlbNetworkType\":\"intranet\",\"IngressSlbSpec\":\"slb.s2.small\"}"
  }
  addons {
    name = "metrics-server"
  }
  addons {
    name = "knative"
  }
  addons {
    name = "managed-arms-prometheus"
  }
  addons {
    name = "logtail-ds"
    # sls_project_name を指定します。
    # config = "{\"sls_project_name\":\"<ご利用のSLSプロジェクト名>}\"}"
  }
}