The azure-native:redis:Redis resource, part of the Pulumi Azure Native provider, provisions Azure Cache for Redis instances with SKU selection, network placement, and clustering configuration. This guide focuses on three capabilities: Premium SKU deployment with VNet isolation, availability zone configuration, and Redis version management.
Redis caches require a resource group and may reference VNet subnets for private deployment. The examples are intentionally small. Combine them with your own VNet infrastructure, access policies, and monitoring configuration.
Deploy a Premium cache with VNet isolation and clustering
Production deployments often require network isolation and horizontal scaling through sharding and read replicas.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const redis = new azure_native.redis.Redis("redis", {
enableNonSslPort: true,
location: "East US",
minimumTlsVersion: azure_native.redis.TlsVersion.TlsVersion_1_2,
name: "cache1",
redisConfiguration: {
maxmemoryPolicy: "allkeys-lru",
},
redisVersion: "4",
replicasPerPrimary: 2,
resourceGroupName: "rg1",
shardCount: 2,
sku: {
capacity: 1,
family: azure_native.redis.SkuFamily.P,
name: azure_native.redis.SkuName.Premium,
},
staticIP: "192.168.0.5",
subnetId: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1",
zones: ["1"],
});
import pulumi
import pulumi_azure_native as azure_native
redis = azure_native.redis.Redis("redis",
enable_non_ssl_port=True,
location="East US",
minimum_tls_version=azure_native.redis.TlsVersion.TLS_VERSION_1_2,
name="cache1",
redis_configuration={
"maxmemory_policy": "allkeys-lru",
},
redis_version="4",
replicas_per_primary=2,
resource_group_name="rg1",
shard_count=2,
sku={
"capacity": 1,
"family": azure_native.redis.SkuFamily.P,
"name": azure_native.redis.SkuName.PREMIUM,
},
static_ip="192.168.0.5",
subnet_id="/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1",
zones=["1"])
package main
import (
redis "github.com/pulumi/pulumi-azure-native-sdk/redis/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := redis.NewRedis(ctx, "redis", &redis.RedisArgs{
EnableNonSslPort: pulumi.Bool(true),
Location: pulumi.String("East US"),
MinimumTlsVersion: pulumi.String(redis.TlsVersion_1_2),
Name: pulumi.String("cache1"),
RedisConfiguration: &redis.RedisCommonPropertiesRedisConfigurationArgs{
MaxmemoryPolicy: pulumi.String("allkeys-lru"),
},
RedisVersion: pulumi.String("4"),
ReplicasPerPrimary: pulumi.Int(2),
ResourceGroupName: pulumi.String("rg1"),
ShardCount: pulumi.Int(2),
Sku: &redis.SkuArgs{
Capacity: pulumi.Int(1),
Family: pulumi.String(redis.SkuFamilyP),
Name: pulumi.String(redis.SkuNamePremium),
},
StaticIP: pulumi.String("192.168.0.5"),
SubnetId: pulumi.String("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1"),
Zones: pulumi.StringArray{
pulumi.String("1"),
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var redis = new AzureNative.Redis.Redis("redis", new()
{
EnableNonSslPort = true,
Location = "East US",
MinimumTlsVersion = AzureNative.Redis.TlsVersion.TlsVersion_1_2,
Name = "cache1",
RedisConfiguration = new AzureNative.Redis.Inputs.RedisCommonPropertiesRedisConfigurationArgs
{
MaxmemoryPolicy = "allkeys-lru",
},
RedisVersion = "4",
ReplicasPerPrimary = 2,
ResourceGroupName = "rg1",
ShardCount = 2,
Sku = new AzureNative.Redis.Inputs.SkuArgs
{
Capacity = 1,
Family = AzureNative.Redis.SkuFamily.P,
Name = AzureNative.Redis.SkuName.Premium,
},
StaticIP = "192.168.0.5",
SubnetId = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1",
Zones = new[]
{
"1",
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.redis.Redis;
import com.pulumi.azurenative.redis.RedisArgs;
import com.pulumi.azurenative.redis.inputs.RedisCommonPropertiesRedisConfigurationArgs;
import com.pulumi.azurenative.redis.inputs.SkuArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var redis = new Redis("redis", RedisArgs.builder()
.enableNonSslPort(true)
.location("East US")
.minimumTlsVersion("1.2")
.name("cache1")
.redisConfiguration(RedisCommonPropertiesRedisConfigurationArgs.builder()
.maxmemoryPolicy("allkeys-lru")
.build())
.redisVersion("4")
.replicasPerPrimary(2)
.resourceGroupName("rg1")
.shardCount(2)
.sku(SkuArgs.builder()
.capacity(1)
.family("P")
.name("Premium")
.build())
.staticIP("192.168.0.5")
.subnetId("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1")
.zones("1")
.build());
}
}
resources:
redis:
type: azure-native:redis:Redis
properties:
enableNonSslPort: true
location: East US
minimumTlsVersion: '1.2'
name: cache1
redisConfiguration:
maxmemoryPolicy: allkeys-lru
redisVersion: '4'
replicasPerPrimary: 2
resourceGroupName: rg1
shardCount: 2
sku:
capacity: 1
family: P
name: Premium
staticIP: 192.168.0.5
subnetId: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1
zones:
- '1'
The sku property selects the Premium tier, which supports VNet injection and clustering. The subnetId places the cache in a private subnet, isolating it from public internet access. The shardCount property enables horizontal scaling by distributing data across multiple Redis nodes, while replicasPerPrimary adds read replicas for each primary shard. The zones property pins the cache to specific availability zones, and staticIP assigns a fixed private IP address within the subnet.
Enable automatic zone redundancy for high availability
Teams that need zone redundancy without managing zone assignments can let Azure automatically distribute cache nodes.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const redis = new azure_native.redis.Redis("redis", {
enableNonSslPort: true,
location: "East US",
minimumTlsVersion: azure_native.redis.TlsVersion.TlsVersion_1_2,
name: "cache1",
redisConfiguration: {
maxmemoryPolicy: "allkeys-lru",
},
replicasPerPrimary: 2,
resourceGroupName: "rg1",
shardCount: 2,
sku: {
capacity: 1,
family: azure_native.redis.SkuFamily.P,
name: azure_native.redis.SkuName.Premium,
},
staticIP: "192.168.0.5",
subnetId: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1",
zonalAllocationPolicy: azure_native.redis.ZonalAllocationPolicy.Automatic,
});
import pulumi
import pulumi_azure_native as azure_native
redis = azure_native.redis.Redis("redis",
enable_non_ssl_port=True,
location="East US",
minimum_tls_version=azure_native.redis.TlsVersion.TLS_VERSION_1_2,
name="cache1",
redis_configuration={
"maxmemory_policy": "allkeys-lru",
},
replicas_per_primary=2,
resource_group_name="rg1",
shard_count=2,
sku={
"capacity": 1,
"family": azure_native.redis.SkuFamily.P,
"name": azure_native.redis.SkuName.PREMIUM,
},
static_ip="192.168.0.5",
subnet_id="/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1",
zonal_allocation_policy=azure_native.redis.ZonalAllocationPolicy.AUTOMATIC)
package main
import (
redis "github.com/pulumi/pulumi-azure-native-sdk/redis/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := redis.NewRedis(ctx, "redis", &redis.RedisArgs{
EnableNonSslPort: pulumi.Bool(true),
Location: pulumi.String("East US"),
MinimumTlsVersion: pulumi.String(redis.TlsVersion_1_2),
Name: pulumi.String("cache1"),
RedisConfiguration: &redis.RedisCommonPropertiesRedisConfigurationArgs{
MaxmemoryPolicy: pulumi.String("allkeys-lru"),
},
ReplicasPerPrimary: pulumi.Int(2),
ResourceGroupName: pulumi.String("rg1"),
ShardCount: pulumi.Int(2),
Sku: &redis.SkuArgs{
Capacity: pulumi.Int(1),
Family: pulumi.String(redis.SkuFamilyP),
Name: pulumi.String(redis.SkuNamePremium),
},
StaticIP: pulumi.String("192.168.0.5"),
SubnetId: pulumi.String("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1"),
ZonalAllocationPolicy: pulumi.String(redis.ZonalAllocationPolicyAutomatic),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var redis = new AzureNative.Redis.Redis("redis", new()
{
EnableNonSslPort = true,
Location = "East US",
MinimumTlsVersion = AzureNative.Redis.TlsVersion.TlsVersion_1_2,
Name = "cache1",
RedisConfiguration = new AzureNative.Redis.Inputs.RedisCommonPropertiesRedisConfigurationArgs
{
MaxmemoryPolicy = "allkeys-lru",
},
ReplicasPerPrimary = 2,
ResourceGroupName = "rg1",
ShardCount = 2,
Sku = new AzureNative.Redis.Inputs.SkuArgs
{
Capacity = 1,
Family = AzureNative.Redis.SkuFamily.P,
Name = AzureNative.Redis.SkuName.Premium,
},
StaticIP = "192.168.0.5",
SubnetId = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1",
ZonalAllocationPolicy = AzureNative.Redis.ZonalAllocationPolicy.Automatic,
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.redis.Redis;
import com.pulumi.azurenative.redis.RedisArgs;
import com.pulumi.azurenative.redis.inputs.RedisCommonPropertiesRedisConfigurationArgs;
import com.pulumi.azurenative.redis.inputs.SkuArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var redis = new Redis("redis", RedisArgs.builder()
.enableNonSslPort(true)
.location("East US")
.minimumTlsVersion("1.2")
.name("cache1")
.redisConfiguration(RedisCommonPropertiesRedisConfigurationArgs.builder()
.maxmemoryPolicy("allkeys-lru")
.build())
.replicasPerPrimary(2)
.resourceGroupName("rg1")
.shardCount(2)
.sku(SkuArgs.builder()
.capacity(1)
.family("P")
.name("Premium")
.build())
.staticIP("192.168.0.5")
.subnetId("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1")
.zonalAllocationPolicy("Automatic")
.build());
}
}
resources:
redis:
type: azure-native:redis:Redis
properties:
enableNonSslPort: true
location: East US
minimumTlsVersion: '1.2'
name: cache1
redisConfiguration:
maxmemoryPolicy: allkeys-lru
replicasPerPrimary: 2
resourceGroupName: rg1
shardCount: 2
sku:
capacity: 1
family: P
name: Premium
staticIP: 192.168.0.5
subnetId: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1
zonalAllocationPolicy: Automatic
The zonalAllocationPolicy property controls how Azure assigns availability zones. Setting it to “Automatic” enables zone redundancy and lets Azure select zones based on regional availability and capacity. This differs from the user-defined approach where you explicitly specify zones; automatic allocation adapts to Azure’s infrastructure without requiring you to track zone availability.
Pin to the latest Redis version automatically
Applications that want to stay current with Redis features can use the “Latest” version specifier.
import * as pulumi from "@pulumi/pulumi";
import * as azure_native from "@pulumi/azure-native";
const redis = new azure_native.redis.Redis("redis", {
enableNonSslPort: true,
location: "East US",
minimumTlsVersion: azure_native.redis.TlsVersion.TlsVersion_1_2,
name: "cache1",
redisConfiguration: {
maxmemoryPolicy: "allkeys-lru",
},
redisVersion: "Latest",
replicasPerPrimary: 2,
resourceGroupName: "rg1",
shardCount: 2,
sku: {
capacity: 1,
family: azure_native.redis.SkuFamily.P,
name: azure_native.redis.SkuName.Premium,
},
staticIP: "192.168.0.5",
subnetId: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1",
zones: ["1"],
});
import pulumi
import pulumi_azure_native as azure_native
redis = azure_native.redis.Redis("redis",
enable_non_ssl_port=True,
location="East US",
minimum_tls_version=azure_native.redis.TlsVersion.TLS_VERSION_1_2,
name="cache1",
redis_configuration={
"maxmemory_policy": "allkeys-lru",
},
redis_version="Latest",
replicas_per_primary=2,
resource_group_name="rg1",
shard_count=2,
sku={
"capacity": 1,
"family": azure_native.redis.SkuFamily.P,
"name": azure_native.redis.SkuName.PREMIUM,
},
static_ip="192.168.0.5",
subnet_id="/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1",
zones=["1"])
package main
import (
redis "github.com/pulumi/pulumi-azure-native-sdk/redis/v3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := redis.NewRedis(ctx, "redis", &redis.RedisArgs{
EnableNonSslPort: pulumi.Bool(true),
Location: pulumi.String("East US"),
MinimumTlsVersion: pulumi.String(redis.TlsVersion_1_2),
Name: pulumi.String("cache1"),
RedisConfiguration: &redis.RedisCommonPropertiesRedisConfigurationArgs{
MaxmemoryPolicy: pulumi.String("allkeys-lru"),
},
RedisVersion: pulumi.String("Latest"),
ReplicasPerPrimary: pulumi.Int(2),
ResourceGroupName: pulumi.String("rg1"),
ShardCount: pulumi.Int(2),
Sku: &redis.SkuArgs{
Capacity: pulumi.Int(1),
Family: pulumi.String(redis.SkuFamilyP),
Name: pulumi.String(redis.SkuNamePremium),
},
StaticIP: pulumi.String("192.168.0.5"),
SubnetId: pulumi.String("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1"),
Zones: pulumi.StringArray{
pulumi.String("1"),
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using AzureNative = Pulumi.AzureNative;
return await Deployment.RunAsync(() =>
{
var redis = new AzureNative.Redis.Redis("redis", new()
{
EnableNonSslPort = true,
Location = "East US",
MinimumTlsVersion = AzureNative.Redis.TlsVersion.TlsVersion_1_2,
Name = "cache1",
RedisConfiguration = new AzureNative.Redis.Inputs.RedisCommonPropertiesRedisConfigurationArgs
{
MaxmemoryPolicy = "allkeys-lru",
},
RedisVersion = "Latest",
ReplicasPerPrimary = 2,
ResourceGroupName = "rg1",
ShardCount = 2,
Sku = new AzureNative.Redis.Inputs.SkuArgs
{
Capacity = 1,
Family = AzureNative.Redis.SkuFamily.P,
Name = AzureNative.Redis.SkuName.Premium,
},
StaticIP = "192.168.0.5",
SubnetId = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1",
Zones = new[]
{
"1",
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.azurenative.redis.Redis;
import com.pulumi.azurenative.redis.RedisArgs;
import com.pulumi.azurenative.redis.inputs.RedisCommonPropertiesRedisConfigurationArgs;
import com.pulumi.azurenative.redis.inputs.SkuArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var redis = new Redis("redis", RedisArgs.builder()
.enableNonSslPort(true)
.location("East US")
.minimumTlsVersion("1.2")
.name("cache1")
.redisConfiguration(RedisCommonPropertiesRedisConfigurationArgs.builder()
.maxmemoryPolicy("allkeys-lru")
.build())
.redisVersion("Latest")
.replicasPerPrimary(2)
.resourceGroupName("rg1")
.shardCount(2)
.sku(SkuArgs.builder()
.capacity(1)
.family("P")
.name("Premium")
.build())
.staticIP("192.168.0.5")
.subnetId("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1")
.zones("1")
.build());
}
}
resources:
redis:
type: azure-native:redis:Redis
properties:
enableNonSslPort: true
location: East US
minimumTlsVersion: '1.2'
name: cache1
redisConfiguration:
maxmemoryPolicy: allkeys-lru
redisVersion: Latest
replicasPerPrimary: 2
resourceGroupName: rg1
shardCount: 2
sku:
capacity: 1
family: P
name: Premium
staticIP: 192.168.0.5
subnetId: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2/providers/Microsoft.Network/virtualNetworks/network1/subnets/subnet1
zones:
- '1'
The redisVersion property accepts either a specific version (e.g., “4.0”, “6.0”) or the value “Latest”. When set to “Latest”, Azure automatically provisions the newest stable Redis version available in the region. This ensures your cache receives new features and improvements without requiring manual version updates.
Beyond these examples
These snippets focus on specific Redis cache features: Premium SKU with VNet isolation and clustering, zone redundancy configuration, and Redis version management. They’re intentionally minimal rather than full caching solutions.
The examples reference pre-existing infrastructure such as Azure resource groups and VNet subnets for private deployment. They focus on configuring the cache rather than provisioning the surrounding network infrastructure.
To keep things focused, common Redis patterns are omitted, including:
- Access key authentication controls (disableAccessKeyAuthentication)
- Public network access restrictions (publicNetworkAccess)
- Managed identity configuration (identity)
- Redis configuration tuning (maxmemory-policy, persistence, notifications)
- TLS version requirements (minimumTlsVersion)
These omissions are intentional: the goal is to illustrate how each Redis feature is wired, not provide drop-in caching modules. See the Azure Redis resource reference for all available configuration options.
Let's deploy Azure Redis Cache
Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.
Try Pulumi Cloud for FREEFrequently Asked Questions
Immutability & Resource Lifecycle
location, name, staticIP, and resourceGroupName. Changing any of these requires recreating the resource.zonalAllocationPolicy isn’t specified, it defaults to UserDefined if you provide zones, Automatic in regions with zone support, or NoZones in regions without zone support. For predictable behavior, explicitly set zonalAllocationPolicy.High Availability & Networking
replicasPerPrimary (number of replicas per primary) and shardCount (number of shards). Examples show configurations with replicasPerPrimary: 2 and shardCount: 2.subnetId to the full resource ID of your subnet. Optionally specify staticIP for a fixed IP address within the VNet.zones specifies which availability zones to use (e.g., ["1"]). zonalAllocationPolicy controls allocation behavior: UserDefined uses your zones list, Automatic lets Azure choose zones, and NoZones creates a non-zonal cache.Security & Access Control
enableNonSslPort is false (port 6379 disabled), disableAccessKeyAuthentication is false (access keys enabled), and redisVersion is ’latest’. TLS version and public network access have no defaults and must be configured explicitly.publicNetworkAccess to Disabled. When disabled, private endpoints become the exclusive access method.minimumTlsVersion to require clients to use a specified TLS version or higher. Supported values include ‘1.0’, ‘1.1’, and ‘1.2’.Versions & Updates
redisVersion: "Latest" for the latest stable version (currently 6.0), or specify a major version like "4". The default is ’latest'.updateChannel property controls monthly Redis updates. Preview receives updates at least 4 weeks ahead of Stable. The default is ‘Stable’.