Skip to content

Guide: Addon Service Activation

This guide walks you through activating F5 Distributed Cloud addon services using Terraform. By the end, you’ll understand how to:

  • Check activation eligibility - Determine if an addon can be activated
  • Activate self-service addons - Bot Defense, client-side Defense, etc.
  • Handle managed activation - Services requiring sales contact
  • Monitor activation status - Track subscription state changes

F5 Distributed Cloud addon services are additional security and performance features that can be activated for your tenant. These include:

Addon ServiceDescriptionTier Required
f5xc-bot-defense-standardProtect applications from automated attacksSTANDARD
f5xc-bot-defense-advancedBot defense with advanced ML detectionADVANCED
f5xc-client-side-defense-standardProtect against Magecart and formjackingSTANDARD
f5xc-waap-standardWeb App and API Protection with API DiscoverySTANDARD
f5xc-waap-advancedWAAP with full API security featuresADVANCED
f5xc-malicious-user-detectionIdentify malicious user behavior patternsADVANCED
f5xc-synthetic-monitoringMonitor application availabilitySTANDARD

Addon services have different activation types that determine how they can be activated:

┌─────────────────────────────────────────────────────────────────────┐
│ Activation Types │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ SELF-ACTIVATION │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Check Status │───►│ Create │───►│ Active │ │
│ │ (AS_NONE) │ │ Subscription │ │ (AS_SUBSCRIBED) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ User can activate directly via Terraform │
│ │
│ PARTIALLY MANAGED │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Check Status │───►│ Request │───►│ SRE Review │ │
│ │ (AS_NONE) │ │ Subscription │ │ (AS_PENDING) │ │
│ └──────────────┘ └──────────────┘ └──────┬───────┘ │
│ │ │
│ ┌──────▼───────┐ │
│ │ Active │ │
│ │ (AS_SUBSCRIBED) │ │
│ └──────────────┘ │
│ User initiates, SRE team processes │
│ │
│ FULLY MANAGED │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Contact │───►│ Sales │───►│ F5 Activates │ │
│ │ F5 Sales │ │ Agreement │ │ Addon │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ Requires sales engagement │
│ │
└─────────────────────────────────────────────────────────────────────┘

Before you begin, ensure you have:

  • Terraform >= 1.0 - The F5XC provider requires Terraform 1.0 or later
  • F5 Distributed Cloud Account - Sign up at https://www.f5.com/cloud/products/distributed-cloud-console
  • API Credentials - Token or P12 certificate authentication configured
  • Appropriate Subscription Tier - Most addon services require ADVANCED tier

Configure one of these authentication methods via environment variables:

Section titled “Option 1: API Token (Recommended for development)”
Terminal window
export F5XC_API_URL="https://your-tenant.console.ves.volterra.io"
export F5XC_API_TOKEN="your-api-token"
Section titled “Option 2: P12 Certificate (Recommended for production)”
Terminal window
export F5XC_API_URL="https://your-tenant.console.ves.volterra.io"
export F5XC_P12_FILE="/path/to/your-credentials.p12"
export F5XC_P12_PASSWORD="your-p12-password" # pragma: allowlist secret
Terminal window
git clone https://GitHub.com/robinmordasiewicz/terraform-provider-f5xc.git
cd terraform-provider-f5xc/examples/guides/addon-activation
Terminal window
cp terraform.tfvars.example terraform.tfvars

Edit terraform.tfvars to enable the addon services you want to activate:

# Enable Bot Defense activation
enable_bot_defense = true
# Enable client-side Defense
enable_client_side_defense = false
Terminal window
terraform init
terraform plan
terraform apply

Before attempting to activate an addon service, check if it’s available for your tenant.

# Check if Bot Defense can be activated
data "f5xc_addon_service_activation_status" "bot_defense" {
addon_service = "f5xc-bot-defense-standard"
}
output "bot_defense_status" {
value = {
state = data.f5xc_addon_service_activation_status.bot_defense.state
can_activate = data.f5xc_addon_service_activation_status.bot_defense.can_activate
message = data.f5xc_addon_service_activation_status.bot_defense.message
}
}
StateDescriptionCan Activate?
AS_NONEService not subscribedYes
AS_PENDINGActivation in progressNo (wait)
AS_SUBSCRIBEDAlready activeAlready done
AS_ERRORSubscription errorNo (contact support)
# Get detailed information about an addon service
data "f5xc_addon_service" "bot_defense" {
name = "f5xc-bot-defense-standard"
}
output "addon_details" {
value = {
display_name = data.f5xc_addon_service.bot_defense.display_name
tier = data.f5xc_addon_service.bot_defense.tier
activation_type = data.f5xc_addon_service.bot_defense.activation_type
}
}

For addon services with self activation type, you can activate directly via Terraform.

# Step 1: Check if we can activate
data "f5xc_addon_service_activation_status" "bot_defense" {
addon_service = "f5xc-bot-defense-standard"
}
# Step 2: Create subscription only if available
resource "f5xc_addon_subscription" "bot_defense" {
count = data.f5xc_addon_service_activation_status.bot_defense.can_activate && data.f5xc_addon_service_activation_status.bot_defense.state == "AS_NONE" ? 1 : 0
name = "bot-defense-subscription"
namespace = "system"
addon_service {
name = "f5xc-bot-defense-standard"
namespace = "shared"
}
}
output "activation_result" {
value = length(f5xc_addon_subscription.bot_defense) > 0 ? "Activated" : "Not activated (check status)"
}
locals {
# Define the addons you want to activate
addons_to_activate = [
"f5xc-bot-defense-standard",
"f5xc-client-side-defense-standard",
"f5xc-waap-standard",
]
}
# Check activation status for each
data "f5xc_addon_service_activation_status" "addons" {
for_each = toset(local.addons_to_activate)
addon_service = each.value
}
# Create subscriptions for available addons
resource "f5xc_addon_subscription" "addons" {
for_each = {
for addon in local.addons_to_activate :
addon => addon
if data.f5xc_addon_service_activation_status.addons[addon].can_activate && data.f5xc_addon_service_activation_status.addons[addon].state == "AS_NONE"
}
name = "${replace(replace(each.value, "f5xc-", ""), "-standard", "")}-subscription"
namespace = "system"
addon_service {
name = each.value
namespace = "shared"
}
}

