|
| 1 | +// Copyright 2016-2021, Pulumi Corporation. |
| 2 | +package main |
| 3 | + |
| 4 | +import ( |
| 5 | + "github.com/pulumi/pulumi-aws/sdk/v4/go/aws" |
| 6 | + "github.com/pulumi/pulumi-aws/sdk/v4/go/aws/acm" |
| 7 | + "github.com/pulumi/pulumi-aws/sdk/v4/go/aws/apigateway" |
| 8 | + "github.com/pulumi/pulumi-aws/sdk/v4/go/aws/route53" |
| 9 | + "github.com/pulumi/pulumi/sdk/v3/go/pulumi" |
| 10 | +) |
| 11 | + |
| 12 | +func configureDns(ctx *pulumi.Context, domain string, zoneId string) (*apigateway.DomainName, error) { |
| 13 | + // SSL Cert must be created in us-east-1 unrelated to where the API is deployed. |
| 14 | + awsUsEast1, err := aws.NewProvider(ctx, "aws-provider-us-east-1", &aws.ProviderArgs{Region: pulumi.String("us-east-1")}) |
| 15 | + if err != nil { |
| 16 | + return nil, err |
| 17 | + } |
| 18 | + // Request ACM certificate |
| 19 | + sslCertificate, err := acm.NewCertificate(ctx, |
| 20 | + "ssl-cert", |
| 21 | + &acm.CertificateArgs{ |
| 22 | + DomainName: pulumi.String(domain), |
| 23 | + ValidationMethod: pulumi.String("DNS"), |
| 24 | + }, |
| 25 | + pulumi.Provider(awsUsEast1), |
| 26 | + ) |
| 27 | + if err != nil { |
| 28 | + return nil, err |
| 29 | + } |
| 30 | + domainValidationOption := sslCertificate.DomainValidationOptions.ApplyT(func(options []acm.CertificateDomainValidationOption) interface{} { |
| 31 | + return options[0] |
| 32 | + }) |
| 33 | + // Create DNS record to prove to ACM that we own the domain |
| 34 | + sslCertificateValidationDnsRecord, err := route53.NewRecord(ctx, |
| 35 | + "ssl-cert-validation-dns-record", |
| 36 | + &route53.RecordArgs{ |
| 37 | + ZoneId: pulumi.String(zoneId), |
| 38 | + Name: domainValidationOption.ApplyT(func(option interface{}) string { |
| 39 | + return *option.(acm.CertificateDomainValidationOption).ResourceRecordName |
| 40 | + }).(pulumi.StringOutput), |
| 41 | + Type: domainValidationOption.ApplyT(func(option interface{}) string { |
| 42 | + return *option.(acm.CertificateDomainValidationOption).ResourceRecordType |
| 43 | + }).(pulumi.StringOutput), |
| 44 | + Records: pulumi.StringArray{ |
| 45 | + domainValidationOption.ApplyT(func(option interface{}) string { |
| 46 | + return *option.(acm.CertificateDomainValidationOption).ResourceRecordValue |
| 47 | + }).(pulumi.StringOutput), |
| 48 | + }, |
| 49 | + Ttl: pulumi.Int(10 * 60), // 10 minutes |
| 50 | + }, |
| 51 | + ) |
| 52 | + if err != nil { |
| 53 | + return nil, err |
| 54 | + } |
| 55 | + // Wait for the certificate validation to succeed |
| 56 | + validatedSslCertificate, err := acm.NewCertificateValidation(ctx, |
| 57 | + "ssl-cert-validation", |
| 58 | + &acm.CertificateValidationArgs{ |
| 59 | + CertificateArn: sslCertificate.Arn, |
| 60 | + ValidationRecordFqdns: pulumi.StringArray{sslCertificateValidationDnsRecord.Fqdn}, |
| 61 | + }, |
| 62 | + pulumi.Provider(awsUsEast1), |
| 63 | + ) |
| 64 | + if err != nil { |
| 65 | + return nil, err |
| 66 | + } |
| 67 | + // Configure API Gateway to be able to use domain name & certificate |
| 68 | + apiDomainName, err := apigateway.NewDomainName(ctx, "api-domain-name", |
| 69 | + &apigateway.DomainNameArgs{ |
| 70 | + CertificateArn: validatedSslCertificate.CertificateArn, |
| 71 | + DomainName: pulumi.String(domain), |
| 72 | + }, |
| 73 | + ) |
| 74 | + if err != nil { |
| 75 | + return nil, err |
| 76 | + } |
| 77 | + // Create DNS record |
| 78 | + _, err = route53.NewRecord(ctx, "api-dns", |
| 79 | + &route53.RecordArgs{ |
| 80 | + ZoneId: pulumi.String(zoneId), |
| 81 | + Type: pulumi.String("A"), |
| 82 | + Name: pulumi.String(domain), |
| 83 | + Aliases: route53.RecordAliasArray{ |
| 84 | + route53.RecordAliasArgs{ |
| 85 | + Name: apiDomainName.CloudfrontDomainName, |
| 86 | + EvaluateTargetHealth: pulumi.Bool(false), |
| 87 | + ZoneId: apiDomainName.CloudfrontZoneId, |
| 88 | + }, |
| 89 | + }, |
| 90 | + }) |
| 91 | + if err != nil { |
| 92 | + return nil, err |
| 93 | + } |
| 94 | + return apiDomainName, nil |
| 95 | +} |
0 commit comments