Terraform provider for Excloud compute, storage, networking, object-storage, DNS, IAM, Stream, and Email resources.
Use it to provision virtual machines, block volumes, snapshots, public IPv4 reservations, security groups, SSH keys, DNS zones, S3-compatible buckets, IAM service accounts and policies, Stream (Kafka) clusters/topics/users/ACLs, and Email sender domains/templates/SMTP credentials from Terraform.
excloud_ssh_keyexcloud_compute_instanceexcloud_volumeexcloud_snapshotexcloud_public_ipv4excloud_volume_attachmentexcloud_security_groupexcloud_security_group_ruleexcloud_security_group_bindingexcloud_bucketexcloud_bucket_access_keyexcloud_dns_zoneexcloud_dns_recordexcloud_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_suppression
excloud_compute_imagesexcloud_instance_typesexcloud_subnetsexcloud_snapshotsexcloud_bucketsexcloud_bucket_usageexcloud_dns_zonesexcloud_iam_service_accountsexcloud_iam_policiesexcloud_iam_policy_bindings
terraform {
required_providers {
excloud = {
source = "excloud-dev/excloud"
version = "~> 0.5"
}
}
}
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)
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_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_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