Some addons may take time to activate, especially those with partial management. Here are patterns for handling this.

Pattern 1: Using terraform_data with Precondition

Section titled “Pattern 1: Using terraform_data with Precondition”
# Check status after subscription
data "f5xc_addon_service_activation_status" "bot_defense_status" {
addon_service = "f5xc-bot-defense-standard"
depends_on = [f5xc_addon_subscription.bot_defense]
}
# Validate activation succeeded
resource "terraform_data" "validate_activation" {
lifecycle {
precondition {
condition = data.f5xc_addon_service_activation_status.bot_defense_status.state == "AS_SUBSCRIBED"
error_message = "Bot Defense activation not yet complete. Current state: ${data.f5xc_addon_service_activation_status.bot_defense_status.state}"
}
}
}

Pattern 2: Using time_sleep for Simple Delays

Section titled “Pattern 2: Using time_sleep for Simple Delays”
resource "f5xc_addon_subscription" "bot_defense" {
name = "bot-defense-subscription"
namespace = "system"
addon_service {
name = "f5xc-bot-defense-standard"
namespace = "shared"
}
}
# Wait for activation to propagate
resource "time_sleep" "wait_for_activation" {
depends_on = [f5xc_addon_subscription.bot_defense]
create_duration = "30s"
}
# Use the addon feature after waiting
resource "f5xc_http_loadbalancer" "with_bot_defense" {
depends_on = [time_sleep.wait_for_activation]
# ... configuration with bot defense enabled
}

For critical deployments, you may want to verify activation before proceeding:

resource "null_resource" "verify_activation" {
depends_on = [f5xc_addon_subscription.bot_defense]
provisioner "local-exec" {
command = <<-EOT
for i in {1..30}; do
status=$(curl -s -H "Authorization: APIToken $F5XC_API_TOKEN" \
"$F5XC_API_URL/api/web/namespaces/system/addon_services/f5xc-bot-defense-standard/activation-status" \
| jq -r '.state')
if [ "$status" = "AS_SUBSCRIBED" ]; then
echo "Activation complete!"
exit 0
fi
echo "Waiting for activation... (attempt $i/30, status: $status)"
sleep 10
done
echo "Activation timeout"
exit 1
EOT
}
}

For addon services requiring sales contact, use Terraform to monitor status after F5 activates the service.

# For managed addons, just check status (don't try to create subscription)
data "f5xc_addon_service_activation_status" "managed_addon" {
addon_service = "some_managed_addon"
}
output "managed_addon_status" {
value = {
active = data.f5xc_addon_service_activation_status.managed_addon.state == "AS_SUBSCRIBED"
message = data.f5xc_addon_service_activation_status.managed_addon.message
}
}
# Use conditional logic based on activation status
resource "f5xc_http_loadbalancer" "with_managed_feature" {
count = data.f5xc_addon_service_activation_status.managed_addon.state == "AS_SUBSCRIBED" ? 1 : 0
# Configuration that uses the managed addon feature
name = "lb-with-managed-addon"
namespace = "production"
# ... rest of configuration
}

Once an addon is activated, you can use its features in your configurations.

resource "f5xc_http_loadbalancer" "with_bot_defense" {
depends_on = [f5xc_addon_subscription.bot_defense]
name = "my-protected-app"
namespace = "production"
domains = ["app.example.com"]
default_route_pools {
pool {
name = f5xc_origin_pool.backend.name
namespace = "production"
}
weight = 1
}
# Enable Bot Defense
bot_defense {
policy {
name = "my-bot-policy"
namespace = "shared"
}
}
http {
port = 80
}
}
resource "f5xc_http_loadbalancer" "with_csd" {
depends_on = [f5xc_addon_subscription.client_side_defense]
name = "my-protected-app"
namespace = "production"
domains = ["app.example.com"]
# Enable client-side Defense
enable_client_side_defense = true
# ... rest of configuration
}
  • Verify your API token has addon management permissions
  • Check that your subscription tier supports the addon
  • For partially managed addons, contact F5 support
  • For self-activation, wait and retry after a few minutes
  • Check F5XC console for detailed error messages
  • Contact F5 support with your tenant ID
# Output detailed status for debugging
output "debug_addon_status" {
value = {
addon_service = "f5xc-bot-defense-standard"
state = data.f5xc_addon_service_activation_status.bot_defense.state
can_activate = data.f5xc_addon_service_activation_status.bot_defense.can_activate
message = data.f5xc_addon_service_activation_status.bot_defense.message
}
}
  1. Always check eligibility first - Use the activation status data source before attempting activation
  2. Use conditional resource creation - Only create subscriptions when can_activate is true
  3. Handle dependencies properly - Use depends_on to ensure addons are active before using features
  4. Monitor activation state - For partially managed addons, monitor the state for completion
  5. Document addon requirements - Clearly document which addons your configuration requires

See the addon-activation example for a complete, working Terraform configuration.