Certificate Args
Provides a DigitalOcean Certificate resource that allows you to manage certificates for configuring TLS termination in Load Balancers. Certificates created with this resource can be referenced in your Load Balancer configuration via their ID. The certificate can either be a custom one provided by you or automatically generated one with Let's Encrypt.
Example Usage
Custom Certificate
import * as pulumi from "@pulumi/pulumi";
import * as digitalocean from "@pulumi/digitalocean";
import * as std from "@pulumi/std";
const cert = new digitalocean.Certificate("cert", {
name: "custom-example",
type: digitalocean.CertificateType.Custom,
privateKey: std.file({
input: "/Users/myuser/certs/privkey.pem",
}).then(invoke => invoke.result),
leafCertificate: std.file({
input: "/Users/myuser/certs/cert.pem",
}).then(invoke => invoke.result),
certificateChain: std.file({
input: "/Users/myuser/certs/fullchain.pem",
}).then(invoke => invoke.result),
});
import pulumi
import pulumi_digitalocean as digitalocean
import pulumi_std as std
cert = digitalocean.Certificate("cert",
name="custom-example",
type=digitalocean.CertificateType.CUSTOM,
private_key=std.file(input="/Users/myuser/certs/privkey.pem").result,
leaf_certificate=std.file(input="/Users/myuser/certs/cert.pem").result,
certificate_chain=std.file(input="/Users/myuser/certs/fullchain.pem").result)
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using DigitalOcean = Pulumi.DigitalOcean;
using Std = Pulumi.Std;
return await Deployment.RunAsync(() =>
{
var cert = new DigitalOcean.Certificate("cert", new()
{
Name = "custom-example",
Type = DigitalOcean.CertificateType.Custom,
PrivateKey = Std.File.Invoke(new()
{
Input = "/Users/myuser/certs/privkey.pem",
}).Apply(invoke => invoke.Result),
LeafCertificate = Std.File.Invoke(new()
{
Input = "/Users/myuser/certs/cert.pem",
}).Apply(invoke => invoke.Result),
CertificateChain = Std.File.Invoke(new()
{
Input = "/Users/myuser/certs/fullchain.pem",
}).Apply(invoke => invoke.Result),
});
});
package main
import (
"github.com/pulumi/pulumi-digitalocean/sdk/v4/go/digitalocean"
"github.com/pulumi/pulumi-std/sdk/go/std"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
invokeFile, err := std.File(ctx, &std.FileArgs{
Input: "/Users/myuser/certs/privkey.pem",
}, nil)
if err != nil {
return err
}
invokeFile1, err := std.File(ctx, &std.FileArgs{
Input: "/Users/myuser/certs/cert.pem",
}, nil)
if err != nil {
return err
}
invokeFile2, err := std.File(ctx, &std.FileArgs{
Input: "/Users/myuser/certs/fullchain.pem",
}, nil)
if err != nil {
return err
}
_, err = digitalocean.NewCertificate(ctx, "cert", &digitalocean.CertificateArgs{
Name: pulumi.String("custom-example"),
Type: pulumi.String(digitalocean.CertificateTypeCustom),
PrivateKey: pulumi.String(invokeFile.Result),
LeafCertificate: pulumi.String(invokeFile1.Result),
CertificateChain: pulumi.String(invokeFile2.Result),
})
if err != nil {
return err
}
return nil
})
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.digitalocean.Certificate;
import com.pulumi.digitalocean.CertificateArgs;
import com.pulumi.std.StdFunctions;
import com.pulumi.std.inputs.FileArgs;
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 cert = new Certificate("cert", CertificateArgs.builder()
.name("custom-example")
.type("custom")
.privateKey(StdFunctions.file(FileArgs.builder()
.input("/Users/myuser/certs/privkey.pem")
.build()).result())
.leafCertificate(StdFunctions.file(FileArgs.builder()
.input("/Users/myuser/certs/cert.pem")
.build()).result())
.certificateChain(StdFunctions.file(FileArgs.builder()
.input("/Users/myuser/certs/fullchain.pem")
.build()).result())
.build());
}
}
resources:
cert:
type: digitalocean:Certificate
properties:
name: custom-example
type: custom
privateKey:
fn::invoke:
function: std:file
arguments:
input: /Users/myuser/certs/privkey.pem
return: result
leafCertificate:
fn::invoke:
function: std:file
arguments:
input: /Users/myuser/certs/cert.pem
return: result
certificateChain:
fn::invoke:
function: std:file
arguments:
input: /Users/myuser/certs/fullchain.pem
return: result
Let's Encrypt Certificate
import * as pulumi from "@pulumi/pulumi";
import * as digitalocean from "@pulumi/digitalocean";
const cert = new digitalocean.Certificate("cert", {
name: "le-example",
type: digitalocean.CertificateType.LetsEncrypt,
domains: ["example.com"],
});
import pulumi
import pulumi_digitalocean as digitalocean
cert = digitalocean.Certificate("cert",
name="le-example",
type=digitalocean.CertificateType.LETS_ENCRYPT,
domains=["example.com"])
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using DigitalOcean = Pulumi.DigitalOcean;
return await Deployment.RunAsync(() =>
{
var cert = new DigitalOcean.Certificate("cert", new()
{
Name = "le-example",
Type = DigitalOcean.CertificateType.LetsEncrypt,
Domains = new[]
{
"example.com",
},
});
});
package main
import (
"github.com/pulumi/pulumi-digitalocean/sdk/v4/go/digitalocean"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := digitalocean.NewCertificate(ctx, "cert", &digitalocean.CertificateArgs{
Name: pulumi.String("le-example"),
Type: pulumi.String(digitalocean.CertificateTypeLetsEncrypt),
Domains: pulumi.StringArray{
pulumi.String("example.com"),
},
})
if err != nil {
return err
}
return nil
})
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.digitalocean.Certificate;
import com.pulumi.digitalocean.CertificateArgs;
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 cert = new Certificate("cert", CertificateArgs.builder()
.name("le-example")
.type("lets_encrypt")
.domains("example.com")
.build());
}
}
resources:
cert:
type: digitalocean:Certificate
properties:
name: le-example
type: lets_encrypt
domains:
- example.com
Use with Other Resources
Both custom and Let's Encrypt certificates can be used with other resources including the digitalocean.LoadBalancer
and digitalocean.Cdn
resources.
import * as pulumi from "@pulumi/pulumi";
import * as digitalocean from "@pulumi/digitalocean";
const cert = new digitalocean.Certificate("cert", {
name: "le-example",
type: digitalocean.CertificateType.LetsEncrypt,
domains: ["example.com"],
});
// Create a new Load Balancer with TLS termination
const _public = new digitalocean.LoadBalancer("public", {
name: "secure-loadbalancer-1",
region: digitalocean.Region.NYC3,
dropletTag: "backend",
forwardingRules: [{
entryPort: 443,
entryProtocol: "https",
targetPort: 80,
targetProtocol: "http",
certificateName: cert.name,
}],
});
import pulumi
import pulumi_digitalocean as digitalocean
cert = digitalocean.Certificate("cert",
name="le-example",
type=digitalocean.CertificateType.LETS_ENCRYPT,
domains=["example.com"])
# Create a new Load Balancer with TLS termination
public = digitalocean.LoadBalancer("public",
name="secure-loadbalancer-1",
region=digitalocean.Region.NYC3,
droplet_tag="backend",
forwarding_rules=[{
"entry_port": 443,
"entry_protocol": "https",
"target_port": 80,
"target_protocol": "http",
"certificate_name": cert.name,
}])
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using DigitalOcean = Pulumi.DigitalOcean;
return await Deployment.RunAsync(() =>
{
var cert = new DigitalOcean.Certificate("cert", new()
{
Name = "le-example",
Type = DigitalOcean.CertificateType.LetsEncrypt,
Domains = new[]
{
"example.com",
},
});
// Create a new Load Balancer with TLS termination
var @public = new DigitalOcean.LoadBalancer("public", new()
{
Name = "secure-loadbalancer-1",
Region = DigitalOcean.Region.NYC3,
DropletTag = "backend",
ForwardingRules = new[]
{
new DigitalOcean.Inputs.LoadBalancerForwardingRuleArgs
{
EntryPort = 443,
EntryProtocol = "https",
TargetPort = 80,
TargetProtocol = "http",
CertificateName = cert.Name,
},
},
});
});
package main
import (
"github.com/pulumi/pulumi-digitalocean/sdk/v4/go/digitalocean"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
cert, err := digitalocean.NewCertificate(ctx, "cert", &digitalocean.CertificateArgs{
Name: pulumi.String("le-example"),
Type: pulumi.String(digitalocean.CertificateTypeLetsEncrypt),
Domains: pulumi.StringArray{
pulumi.String("example.com"),
},
})
if err != nil {
return err
}
// Create a new Load Balancer with TLS termination
_, err = digitalocean.NewLoadBalancer(ctx, "public", &digitalocean.LoadBalancerArgs{
Name: pulumi.String("secure-loadbalancer-1"),
Region: pulumi.String(digitalocean.RegionNYC3),
DropletTag: pulumi.String("backend"),
ForwardingRules: digitalocean.LoadBalancerForwardingRuleArray{
&digitalocean.LoadBalancerForwardingRuleArgs{
EntryPort: pulumi.Int(443),
EntryProtocol: pulumi.String("https"),
TargetPort: pulumi.Int(80),
TargetProtocol: pulumi.String("http"),
CertificateName: cert.Name,
},
},
})
if err != nil {
return err
}
return nil
})
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.digitalocean.Certificate;
import com.pulumi.digitalocean.CertificateArgs;
import com.pulumi.digitalocean.LoadBalancer;
import com.pulumi.digitalocean.LoadBalancerArgs;
import com.pulumi.digitalocean.inputs.LoadBalancerForwardingRuleArgs;
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 cert = new Certificate("cert", CertificateArgs.builder()
.name("le-example")
.type("lets_encrypt")
.domains("example.com")
.build());
// Create a new Load Balancer with TLS termination
var public_ = new LoadBalancer("public", LoadBalancerArgs.builder()
.name("secure-loadbalancer-1")
.region("nyc3")
.dropletTag("backend")
.forwardingRules(LoadBalancerForwardingRuleArgs.builder()
.entryPort(443)
.entryProtocol("https")
.targetPort(80)
.targetProtocol("http")
.certificateName(cert.name())
.build())
.build());
}
}
resources:
cert:
type: digitalocean:Certificate
properties:
name: le-example
type: lets_encrypt
domains:
- example.com
# Create a new Load Balancer with TLS termination
public:
type: digitalocean:LoadBalancer
properties:
name: secure-loadbalancer-1
region: nyc3
dropletTag: backend
forwardingRules:
- entryPort: 443
entryProtocol: https
targetPort: 80
targetProtocol: http
certificateName: ${cert.name}
Import
Certificates can be imported using the certificate name
, e.g.
$ pulumi import digitalocean:index/certificate:Certificate mycertificate cert-01
Properties
The full PEM-formatted trust chain between the certificate authority's certificate and your domain's TLS certificate. Only valid when type is custom
.
The contents of a PEM-formatted public TLS certificate. Only valid when type is custom
.
The contents of a PEM-formatted private-key corresponding to the SSL certificate. Only valid when type is custom
.
The type of certificate to provision. Can be either custom
or lets_encrypt
. Defaults to custom
.