Terraform provider for Excloud compute, storage, networking, object-storage, DNS, IAM, Stream, Email, Secrets, and managed Kubernetes resources.
Use it to provision virtual machines, compute subnets, block volumes, snapshots, public IPv4 reservations, security groups, SSH keys, DNS zones, S3-compatible buckets, IAM API keys/service accounts/policies, Stream (Kafka) clusters/topics/users/ACLs, Email sender domains/templates/SMTP credentials, write-only Secrets, and managed Kubernetes clusters/workers from Terraform.
excloud_ssh_keyexcloud_compute_instanceexcloud_volumeexcloud_snapshotexcloud_public_ipv4excloud_volume_attachmentexcloud_security_groupexcloud_security_group_ruleexcloud_security_group_bindingexcloud_subnetexcloud_bucketexcloud_bucket_access_keyexcloud_dns_zoneexcloud_dns_recordexcloud_iam_api_keyexcloud_iam_service_accountexcloud_iam_policyexcloud_iam_policy_bindingexcloud_stream_clusterexcloud_stream_topicexcloud_stream_userexcloud_stream_aclexcloud_email_domainexcloud_email_templateexcloud_email_smtp_credentialexcloud_email_configuration_setexcloud_email_suppressionexcloud_secretexcloud_k8s_clusterexcloud_k8s_worker
excloud_compute_imagesexcloud_instance_typesexcloud_subnetsexcloud_snapshotsexcloud_bucketsexcloud_bucket_usageexcloud_dns_zonesexcloud_iam_service_accountsexcloud_iam_policiesexcloud_iam_policy_bindingsexcloud_k8s_clustersexcloud_k8s_instance_typesexcloud_k8s_kubeconfig
terraform {
required_providers {
excloud = {
source = "excloud-dev/excloud"
version = "~> 0.9"
}
}
}
provider "excloud" {
# Optional. If omitted, the provider uses environment variables or
# ~/.exc/config from `exc login` / the selected exc account and org.
# api_key = var.excloud_api_key
# org_id = var.excloud_org_id
}The provider uses the same credentials for compute, buckets, DNS, IAM, Stream, Email, and all other resources/data sources. Resolution order is:
- Explicit provider attributes.
- Environment variables.
~/.exc/config, as written by theexcCLI. When this fallback is used, the provider readsdefault_acc,default_org, that account'sid_token, and that org'saccess_token.
Supported attributes and corresponding environment variables:
api_key/API_KEY/EXCLOUD_API_KEY/EXCLOUD_ACCESS_TOKEN/ACCESS_TOKEN/ selected~/.exc/configorg access tokenid_token/ID_TOKEN/EXCLOUD_ID_TOKEN/ selected~/.exc/configaccount ID tokenaccount_id/ACCOUNT_ID/EXCLOUD_ACCOUNT_ID/~/.exc/configdefault_accorg_id/ORG_ID/EXCLOUD_ORG_ID/~/.exc/configdefault_orgcompute_base_url/EXCLOUD_COMPUTE_BASE_URLbuckets_base_url/EXCLOUD_BUCKETS_BASE_URLiam_base_url/EXCLOUD_IAM_BASE_URLdns_base_url/EXCLOUD_DNS_BASE_URLstream_base_url/EXCLOUD_STREAM_BASE_URL(defaults tohttps://stream.excloud.dev)email_base_url/EXCLOUD_EMAIL_BASE_URL(defaults tohttps://email.excloud.dev)secrets_base_url/EXCLOUD_SECRETS_BASE_URL(defaults tohttps://secrets.excloud.dev)k8s_base_url/EXCLOUD_K8S_BASE_URL(defaults to the K8s SDK endpoint)
variable "database_password" {
type = string
sensitive = true
}
resource "excloud_secret" "database_password" {
path = "/app/database/password"
value = var.database_password
}
# Sensitive marks the value for Terraform UI redaction; it does not encrypt
# state. Use an encrypted/protected Terraform state backend.
resource "excloud_ssh_key" "main" {
name = "main-key"
public_key = file("~/.ssh/id_ed25519.pub")
}
resource "excloud_volume" "data" {
name = "app-data"
zone_id = 1
size_gib = 20
}
resource "excloud_subnet" "private" {
name = "private-subnet"
zone_id = 1
ipv4_cidr = "10.1.0.0/16"
disable_ipv4_public_ip = true
}
resource "excloud_snapshot" "data" {
volume_id = tonumber(excloud_volume.data.id)
}
resource "excloud_bucket" "assets" {
name = "my-assets-bucket"
is_public = false
}
resource "excloud_dns_zone" "example" {
name = "example.com"
zone_type = "public"
}
resource "excloud_dns_record" "www" {
zone_name = excloud_dns_zone.example.name
name = "www"
type = "A"
value = "203.0.113.10"
ttl = 3600
}
resource "excloud_iam_service_account" "worker" {
name = "terraform-worker"
}
resource "excloud_iam_api_key" "terraform" {}
output "iam_api_key_access_token" {
value = excloud_iam_api_key.terraform.access_token
sensitive = true
}
resource "excloud_iam_policy" "compute_read" {
name = "terraform-compute-read"
policy_json = jsonencode({
Version = "2024-03-05"
Statements = [{
Effect = "Allow"
Action = ["compute:instance:list"]
Resource = ["*"]
}]
})
}
resource "excloud_iam_policy_binding" "worker_compute_read" {
policy_id = tonumber(excloud_iam_policy.compute_read.id)
service_account_id = tonumber(excloud_iam_service_account.worker.id)
}./scripts/check.shManual equivalent:
go test ./...
go test -tags=acc ./internal/provider -run TestAcc -count=0
go build -o terraform-provider-excloud
rm -f terraform-provider-excloudCreate a Terraform CLI config file, for example /tmp/excloud.tfrc:
provider_installation {
dev_overrides {
"excloud-dev/excloud" = "/absolute/path/to/terraform-provider-excloud"
}
direct {}
}Then run Terraform with:
TF_CLI_CONFIG_FILE=/tmp/excloud.tfrc terraform plan -input=false