VMware Cloud on AWS SDDC を Terraform で作成する

VMware Cloud on AWS の SDDC は様々な方法で作成できます。
2023.03.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大家好,AWS事業本部の西野です。

VMware Cloud on AWS の SDDC を Terraform で作成してみました。

VMware が公式で提供している VMware Cloud on AWS Provider を使用していきます。

事前準備

VMware Cloud on AWS Provider を使用するためには API トークンおよび 組織ID が必要です。

API トークンの取得

API トークンの取得方法については以下のブログをご参照ください。

VMware Cloud on AWS の SDDC を CLI から操作する | DevelopersIO

組織 ID の確認

VMware の CSP ポータルにログインし、画面右上部のユーザー名・組織名が書かれている部分をクリックします。

組織名が表示されている部分の下に組織 ID があります。

サンプルコード

provider.tf

provider.tf

terraform {
  required_providers {
    vmc = {
      source  = "vmware/vmc"
      version = "1.13.0"
    }
  }
}

provider "vmc" {
  refresh_token = var.api_token
  org_id        = var.org_id
}

Provider の引数には前項で取得した API トークンと組織 ID を指定します。

main.tf

main.tf

resource "vmc_sddc" "sddc_1" {
  sddc_name           = var.sddc_name
  vpc_cidr            = var.vpc_cidr
  num_host            = 2
  provider_type       = "AWS"
  region              = var.sddc_region
  skip_creating_vxlan = false
  delay_account_link  = false
  host_instance_type  = "I3_METAL"
  account_link_sddc_config {
    customer_subnet_ids  = [var.customer_subnet_ids[0]]
    connected_account_id = data.vmc_connected_accounts.my_accounts.id
  }
}

data "vmc_connected_accounts" "my_accounts" {
  account_number = var.aws_account_number
}

i3.metal 2 ノードの SDDC を作成するサンプルです。

注意するべきなのは account_link_sddc_config における customer_subnet_ids の指定です。

customer_subnet_ids には list(string) 型を渡してあげる必要があります。ストレッチクラスターを利用する場合は接続先のサブネットが2つになるためです。今回は Single AZ で作成するので、 list の中に1つだけサブネット ID を含め先頭の要素を指定してあげています。

(実際の中身については後述する terraform.tfvars をご参照ください。)

connected_account_idにはリンク先 AWS アカウントに紐付けられた UUID を指定してあげる必要があります。当初、12桁の AWS アカウント ID を直接記述したところ、Bad request になり apply が失敗してしまいました。

当該 UUID は Data Source である vmc_connected_accounts の属性になっているのでそこから引っ張ってきましょう。

variables.tf

variables.tf

variable "api_token" {
    description = "API token is used to authenticate when calling VMware Cloud Services APIs."
    type        = string
}
variable "org_id" {
    description = "Organization Identifier."
    type        = string
}

variable "sddc_name" {
    description = "Name of the SDDC."
    type        = string
}
variable "vpc_cidr" {
    description = "(Optional) SDDC management network CIDR."
    type        = string
    default     = "10.2.0.0/16"
}
variable "sddc_region" {
    description = "The region of the cloud resources to work in."
    type        = string
}
variable "customer_subnet_ids" {
    description = "VPC subnet used for ENI connectivity."
    type        = list(string)
}
variable "aws_account_number" {
    description = "AWS Account ID."
    type        = string
}

今回作成するリソースに必要な variables を定義しています。(特筆すべき点はなし)

terraform.tfvars

terraform.tfvars

api_token = "_87IYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxXX"
org_id = "exxxxxxx-aaaa-bbbb-cccc-123456789012"

sddc_name = "Classmethod True Trial SDDC"
sddc_region         = "ap-northeast-1"
aws_account_number  = "123456789012"
customer_subnet_ids = ["subnet-0f7661cXXXXXXXXXX"]

冒頭で確認した API トークンと組織 ID をこのように指定します。

customer_subnet_idsは先述したとおり list(string) 型として記述してあげます。

参考

Docs overview | vmware/vmc | Terraform Registry

終わりに

このブログがほんの少しでも世界を良くできれば嬉しいです。 AWS事業本部の西野 (@xiyegen) がお送りしました。