RecordSet class
Manages a set of DNS records within Google Cloud DNS. For more information see the official documentation and API.
> Note: The provider treats this resource as an authoritative record set. This means existing records (including the default records) for the given type will be overwritten when you create this resource in Terraform. In addition, the Google Cloud DNS API requires NS and SOA records to be present at all times, so Terraform will not actually remove NS or SOA records on the root of the zone during destroy but will report that it did.
Example Usage
Binding a DNS name to the ephemeral IP of a new instance:
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const frontendInstance = new gcp.compute.Instance("frontend", {
networkInterfaces: [{
accessConfigs: [{}],
network: "default",
}],
name: "frontend",
machineType: "g1-small",
zone: "us-central1-b",
bootDisk: {
initializeParams: {
image: "debian-cloud/debian-11",
},
},
});
const prod = new gcp.dns.ManagedZone("prod", {
name: "prod-zone",
dnsName: "prod.mydomain.com.",
});
const frontend = new gcp.dns.RecordSet("frontend", {
name: pulumi.interpolate`frontend.${prod.dnsName}`,
type: "A",
ttl: 300,
managedZone: prod.name,
rrdatas: [frontendInstance.networkInterfaces.apply(networkInterfaces => networkInterfaces[0].accessConfigs?.[0]?.natIp)],
});
import pulumi
import pulumi_gcp as gcp
frontend_instance = gcp.compute.Instance("frontend",
network_interfaces=[{
"access_configs": [{}],
"network": "default",
}],
name="frontend",
machine_type="g1-small",
zone="us-central1-b",
boot_disk={
"initialize_params": {
"image": "debian-cloud/debian-11",
},
})
prod = gcp.dns.ManagedZone("prod",
name="prod-zone",
dns_name="prod.mydomain.com.")
frontend = gcp.dns.RecordSet("frontend",
name=prod.dns_name.apply(lambda dns_name: f"frontend.{dns_name}"),
type="A",
ttl=300,
managed_zone=prod.name,
rrdatas=[frontend_instance.network_interfaces[0].access_configs[0].nat_ip])
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var frontendInstance = new Gcp.Compute.Instance("frontend", new()
{
NetworkInterfaces = new[]
{
new Gcp.Compute.Inputs.InstanceNetworkInterfaceArgs
{
AccessConfigs = new[]
{
null,
},
Network = "default",
},
},
Name = "frontend",
MachineType = "g1-small",
Zone = "us-central1-b",
BootDisk = new Gcp.Compute.Inputs.InstanceBootDiskArgs
{
InitializeParams = new Gcp.Compute.Inputs.InstanceBootDiskInitializeParamsArgs
{
Image = "debian-cloud/debian-11",
},
},
});
var prod = new Gcp.Dns.ManagedZone("prod", new()
{
Name = "prod-zone",
DnsName = "prod.mydomain.com.",
});
var frontend = new Gcp.Dns.RecordSet("frontend", new()
{
Name = prod.DnsName.Apply(dnsName => $"frontend.{dnsName}"),
Type = "A",
Ttl = 300,
ManagedZone = prod.Name,
Rrdatas = new[]
{
frontendInstance.NetworkInterfaces.Apply(networkInterfaces => networkInterfaces[0].AccessConfigs[0]?.NatIp),
},
});
});
package main
import (
"fmt"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/dns"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
frontendInstance, err := compute.NewInstance(ctx, "frontend", &compute.InstanceArgs{
NetworkInterfaces: compute.InstanceNetworkInterfaceArray{
&compute.InstanceNetworkInterfaceArgs{
AccessConfigs: compute.InstanceNetworkInterfaceAccessConfigArray{
&compute.InstanceNetworkInterfaceAccessConfigArgs{},
},
Network: pulumi.String("default"),
},
},
Name: pulumi.String("frontend"),
MachineType: pulumi.String("g1-small"),
Zone: pulumi.String("us-central1-b"),
BootDisk: &compute.InstanceBootDiskArgs{
InitializeParams: &compute.InstanceBootDiskInitializeParamsArgs{
Image: pulumi.String("debian-cloud/debian-11"),
},
},
})
if err != nil {
return err
}
prod, err := dns.NewManagedZone(ctx, "prod", &dns.ManagedZoneArgs{
Name: pulumi.String("prod-zone"),
DnsName: pulumi.String("prod.mydomain.com."),
})
if err != nil {
return err
}
_, err = dns.NewRecordSet(ctx, "frontend", &dns.RecordSetArgs{
Name: prod.DnsName.ApplyT(func(dnsName string) (string, error) {
return fmt.Sprintf("frontend.%v", dnsName), nil
}).(pulumi.StringOutput),
Type: pulumi.String("A"),
Ttl: pulumi.Int(300),
ManagedZone: prod.Name,
Rrdatas: pulumi.StringArray{
frontendInstance.NetworkInterfaces.ApplyT(func(networkInterfaces []compute.InstanceNetworkInterface) (*string, error) {
return networkInterfaces[0].AccessConfigs[0].NatIp, nil
}).(pulumi.StringPtrOutput),
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_dns_recordset" "frontend" {
name ="frontend.${gcp_dns_managedzone.prod.dns_name}"
type = "A"
ttl = 300
managed_zone = gcp_dns_managedzone.prod.name
rrdatas = [gcp_compute_instance.frontend.network_interfaces[0].access_configs[0].nat_ip]
}
resource "gcp_compute_instance" "frontend" {
network_interfaces {
access_configs {
}
network = "default"
}
name = "frontend"
machine_type = "g1-small"
zone = "us-central1-b"
boot_disk = {
initialize_params = {
image = "debian-cloud/debian-11"
}
}
}
resource "gcp_dns_managedzone" "prod" {
name = "prod-zone"
dns_name = "prod.mydomain.com."
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.Instance;
import com.pulumi.gcp.compute.InstanceArgs;
import com.pulumi.gcp.compute.inputs.InstanceNetworkInterfaceArgs;
import com.pulumi.gcp.compute.inputs.InstanceNetworkInterfaceAccessConfigArgs;
import com.pulumi.gcp.compute.inputs.InstanceBootDiskArgs;
import com.pulumi.gcp.compute.inputs.InstanceBootDiskInitializeParamsArgs;
import com.pulumi.gcp.dns.ManagedZone;
import com.pulumi.gcp.dns.ManagedZoneArgs;
import com.pulumi.gcp.dns.RecordSet;
import com.pulumi.gcp.dns.RecordSetArgs;
import java.util.ArrayList;
import java.util.Arrays;
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 frontendInstance = new Instance("frontendInstance", InstanceArgs.builder()
.networkInterfaces(InstanceNetworkInterfaceArgs.builder()
.accessConfigs(InstanceNetworkInterfaceAccessConfigArgs.builder()
.build())
.network("default")
.build())
.name("frontend")
.machineType("g1-small")
.zone("us-central1-b")
.bootDisk(InstanceBootDiskArgs.builder()
.initializeParams(InstanceBootDiskInitializeParamsArgs.builder()
.image("debian-cloud/debian-11")
.build())
.build())
.build());
var prod = new ManagedZone("prod", ManagedZoneArgs.builder()
.name("prod-zone")
.dnsName("prod.mydomain.com.")
.build());
var frontend = new RecordSet("frontend", RecordSetArgs.builder()
.name(prod.dnsName().applyValue(_dnsName -> String.format("frontend.%s", _dnsName)))
.type("A")
.ttl(300)
.managedZone(prod.name())
.rrdatas(frontendInstance.networkInterfaces().applyValue(_networkInterfaces -> _networkInterfaces.get(0).accessConfigs().get(0).natIp()))
.build());
}
}
resources:
frontend:
type: gcp:dns:RecordSet
properties:
name: frontend.${prod.dnsName}
type: A
ttl: 300
managedZone: ${prod.name}
rrdatas:
- ${frontendInstance.networkInterfaces[0].accessConfigs[0].natIp}
frontendInstance:
type: gcp:compute:Instance
name: frontend
properties:
networkInterfaces:
- accessConfigs:
- {}
network: default
name: frontend
machineType: g1-small
zone: us-central1-b
bootDisk:
initializeParams:
image: debian-cloud/debian-11
prod:
type: gcp:dns:ManagedZone
properties:
name: prod-zone
dnsName: prod.mydomain.com.
Adding an A record
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const prod = new gcp.dns.ManagedZone("prod", {
name: "prod-zone",
dnsName: "prod.mydomain.com.",
});
const a = new gcp.dns.RecordSet("a", {
name: pulumi.interpolate`backend.${prod.dnsName}`,
managedZone: prod.name,
type: "A",
ttl: 300,
rrdatas: ["8.8.8.8"],
});
import pulumi
import pulumi_gcp as gcp
prod = gcp.dns.ManagedZone("prod",
name="prod-zone",
dns_name="prod.mydomain.com.")
a = gcp.dns.RecordSet("a",
name=prod.dns_name.apply(lambda dns_name: f"backend.{dns_name}"),
managed_zone=prod.name,
type="A",
ttl=300,
rrdatas=["8.8.8.8"])
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var prod = new Gcp.Dns.ManagedZone("prod", new()
{
Name = "prod-zone",
DnsName = "prod.mydomain.com.",
});
var a = new Gcp.Dns.RecordSet("a", new()
{
Name = prod.DnsName.Apply(dnsName => $"backend.{dnsName}"),
ManagedZone = prod.Name,
Type = "A",
Ttl = 300,
Rrdatas = new[]
{
"8.8.8.8",
},
});
});
package main
import (
"fmt"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/dns"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
prod, err := dns.NewManagedZone(ctx, "prod", &dns.ManagedZoneArgs{
Name: pulumi.String("prod-zone"),
DnsName: pulumi.String("prod.mydomain.com."),
})
if err != nil {
return err
}
_, err = dns.NewRecordSet(ctx, "a", &dns.RecordSetArgs{
Name: prod.DnsName.ApplyT(func(dnsName string) (string, error) {
return fmt.Sprintf("backend.%v", dnsName), nil
}).(pulumi.StringOutput),
ManagedZone: prod.Name,
Type: pulumi.String("A"),
Ttl: pulumi.Int(300),
Rrdatas: pulumi.StringArray{
pulumi.String("8.8.8.8"),
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_dns_recordset" "a" {
name ="backend.${gcp_dns_managedzone.prod.dns_name}"
managed_zone = gcp_dns_managedzone.prod.name
type = "A"
ttl = 300
rrdatas = ["8.8.8.8"]
}
resource "gcp_dns_managedzone" "prod" {
name = "prod-zone"
dns_name = "prod.mydomain.com."
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.dns.ManagedZone;
import com.pulumi.gcp.dns.ManagedZoneArgs;
import com.pulumi.gcp.dns.RecordSet;
import com.pulumi.gcp.dns.RecordSetArgs;
import java.util.ArrayList;
import java.util.Arrays;
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 prod = new ManagedZone("prod", ManagedZoneArgs.builder()
.name("prod-zone")
.dnsName("prod.mydomain.com.")
.build());
var a = new RecordSet("a", RecordSetArgs.builder()
.name(prod.dnsName().applyValue(_dnsName -> String.format("backend.%s", _dnsName)))
.managedZone(prod.name())
.type("A")
.ttl(300)
.rrdatas("8.8.8.8")
.build());
}
}
resources:
a:
type: gcp:dns:RecordSet
properties:
name: backend.${prod.dnsName}
managedZone: ${prod.name}
type: A
ttl: 300
rrdatas:
- 8.8.8.8
prod:
type: gcp:dns:ManagedZone
properties:
name: prod-zone
dnsName: prod.mydomain.com.
Adding an MX record
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const prod = new gcp.dns.ManagedZone("prod", {
name: "prod-zone",
dnsName: "prod.mydomain.com.",
});
const mx = new gcp.dns.RecordSet("mx", {
name: prod.dnsName,
managedZone: prod.name,
type: "MX",
ttl: 3600,
rrdatas: [
"1 aspmx.l.google.com.",
"5 alt1.aspmx.l.google.com.",
"5 alt2.aspmx.l.google.com.",
"10 alt3.aspmx.l.google.com.",
"10 alt4.aspmx.l.google.com.",
],
});
import pulumi
import pulumi_gcp as gcp
prod = gcp.dns.ManagedZone("prod",
name="prod-zone",
dns_name="prod.mydomain.com.")
mx = gcp.dns.RecordSet("mx",
name=prod.dns_name,
managed_zone=prod.name,
type="MX",
ttl=3600,
rrdatas=[
"1 aspmx.l.google.com.",
"5 alt1.aspmx.l.google.com.",
"5 alt2.aspmx.l.google.com.",
"10 alt3.aspmx.l.google.com.",
"10 alt4.aspmx.l.google.com.",
])
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var prod = new Gcp.Dns.ManagedZone("prod", new()
{
Name = "prod-zone",
DnsName = "prod.mydomain.com.",
});
var mx = new Gcp.Dns.RecordSet("mx", new()
{
Name = prod.DnsName,
ManagedZone = prod.Name,
Type = "MX",
Ttl = 3600,
Rrdatas = new[]
{
"1 aspmx.l.google.com.",
"5 alt1.aspmx.l.google.com.",
"5 alt2.aspmx.l.google.com.",
"10 alt3.aspmx.l.google.com.",
"10 alt4.aspmx.l.google.com.",
},
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/dns"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
prod, err := dns.NewManagedZone(ctx, "prod", &dns.ManagedZoneArgs{
Name: pulumi.String("prod-zone"),
DnsName: pulumi.String("prod.mydomain.com."),
})
if err != nil {
return err
}
_, err = dns.NewRecordSet(ctx, "mx", &dns.RecordSetArgs{
Name: prod.DnsName,
ManagedZone: prod.Name,
Type: pulumi.String("MX"),
Ttl: pulumi.Int(3600),
Rrdatas: pulumi.StringArray{
pulumi.String("1 aspmx.l.google.com."),
pulumi.String("5 alt1.aspmx.l.google.com."),
pulumi.String("5 alt2.aspmx.l.google.com."),
pulumi.String("10 alt3.aspmx.l.google.com."),
pulumi.String("10 alt4.aspmx.l.google.com."),
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_dns_recordset" "mx" {
name = gcp_dns_managedzone.prod.dns_name
managed_zone = gcp_dns_managedzone.prod.name
type = "MX"
ttl = 3600
rrdatas = ["1 aspmx.l.google.com.", "5 alt1.aspmx.l.google.com.", "5 alt2.aspmx.l.google.com.", "10 alt3.aspmx.l.google.com.", "10 alt4.aspmx.l.google.com."]
}
resource "gcp_dns_managedzone" "prod" {
name = "prod-zone"
dns_name = "prod.mydomain.com."
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.dns.ManagedZone;
import com.pulumi.gcp.dns.ManagedZoneArgs;
import com.pulumi.gcp.dns.RecordSet;
import com.pulumi.gcp.dns.RecordSetArgs;
import java.util.ArrayList;
import java.util.Arrays;
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 prod = new ManagedZone("prod", ManagedZoneArgs.builder()
.name("prod-zone")
.dnsName("prod.mydomain.com.")
.build());
var mx = new RecordSet("mx", RecordSetArgs.builder()
.name(prod.dnsName())
.managedZone(prod.name())
.type("MX")
.ttl(3600)
.rrdatas(
"1 aspmx.l.google.com.",
"5 alt1.aspmx.l.google.com.",
"5 alt2.aspmx.l.google.com.",
"10 alt3.aspmx.l.google.com.",
"10 alt4.aspmx.l.google.com.")
.build());
}
}
resources:
mx:
type: gcp:dns:RecordSet
properties:
name: ${prod.dnsName}
managedZone: ${prod.name}
type: MX
ttl: 3600
rrdatas:
- 1 aspmx.l.google.com.
- 5 alt1.aspmx.l.google.com.
- 5 alt2.aspmx.l.google.com.
- 10 alt3.aspmx.l.google.com.
- 10 alt4.aspmx.l.google.com.
prod:
type: gcp:dns:ManagedZone
properties:
name: prod-zone
dnsName: prod.mydomain.com.
Adding an SPF record
Quotes ("") must be added around your rrdatas for a SPF record. Otherwise rrdatas string gets split on spaces.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const prod = new gcp.dns.ManagedZone("prod", {
name: "prod-zone",
dnsName: "prod.mydomain.com.",
});
const spf = new gcp.dns.RecordSet("spf", {
name: pulumi.interpolate`frontend.${prod.dnsName}`,
managedZone: prod.name,
type: "TXT",
ttl: 300,
rrdatas: ["\"v=spf1 ip4:111.111.111.111 include:backoff.email-example.com -all\""],
});
import pulumi
import pulumi_gcp as gcp
prod = gcp.dns.ManagedZone("prod",
name="prod-zone",
dns_name="prod.mydomain.com.")
spf = gcp.dns.RecordSet("spf",
name=prod.dns_name.apply(lambda dns_name: f"frontend.{dns_name}"),
managed_zone=prod.name,
type="TXT",
ttl=300,
rrdatas=["\"v=spf1 ip4:111.111.111.111 include:backoff.email-example.com -all\""])
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var prod = new Gcp.Dns.ManagedZone("prod", new()
{
Name = "prod-zone",
DnsName = "prod.mydomain.com.",
});
var spf = new Gcp.Dns.RecordSet("spf", new()
{
Name = prod.DnsName.Apply(dnsName => $"frontend.{dnsName}"),
ManagedZone = prod.Name,
Type = "TXT",
Ttl = 300,
Rrdatas = new[]
{
"\"v=spf1 ip4:111.111.111.111 include:backoff.email-example.com -all\"",
},
});
});
package main
import (
"fmt"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/dns"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
prod, err := dns.NewManagedZone(ctx, "prod", &dns.ManagedZoneArgs{
Name: pulumi.String("prod-zone"),
DnsName: pulumi.String("prod.mydomain.com."),
})
if err != nil {
return err
}
_, err = dns.NewRecordSet(ctx, "spf", &dns.RecordSetArgs{
Name: prod.DnsName.ApplyT(func(dnsName string) (string, error) {
return fmt.Sprintf("frontend.%v", dnsName), nil
}).(pulumi.StringOutput),
ManagedZone: prod.Name,
Type: pulumi.String("TXT"),
Ttl: pulumi.Int(300),
Rrdatas: pulumi.StringArray{
pulumi.String("\"v=spf1 ip4:111.111.111.111 include:backoff.email-example.com -all\""),
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_dns_recordset" "spf" {
name ="frontend.${gcp_dns_managedzone.prod.dns_name}"
managed_zone = gcp_dns_managedzone.prod.name
type = "TXT"
ttl = 300
rrdatas = ["\"v=spf1 ip4:111.111.111.111 include:backoff.email-example.com -all\""]
}
resource "gcp_dns_managedzone" "prod" {
name = "prod-zone"
dns_name = "prod.mydomain.com."
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.dns.ManagedZone;
import com.pulumi.gcp.dns.ManagedZoneArgs;
import com.pulumi.gcp.dns.RecordSet;
import com.pulumi.gcp.dns.RecordSetArgs;
import java.util.ArrayList;
import java.util.Arrays;
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 prod = new ManagedZone("prod", ManagedZoneArgs.builder()
.name("prod-zone")
.dnsName("prod.mydomain.com.")
.build());
var spf = new RecordSet("spf", RecordSetArgs.builder()
.name(prod.dnsName().applyValue(_dnsName -> String.format("frontend.%s", _dnsName)))
.managedZone(prod.name())
.type("TXT")
.ttl(300)
.rrdatas("\"v=spf1 ip4:111.111.111.111 include:backoff.email-example.com -all\"")
.build());
}
}
resources:
spf:
type: gcp:dns:RecordSet
properties:
name: frontend.${prod.dnsName}
managedZone: ${prod.name}
type: TXT
ttl: 300
rrdatas:
- '"v=spf1 ip4:111.111.111.111 include:backoff.email-example.com -all"'
prod:
type: gcp:dns:ManagedZone
properties:
name: prod-zone
dnsName: prod.mydomain.com.
Adding a CNAME record
The list of rrdatas should only contain a single string corresponding to the Canonical Name intended.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const prod = new gcp.dns.ManagedZone("prod", {
name: "prod-zone",
dnsName: "prod.mydomain.com.",
});
const cname = new gcp.dns.RecordSet("cname", {
name: pulumi.interpolate`frontend.${prod.dnsName}`,
managedZone: prod.name,
type: "CNAME",
ttl: 300,
rrdatas: ["frontend.mydomain.com."],
});
import pulumi
import pulumi_gcp as gcp
prod = gcp.dns.ManagedZone("prod",
name="prod-zone",
dns_name="prod.mydomain.com.")
cname = gcp.dns.RecordSet("cname",
name=prod.dns_name.apply(lambda dns_name: f"frontend.{dns_name}"),
managed_zone=prod.name,
type="CNAME",
ttl=300,
rrdatas=["frontend.mydomain.com."])
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var prod = new Gcp.Dns.ManagedZone("prod", new()
{
Name = "prod-zone",
DnsName = "prod.mydomain.com.",
});
var cname = new Gcp.Dns.RecordSet("cname", new()
{
Name = prod.DnsName.Apply(dnsName => $"frontend.{dnsName}"),
ManagedZone = prod.Name,
Type = "CNAME",
Ttl = 300,
Rrdatas = new[]
{
"frontend.mydomain.com.",
},
});
});
package main
import (
"fmt"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/dns"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
prod, err := dns.NewManagedZone(ctx, "prod", &dns.ManagedZoneArgs{
Name: pulumi.String("prod-zone"),
DnsName: pulumi.String("prod.mydomain.com."),
})
if err != nil {
return err
}
_, err = dns.NewRecordSet(ctx, "cname", &dns.RecordSetArgs{
Name: prod.DnsName.ApplyT(func(dnsName string) (string, error) {
return fmt.Sprintf("frontend.%v", dnsName), nil
}).(pulumi.StringOutput),
ManagedZone: prod.Name,
Type: pulumi.String("CNAME"),
Ttl: pulumi.Int(300),
Rrdatas: pulumi.StringArray{
pulumi.String("frontend.mydomain.com."),
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_dns_recordset" "cname" {
name ="frontend.${gcp_dns_managedzone.prod.dns_name}"
managed_zone = gcp_dns_managedzone.prod.name
type = "CNAME"
ttl = 300
rrdatas = ["frontend.mydomain.com."]
}
resource "gcp_dns_managedzone" "prod" {
name = "prod-zone"
dns_name = "prod.mydomain.com."
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.dns.ManagedZone;
import com.pulumi.gcp.dns.ManagedZoneArgs;
import com.pulumi.gcp.dns.RecordSet;
import com.pulumi.gcp.dns.RecordSetArgs;
import java.util.ArrayList;
import java.util.Arrays;
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 prod = new ManagedZone("prod", ManagedZoneArgs.builder()
.name("prod-zone")
.dnsName("prod.mydomain.com.")
.build());
var cname = new RecordSet("cname", RecordSetArgs.builder()
.name(prod.dnsName().applyValue(_dnsName -> String.format("frontend.%s", _dnsName)))
.managedZone(prod.name())
.type("CNAME")
.ttl(300)
.rrdatas("frontend.mydomain.com.")
.build());
}
}
resources:
cname:
type: gcp:dns:RecordSet
properties:
name: frontend.${prod.dnsName}
managedZone: ${prod.name}
type: CNAME
ttl: 300
rrdatas:
- frontend.mydomain.com.
prod:
type: gcp:dns:ManagedZone
properties:
name: prod-zone
dnsName: prod.mydomain.com.
Setting Routing Policy instead of using rrdatas
Geolocation
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const geo = new gcp.dns.RecordSet("geo", {
name: `backend.${prod.dnsName}`,
managedZone: prod.name,
type: "A",
ttl: 300,
routingPolicy: {
geos: [
{
location: "asia-east1",
rrdatas: ["10.128.1.1"],
},
{
location: "us-central1",
rrdatas: ["10.130.1.1"],
},
],
},
});
import pulumi
import pulumi_gcp as gcp
geo = gcp.dns.RecordSet("geo",
name=f"backend.{prod['dnsName']}",
managed_zone=prod["name"],
type="A",
ttl=300,
routing_policy={
"geos": [
{
"location": "asia-east1",
"rrdatas": ["10.128.1.1"],
},
{
"location": "us-central1",
"rrdatas": ["10.130.1.1"],
},
],
})
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var geo = new Gcp.Dns.RecordSet("geo", new()
{
Name = $"backend.{prod.DnsName}",
ManagedZone = prod.Name,
Type = "A",
Ttl = 300,
RoutingPolicy = new Gcp.Dns.Inputs.RecordSetRoutingPolicyArgs
{
Geos = new[]
{
new Gcp.Dns.Inputs.RecordSetRoutingPolicyGeoArgs
{
Location = "asia-east1",
Rrdatas = new[]
{
"10.128.1.1",
},
},
new Gcp.Dns.Inputs.RecordSetRoutingPolicyGeoArgs
{
Location = "us-central1",
Rrdatas = new[]
{
"10.130.1.1",
},
},
},
},
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/dns"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := dns.NewRecordSet(ctx, "geo", &dns.RecordSetArgs{
Name: pulumi.Sprintf("backend.%v", prod.DnsName),
ManagedZone: pulumi.Any(prod.Name),
Type: pulumi.String("A"),
Ttl: pulumi.Int(300),
RoutingPolicy: &dns.RecordSetRoutingPolicyArgs{
Geos: dns.RecordSetRoutingPolicyGeoArray{
&dns.RecordSetRoutingPolicyGeoArgs{
Location: pulumi.String("asia-east1"),
Rrdatas: pulumi.StringArray{
pulumi.String("10.128.1.1"),
},
},
&dns.RecordSetRoutingPolicyGeoArgs{
Location: pulumi.String("us-central1"),
Rrdatas: pulumi.StringArray{
pulumi.String("10.130.1.1"),
},
},
},
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_dns_recordset" "geo" {
name ="backend.${prod.dnsName}"
managed_zone = prod.name
type = "A"
ttl = 300
routing_policy = {
geos = [{
"location" = "asia-east1"
"rrdatas" = ["10.128.1.1"]
}, {
"location" = "us-central1"
"rrdatas" = ["10.130.1.1"]
}]
}
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.dns.RecordSet;
import com.pulumi.gcp.dns.RecordSetArgs;
import com.pulumi.gcp.dns.inputs.RecordSetRoutingPolicyArgs;
import com.pulumi.gcp.dns.inputs.RecordSetRoutingPolicyGeoArgs;
import java.util.ArrayList;
import java.util.Arrays;
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 geo = new RecordSet("geo", RecordSetArgs.builder()
.name(String.format("backend.%s", prod.get("dnsName")))
.managedZone(prod.get("name"))
.type("A")
.ttl(300)
.routingPolicy(RecordSetRoutingPolicyArgs.builder()
.geos(
RecordSetRoutingPolicyGeoArgs.builder()
.location("asia-east1")
.rrdatas("10.128.1.1")
.build(),
RecordSetRoutingPolicyGeoArgs.builder()
.location("us-central1")
.rrdatas("10.130.1.1")
.build())
.build())
.build());
}
}
resources:
geo:
type: gcp:dns:RecordSet
properties:
name: backend.${prod.dnsName}
managedZone: ${prod.name}
type: A
ttl: 300
routingPolicy:
geos:
- location: asia-east1
rrdatas:
- 10.128.1.1
- location: us-central1
rrdatas:
- 10.130.1.1
Failover
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const prod = new gcp.dns.ManagedZone("prod", {
name: "prod-zone",
dnsName: "prod.mydomain.com.",
visibility: "private",
});
const prodRegionBackendService = new gcp.compute.RegionBackendService("prod", {
name: "prod-backend",
region: "us-central1",
});
const prodNetwork = new gcp.compute.Network("prod", {name: "prod-network"});
const prodForwardingRule = new gcp.compute.ForwardingRule("prod", {
name: "prod-ilb",
region: "us-central1",
loadBalancingScheme: "INTERNAL",
backendService: prodRegionBackendService.id,
allPorts: true,
network: prodNetwork.name,
allowGlobalAccess: true,
});
const a = new gcp.dns.RecordSet("a", {
name: pulumi.interpolate`backend.${prod.dnsName}`,
managedZone: prod.name,
type: "A",
ttl: 300,
routingPolicy: {
primaryBackup: {
trickleRatio: 0.1,
primary: {
internalLoadBalancers: [{
loadBalancerType: "regionalL4ilb",
ipAddress: prodForwardingRule.ipAddress,
port: "80",
ipProtocol: "tcp",
networkUrl: prodNetwork.id,
project: prodForwardingRule.project,
region: prodForwardingRule.region,
}],
},
backupGeos: [
{
location: "asia-east1",
rrdatas: ["10.128.1.1"],
},
{
location: "us-west1",
rrdatas: ["10.130.1.1"],
},
],
},
},
});
import pulumi
import pulumi_gcp as gcp
prod = gcp.dns.ManagedZone("prod",
name="prod-zone",
dns_name="prod.mydomain.com.",
visibility="private")
prod_region_backend_service = gcp.compute.RegionBackendService("prod",
name="prod-backend",
region="us-central1")
prod_network = gcp.compute.Network("prod", name="prod-network")
prod_forwarding_rule = gcp.compute.ForwardingRule("prod",
name="prod-ilb",
region="us-central1",
load_balancing_scheme="INTERNAL",
backend_service=prod_region_backend_service.id,
all_ports=True,
network=prod_network.name,
allow_global_access=True)
a = gcp.dns.RecordSet("a",
name=prod.dns_name.apply(lambda dns_name: f"backend.{dns_name}"),
managed_zone=prod.name,
type="A",
ttl=300,
routing_policy={
"primary_backup": {
"trickle_ratio": 0.1,
"primary": {
"internal_load_balancers": [{
"load_balancer_type": "regionalL4ilb",
"ip_address": prod_forwarding_rule.ip_address,
"port": "80",
"ip_protocol": "tcp",
"network_url": prod_network.id,
"project": prod_forwarding_rule.project,
"region": prod_forwarding_rule.region,
}],
},
"backup_geos": [
{
"location": "asia-east1",
"rrdatas": ["10.128.1.1"],
},
{
"location": "us-west1",
"rrdatas": ["10.130.1.1"],
},
],
},
})
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var prod = new Gcp.Dns.ManagedZone("prod", new()
{
Name = "prod-zone",
DnsName = "prod.mydomain.com.",
Visibility = "private",
});
var prodRegionBackendService = new Gcp.Compute.RegionBackendService("prod", new()
{
Name = "prod-backend",
Region = "us-central1",
});
var prodNetwork = new Gcp.Compute.Network("prod", new()
{
Name = "prod-network",
});
var prodForwardingRule = new Gcp.Compute.ForwardingRule("prod", new()
{
Name = "prod-ilb",
Region = "us-central1",
LoadBalancingScheme = "INTERNAL",
BackendService = prodRegionBackendService.Id,
AllPorts = true,
Network = prodNetwork.Name,
AllowGlobalAccess = true,
});
var a = new Gcp.Dns.RecordSet("a", new()
{
Name = prod.DnsName.Apply(dnsName => $"backend.{dnsName}"),
ManagedZone = prod.Name,
Type = "A",
Ttl = 300,
RoutingPolicy = new Gcp.Dns.Inputs.RecordSetRoutingPolicyArgs
{
PrimaryBackup = new Gcp.Dns.Inputs.RecordSetRoutingPolicyPrimaryBackupArgs
{
TrickleRatio = 0.1,
Primary = new Gcp.Dns.Inputs.RecordSetRoutingPolicyPrimaryBackupPrimaryArgs
{
InternalLoadBalancers = new[]
{
new Gcp.Dns.Inputs.RecordSetRoutingPolicyPrimaryBackupPrimaryInternalLoadBalancerArgs
{
LoadBalancerType = "regionalL4ilb",
IpAddress = prodForwardingRule.IpAddress,
Port = "80",
IpProtocol = "tcp",
NetworkUrl = prodNetwork.Id,
Project = prodForwardingRule.Project,
Region = prodForwardingRule.Region,
},
},
},
BackupGeos = new[]
{
new Gcp.Dns.Inputs.RecordSetRoutingPolicyPrimaryBackupBackupGeoArgs
{
Location = "asia-east1",
Rrdatas = new[]
{
"10.128.1.1",
},
},
new Gcp.Dns.Inputs.RecordSetRoutingPolicyPrimaryBackupBackupGeoArgs
{
Location = "us-west1",
Rrdatas = new[]
{
"10.130.1.1",
},
},
},
},
},
});
});
package main
import (
"fmt"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/dns"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
prod, err := dns.NewManagedZone(ctx, "prod", &dns.ManagedZoneArgs{
Name: pulumi.String("prod-zone"),
DnsName: pulumi.String("prod.mydomain.com."),
Visibility: pulumi.String("private"),
})
if err != nil {
return err
}
prodRegionBackendService, err := compute.NewRegionBackendService(ctx, "prod", &compute.RegionBackendServiceArgs{
Name: pulumi.String("prod-backend"),
Region: pulumi.String("us-central1"),
})
if err != nil {
return err
}
prodNetwork, err := compute.NewNetwork(ctx, "prod", &compute.NetworkArgs{
Name: pulumi.String("prod-network"),
})
if err != nil {
return err
}
prodForwardingRule, err := compute.NewForwardingRule(ctx, "prod", &compute.ForwardingRuleArgs{
Name: pulumi.String("prod-ilb"),
Region: pulumi.String("us-central1"),
LoadBalancingScheme: pulumi.String("INTERNAL"),
BackendService: prodRegionBackendService.ID().ToIDOutput().ToStringOutput(),
AllPorts: pulumi.Bool(true),
Network: prodNetwork.Name,
AllowGlobalAccess: pulumi.Bool(true),
})
if err != nil {
return err
}
_, err = dns.NewRecordSet(ctx, "a", &dns.RecordSetArgs{
Name: prod.DnsName.ApplyT(func(dnsName string) (string, error) {
return fmt.Sprintf("backend.%v", dnsName), nil
}).(pulumi.StringOutput),
ManagedZone: prod.Name,
Type: pulumi.String("A"),
Ttl: pulumi.Int(300),
RoutingPolicy: &dns.RecordSetRoutingPolicyArgs{
PrimaryBackup: &dns.RecordSetRoutingPolicyPrimaryBackupArgs{
TrickleRatio: pulumi.Float64(0.1),
Primary: &dns.RecordSetRoutingPolicyPrimaryBackupPrimaryArgs{
InternalLoadBalancers: dns.RecordSetRoutingPolicyPrimaryBackupPrimaryInternalLoadBalancerArray{
&dns.RecordSetRoutingPolicyPrimaryBackupPrimaryInternalLoadBalancerArgs{
LoadBalancerType: pulumi.String("regionalL4ilb"),
IpAddress: prodForwardingRule.IpAddress,
Port: pulumi.String("80"),
IpProtocol: pulumi.String("tcp"),
NetworkUrl: prodNetwork.ID().ToIDOutput().ToStringOutput(),
Project: prodForwardingRule.Project,
Region: prodForwardingRule.Region,
},
},
},
BackupGeos: dns.RecordSetRoutingPolicyPrimaryBackupBackupGeoArray{
&dns.RecordSetRoutingPolicyPrimaryBackupBackupGeoArgs{
Location: pulumi.String("asia-east1"),
Rrdatas: pulumi.StringArray{
pulumi.String("10.128.1.1"),
},
},
&dns.RecordSetRoutingPolicyPrimaryBackupBackupGeoArgs{
Location: pulumi.String("us-west1"),
Rrdatas: pulumi.StringArray{
pulumi.String("10.130.1.1"),
},
},
},
},
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_dns_recordset" "a" {
name ="backend.${gcp_dns_managedzone.prod.dns_name}"
managed_zone = gcp_dns_managedzone.prod.name
type = "A"
ttl = 300
routing_policy = {
primary_backup = {
trickle_ratio = 0.1
primary = {
internal_load_balancers = [{
"loadBalancerType" = "regionalL4ilb"
"ipAddress" = gcp_compute_forwardingrule.prod.ip_address
"port" = "80"
"ipProtocol" = "tcp"
"networkUrl" = gcp_compute_network.prod.id
"project" = gcp_compute_forwardingrule.prod.project
"region" = gcp_compute_forwardingrule.prod.region
}]
}
backup_geos = [{
"location" = "asia-east1"
"rrdatas" = ["10.128.1.1"]
}, {
"location" = "us-west1"
"rrdatas" = ["10.130.1.1"]
}]
}
}
}
resource "gcp_dns_managedzone" "prod" {
name = "prod-zone"
dns_name = "prod.mydomain.com."
visibility = "private"
}
resource "gcp_compute_forwardingrule" "prod" {
name = "prod-ilb"
region = "us-central1"
load_balancing_scheme = "INTERNAL"
backend_service = gcp_compute_regionbackendservice.prod.id
all_ports = true
network = gcp_compute_network.prod.name
allow_global_access = true
}
resource "gcp_compute_regionbackendservice" "prod" {
name = "prod-backend"
region = "us-central1"
}
resource "gcp_compute_network" "prod" {
name = "prod-network"
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.dns.ManagedZone;
import com.pulumi.gcp.dns.ManagedZoneArgs;
import com.pulumi.gcp.compute.RegionBackendService;
import com.pulumi.gcp.compute.RegionBackendServiceArgs;
import com.pulumi.gcp.compute.Network;
import com.pulumi.gcp.compute.NetworkArgs;
import com.pulumi.gcp.compute.ForwardingRule;
import com.pulumi.gcp.compute.ForwardingRuleArgs;
import com.pulumi.gcp.dns.RecordSet;
import com.pulumi.gcp.dns.RecordSetArgs;
import com.pulumi.gcp.dns.inputs.RecordSetRoutingPolicyArgs;
import com.pulumi.gcp.dns.inputs.RecordSetRoutingPolicyPrimaryBackupArgs;
import com.pulumi.gcp.dns.inputs.RecordSetRoutingPolicyPrimaryBackupPrimaryArgs;
import com.pulumi.gcp.dns.inputs.RecordSetRoutingPolicyPrimaryBackupPrimaryInternalLoadBalancerArgs;
import com.pulumi.gcp.dns.inputs.RecordSetRoutingPolicyPrimaryBackupBackupGeoArgs;
import java.util.ArrayList;
import java.util.Arrays;
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 prod = new ManagedZone("prod", ManagedZoneArgs.builder()
.name("prod-zone")
.dnsName("prod.mydomain.com.")
.visibility("private")
.build());
var prodRegionBackendService = new RegionBackendService("prodRegionBackendService", RegionBackendServiceArgs.builder()
.name("prod-backend")
.region("us-central1")
.build());
var prodNetwork = new Network("prodNetwork", NetworkArgs.builder()
.name("prod-network")
.build());
var prodForwardingRule = new ForwardingRule("prodForwardingRule", ForwardingRuleArgs.builder()
.name("prod-ilb")
.region("us-central1")
.loadBalancingScheme("INTERNAL")
.backendService(prodRegionBackendService.id())
.allPorts(true)
.network(prodNetwork.name())
.allowGlobalAccess(true)
.build());
var a = new RecordSet("a", RecordSetArgs.builder()
.name(prod.dnsName().applyValue(_dnsName -> String.format("backend.%s", _dnsName)))
.managedZone(prod.name())
.type("A")
.ttl(300)
.routingPolicy(RecordSetRoutingPolicyArgs.builder()
.primaryBackup(RecordSetRoutingPolicyPrimaryBackupArgs.builder()
.trickleRatio(0.1)
.primary(RecordSetRoutingPolicyPrimaryBackupPrimaryArgs.builder()
.internalLoadBalancers(RecordSetRoutingPolicyPrimaryBackupPrimaryInternalLoadBalancerArgs.builder()
.loadBalancerType("regionalL4ilb")
.ipAddress(prodForwardingRule.ipAddress())
.port("80")
.ipProtocol("tcp")
.networkUrl(prodNetwork.id())
.project(prodForwardingRule.project())
.region(prodForwardingRule.region())
.build())
.build())
.backupGeos(
RecordSetRoutingPolicyPrimaryBackupBackupGeoArgs.builder()
.location("asia-east1")
.rrdatas("10.128.1.1")
.build(),
RecordSetRoutingPolicyPrimaryBackupBackupGeoArgs.builder()
.location("us-west1")
.rrdatas("10.130.1.1")
.build())
.build())
.build())
.build());
}
}
resources:
a:
type: gcp:dns:RecordSet
properties:
name: backend.${prod.dnsName}
managedZone: ${prod.name}
type: A
ttl: 300
routingPolicy:
primaryBackup:
trickleRatio: 0.1
primary:
internalLoadBalancers:
- loadBalancerType: regionalL4ilb
ipAddress: ${prodForwardingRule.ipAddress}
port: '80'
ipProtocol: tcp
networkUrl: ${prodNetwork.id}
project: ${prodForwardingRule.project}
region: ${prodForwardingRule.region}
backupGeos:
- location: asia-east1
rrdatas:
- 10.128.1.1
- location: us-west1
rrdatas:
- 10.130.1.1
prod:
type: gcp:dns:ManagedZone
properties:
name: prod-zone
dnsName: prod.mydomain.com.
visibility: private
prodForwardingRule:
type: gcp:compute:ForwardingRule
name: prod
properties:
name: prod-ilb
region: us-central1
loadBalancingScheme: INTERNAL
backendService: ${prodRegionBackendService.id}
allPorts: true
network: ${prodNetwork.name}
allowGlobalAccess: true
prodRegionBackendService:
type: gcp:compute:RegionBackendService
name: prod
properties:
name: prod-backend
region: us-central1
prodNetwork:
type: gcp:compute:Network
name: prod
properties:
name: prod-network
Public zone failover
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const http_health_check = new gcp.compute.HealthCheck("http-health-check", {
name: "http-health-check",
description: "Health check via http",
timeoutSec: 5,
checkIntervalSec: 30,
healthyThreshold: 4,
unhealthyThreshold: 5,
httpHealthCheck: {
portSpecification: "USE_SERVING_PORT",
},
});
const prod = new gcp.dns.ManagedZone("prod", {
name: "prod-zone",
dnsName: "prod.mydomain.com.",
});
const a = new gcp.dns.RecordSet("a", {
name: pulumi.interpolate`backend.${prod.dnsName}`,
managedZone: prod.name,
type: "A",
ttl: 300,
routingPolicy: {
healthCheck: http_health_check.id,
primaryBackup: {
trickleRatio: 0.1,
primary: {
externalEndpoints: ["10.128.1.1"],
},
backupGeos: [{
location: "us-west1",
healthCheckedTargets: {
externalEndpoints: ["10.130.1.1"],
},
}],
},
},
});
import pulumi
import pulumi_gcp as gcp
http_health_check = gcp.compute.HealthCheck("http-health-check",
name="http-health-check",
description="Health check via http",
timeout_sec=5,
check_interval_sec=30,
healthy_threshold=4,
unhealthy_threshold=5,
http_health_check={
"port_specification": "USE_SERVING_PORT",
})
prod = gcp.dns.ManagedZone("prod",
name="prod-zone",
dns_name="prod.mydomain.com.")
a = gcp.dns.RecordSet("a",
name=prod.dns_name.apply(lambda dns_name: f"backend.{dns_name}"),
managed_zone=prod.name,
type="A",
ttl=300,
routing_policy={
"health_check": http_health_check.id,
"primary_backup": {
"trickle_ratio": 0.1,
"primary": {
"external_endpoints": ["10.128.1.1"],
},
"backup_geos": [{
"location": "us-west1",
"health_checked_targets": {
"external_endpoints": ["10.130.1.1"],
},
}],
},
})
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var http_health_check = new Gcp.Compute.HealthCheck("http-health-check", new()
{
Name = "http-health-check",
Description = "Health check via http",
TimeoutSec = 5,
CheckIntervalSec = 30,
HealthyThreshold = 4,
UnhealthyThreshold = 5,
HttpHealthCheck = new Gcp.Compute.Inputs.HealthCheckHttpHealthCheckArgs
{
PortSpecification = "USE_SERVING_PORT",
},
});
var prod = new Gcp.Dns.ManagedZone("prod", new()
{
Name = "prod-zone",
DnsName = "prod.mydomain.com.",
});
var a = new Gcp.Dns.RecordSet("a", new()
{
Name = prod.DnsName.Apply(dnsName => $"backend.{dnsName}"),
ManagedZone = prod.Name,
Type = "A",
Ttl = 300,
RoutingPolicy = new Gcp.Dns.Inputs.RecordSetRoutingPolicyArgs
{
HealthCheck = http_health_check.Id,
PrimaryBackup = new Gcp.Dns.Inputs.RecordSetRoutingPolicyPrimaryBackupArgs
{
TrickleRatio = 0.1,
Primary = new Gcp.Dns.Inputs.RecordSetRoutingPolicyPrimaryBackupPrimaryArgs
{
ExternalEndpoints = new[]
{
"10.128.1.1",
},
},
BackupGeos = new[]
{
new Gcp.Dns.Inputs.RecordSetRoutingPolicyPrimaryBackupBackupGeoArgs
{
Location = "us-west1",
HealthCheckedTargets = new Gcp.Dns.Inputs.RecordSetRoutingPolicyPrimaryBackupBackupGeoHealthCheckedTargetsArgs
{
ExternalEndpoints = new[]
{
"10.130.1.1",
},
},
},
},
},
},
});
});
package main
import (
"fmt"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/dns"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
http_health_check, err := compute.NewHealthCheck(ctx, "http-health-check", &compute.HealthCheckArgs{
Name: pulumi.String("http-health-check"),
Description: pulumi.String("Health check via http"),
TimeoutSec: pulumi.Int(5),
CheckIntervalSec: pulumi.Int(30),
HealthyThreshold: pulumi.Int(4),
UnhealthyThreshold: pulumi.Int(5),
HttpHealthCheck: &compute.HealthCheckHttpHealthCheckArgs{
PortSpecification: pulumi.String("USE_SERVING_PORT"),
},
})
if err != nil {
return err
}
prod, err := dns.NewManagedZone(ctx, "prod", &dns.ManagedZoneArgs{
Name: pulumi.String("prod-zone"),
DnsName: pulumi.String("prod.mydomain.com."),
})
if err != nil {
return err
}
_, err = dns.NewRecordSet(ctx, "a", &dns.RecordSetArgs{
Name: prod.DnsName.ApplyT(func(dnsName string) (string, error) {
return fmt.Sprintf("backend.%v", dnsName), nil
}).(pulumi.StringOutput),
ManagedZone: prod.Name,
Type: pulumi.String("A"),
Ttl: pulumi.Int(300),
RoutingPolicy: &dns.RecordSetRoutingPolicyArgs{
HealthCheck: http_health_check.ID().ToIDOutput().ToStringOutput(),
PrimaryBackup: &dns.RecordSetRoutingPolicyPrimaryBackupArgs{
TrickleRatio: pulumi.Float64(0.1),
Primary: &dns.RecordSetRoutingPolicyPrimaryBackupPrimaryArgs{
ExternalEndpoints: pulumi.StringArray{
pulumi.String("10.128.1.1"),
},
},
BackupGeos: dns.RecordSetRoutingPolicyPrimaryBackupBackupGeoArray{
&dns.RecordSetRoutingPolicyPrimaryBackupBackupGeoArgs{
Location: pulumi.String("us-west1"),
HealthCheckedTargets: &dns.RecordSetRoutingPolicyPrimaryBackupBackupGeoHealthCheckedTargetsArgs{
ExternalEndpoints: pulumi.StringArray{
pulumi.String("10.130.1.1"),
},
},
},
},
},
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_dns_recordset" "a" {
name ="backend.${gcp_dns_managedzone.prod.dns_name}"
managed_zone = gcp_dns_managedzone.prod.name
type = "A"
ttl = 300
routing_policy = {
health_check = gcp_compute_healthcheck.http-health-check.id
primary_backup = {
trickle_ratio = 0.1
primary = {
external_endpoints = ["10.128.1.1"]
}
backup_geos = [{
"location" = "us-west1"
"healthCheckedTargets" = {
"externalEndpoints" = ["10.130.1.1"]
}
}]
}
}
}
resource "gcp_compute_healthcheck" "http-health-check" {
name = "http-health-check"
description = "Health check via http"
timeout_sec = 5
check_interval_sec = 30
healthy_threshold = 4
unhealthy_threshold = 5
http_health_check = {
port_specification = "USE_SERVING_PORT"
}
}
resource "gcp_dns_managedzone" "prod" {
name = "prod-zone"
dns_name = "prod.mydomain.com."
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.HealthCheck;
import com.pulumi.gcp.compute.HealthCheckArgs;
import com.pulumi.gcp.compute.inputs.HealthCheckHttpHealthCheckArgs;
import com.pulumi.gcp.dns.ManagedZone;
import com.pulumi.gcp.dns.ManagedZoneArgs;
import com.pulumi.gcp.dns.RecordSet;
import com.pulumi.gcp.dns.RecordSetArgs;
import com.pulumi.gcp.dns.inputs.RecordSetRoutingPolicyArgs;
import com.pulumi.gcp.dns.inputs.RecordSetRoutingPolicyPrimaryBackupArgs;
import com.pulumi.gcp.dns.inputs.RecordSetRoutingPolicyPrimaryBackupPrimaryArgs;
import com.pulumi.gcp.dns.inputs.RecordSetRoutingPolicyPrimaryBackupBackupGeoArgs;
import com.pulumi.gcp.dns.inputs.RecordSetRoutingPolicyPrimaryBackupBackupGeoHealthCheckedTargetsArgs;
import java.util.ArrayList;
import java.util.Arrays;
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 http_health_check = new HealthCheck("http-health-check", HealthCheckArgs.builder()
.name("http-health-check")
.description("Health check via http")
.timeoutSec(5)
.checkIntervalSec(30)
.healthyThreshold(4)
.unhealthyThreshold(5)
.httpHealthCheck(HealthCheckHttpHealthCheckArgs.builder()
.portSpecification("USE_SERVING_PORT")
.build())
.build());
var prod = new ManagedZone("prod", ManagedZoneArgs.builder()
.name("prod-zone")
.dnsName("prod.mydomain.com.")
.build());
var a = new RecordSet("a", RecordSetArgs.builder()
.name(prod.dnsName().applyValue(_dnsName -> String.format("backend.%s", _dnsName)))
.managedZone(prod.name())
.type("A")
.ttl(300)
.routingPolicy(RecordSetRoutingPolicyArgs.builder()
.healthCheck(http_health_check.id())
.primaryBackup(RecordSetRoutingPolicyPrimaryBackupArgs.builder()
.trickleRatio(0.1)
.primary(RecordSetRoutingPolicyPrimaryBackupPrimaryArgs.builder()
.externalEndpoints("10.128.1.1")
.build())
.backupGeos(RecordSetRoutingPolicyPrimaryBackupBackupGeoArgs.builder()
.location("us-west1")
.healthCheckedTargets(RecordSetRoutingPolicyPrimaryBackupBackupGeoHealthCheckedTargetsArgs.builder()
.externalEndpoints("10.130.1.1")
.build())
.build())
.build())
.build())
.build());
}
}
resources:
a:
type: gcp:dns:RecordSet
properties:
name: backend.${prod.dnsName}
managedZone: ${prod.name}
type: A
ttl: 300
routingPolicy:
healthCheck: ${["http-health-check"].id}
primaryBackup:
trickleRatio: 0.1
primary:
externalEndpoints:
- 10.128.1.1
backupGeos:
- location: us-west1
healthCheckedTargets:
externalEndpoints:
- 10.130.1.1
http-health-check:
type: gcp:compute:HealthCheck
properties:
name: http-health-check
description: Health check via http
timeoutSec: 5
checkIntervalSec: 30
healthyThreshold: 4
unhealthyThreshold: 5
httpHealthCheck:
portSpecification: USE_SERVING_PORT
prod:
type: gcp:dns:ManagedZone
properties:
name: prod-zone
dnsName: prod.mydomain.com.
Import
DNS record sets can be imported using either of these accepted formats:
projects/{{project}}/managedZones/{{zone}}/rrsets/{{name}}/{{type}}{{project}}/{{zone}}/{{name}}/{{type}}{{zone}}/{{name}}/{{type}}
When using the pulumi import command, DNS record sets can be imported using one of the formats above. For example:
$ pulumi import gcp:dns/recordSet:RecordSet default projects/{{project}}/managedZones/{{zone}}/rrsets/{{name}}/{{type}}
$ pulumi import gcp:dns/recordSet:RecordSet default {{project}}/{{zone}}/{{name}}/{{type}}
$ pulumi import gcp:dns/recordSet:RecordSet default {{zone}}/{{name}}/{{type}}
Note: The record name must include the trailing dot at the end.
Constructors
- RecordSet(String name, {RecordSetArgs? args, CustomResourceOptions? options})
-
Creates a new RecordSet.
nameThe Pulumi resource name.argsArguments used to configure this RecordSet. The set of arguments for RecordSet.optionsResource options controlling this resource's behavior. - RecordSet.reference(String urn)
- Creates a typed reference to an existing RecordSet resource.
Properties
-
childResources
→ Set<
Resource> -
finalinherited
-
completionSources
↔ Map<
String, IOutputCompletionSource> -
latefinalinherited
-
deletionPolicy
↔ Output<
String> -
Whether Terraform will be prevented from destroying the resource. Defaults to "DELETE".
When a 'terraform destroy' or 'pulumi up' would delete the resource,
the command will fail if this field is set to "PREVENT" in Terraform state.
When set to "ABANDON", the command will remove the resource from Terraform
management without updating or deleting the resource in the API.
When set to "DELETE", deleting the resource is allowed.
latefinal
- hashCode → int
-
The hash code for this object.
no setterinherited
-
id
↔ Output<
String> -
getter/setter pairinherited
- isCustom → bool
-
Returns whether this resource is provider-managed.
no setterinherited
- isProtected → bool
-
Returns whether this resource is protected from deletion.
no setterinherited
- isRemote → bool
-
Whether this resource is registered as remote.
no setterinherited
- isResourceReference → bool
-
Whether this instance represents a resource value returned over RPC.
finalinherited
-
managedZone
↔ Output<
String> -
The name of the zone in which this record set will
reside.
latefinal
-
name
↔ Output<
String> -
The DNS name this record set will apply to.
latefinal
-
project
↔ Output<
String> -
The ID of the project in which the resource belongs. If it
is not provided, the provider project is used.
latefinal
-
resourceTransforms
→ List<
ResourceTransform> -
Inherited/explicit async transforms.
no setterinherited
-
routingPolicy
↔ Output<
RecordSetRoutingPolicy?> -
The configuration for steering traffic based on query.
Now you can specify either Weighted Round Robin(WRR) type or Geolocation(GEO) type.
Structure is documented below.
latefinal
-
rrdatas
↔ Output<
List< String> ?> -
The string data for the records in this record set
whose meaning depends on the DNS type. For TXT record, if the string data contains spaces, add surrounding
\"if you don't want your string to get split on spaces. To specify a single record value longer than 255 characters such as a TXT record for DKIM, add\" \"inside the Terraform configuration string (e.g."first255characters\" \"morecharacters").latefinal - runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
-
transformations
→ List<
ResourceTransformation> -
Inherited/explicit legacy transformations.
no setterinherited
-
ttl
↔ Output<
int?> -
The time-to-live of this record set (seconds).
latefinal
-
type
↔ Output<
String> -
The DNS record set type.
latefinal
-
urn
↔ Output<
String> -
latefinalinherited
Methods
-
failId(
Object error) → void -
Completes this resource ID with an error when registration fails.
inherited
-
failOutputs(
Object error) → void -
Completes all output properties with
error.inherited -
failUrn(
Object error) → void -
Completes this resource URN with an error when registration fails.
inherited
-
getProvider(
String moduleMember) → ProviderResource? -
Returns provider for
moduleMember's package, if configured.inherited -
getResourceName(
) → String -
Returns this resource's logical name.
inherited
-
getResourceType(
) → String -
Returns this resource's Pulumi type token.
inherited
-
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
registerOutput<
T> (String propertyName, {Object? decoder(Object?)?, bool isSecret = false}) → Output< T> -
Registers a dynamic output property for this resource.
inherited
-
resolveId(
String? value, {required bool isKnown}) → void -
Resolves the provider-assigned ID for this resource.
inherited
-
resolveOutputs(
Struct outputs) → void -
Resolves all output properties from a monitor response payload.
inherited
-
resolveUrn(
String value) → void -
Resolves this resource's URN once assigned by the engine.
inherited
-
serializeProperties(
Map< String, dynamic> properties) → Future<Struct> -
Serializes resource properties for RPC transmission.
inherited
-
toString(
) → String -
A string representation of this object.
inherited
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited