FEAT: Created Databases And Roles For Each App
This commit is contained in:
@@ -4,6 +4,7 @@ go 1.25.11
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/pulumi/pulumi-aws/sdk/v7 v7.40.0
|
github.com/pulumi/pulumi-aws/sdk/v7 v7.40.0
|
||||||
|
github.com/pulumi/pulumi-postgresql/sdk/v3 v3.18.0
|
||||||
github.com/pulumi/pulumi-random/sdk/v4 v4.21.1
|
github.com/pulumi/pulumi-random/sdk/v4 v4.21.1
|
||||||
github.com/pulumi/pulumi/sdk/v3 v3.256.0
|
github.com/pulumi/pulumi/sdk/v3 v3.256.0
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -172,6 +172,8 @@ github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 h1:vkHw5I/plNdTr435
|
|||||||
github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231/go.mod h1:murToZ2N9hNJzewjHBgfFdXhZKjY3z5cYC1VXk+lbFE=
|
github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231/go.mod h1:murToZ2N9hNJzewjHBgfFdXhZKjY3z5cYC1VXk+lbFE=
|
||||||
github.com/pulumi/pulumi-aws/sdk/v7 v7.40.0 h1:hCWhnZ4qaXECoxFrUGmDh1S4U6aCMuPghllRvZc+VqY=
|
github.com/pulumi/pulumi-aws/sdk/v7 v7.40.0 h1:hCWhnZ4qaXECoxFrUGmDh1S4U6aCMuPghllRvZc+VqY=
|
||||||
github.com/pulumi/pulumi-aws/sdk/v7 v7.40.0/go.mod h1:jv6dSPiG6CDnje0YLo7MdzkvR91kWCJjXcnETXwJdrw=
|
github.com/pulumi/pulumi-aws/sdk/v7 v7.40.0/go.mod h1:jv6dSPiG6CDnje0YLo7MdzkvR91kWCJjXcnETXwJdrw=
|
||||||
|
github.com/pulumi/pulumi-postgresql/sdk/v3 v3.18.0 h1:2MqXGrJCeGzpiECyETTKZv+Zt/4LPZiiePYSwkuggpM=
|
||||||
|
github.com/pulumi/pulumi-postgresql/sdk/v3 v3.18.0/go.mod h1:SturfYpqsgJ8lQg0R2qEpwe5MdeUKk8b/lUPh1OH+TE=
|
||||||
github.com/pulumi/pulumi-random/sdk/v4 v4.21.1 h1:pqvBaBMwFPP3DV8BYh/f45V4A62kFqJRQv171pfgObk=
|
github.com/pulumi/pulumi-random/sdk/v4 v4.21.1 h1:pqvBaBMwFPP3DV8BYh/f45V4A62kFqJRQv171pfgObk=
|
||||||
github.com/pulumi/pulumi-random/sdk/v4 v4.21.1/go.mod h1:4Q2jFqgCimgOQxvWntZSnV6u8+JhCkPHewloJQfLoeQ=
|
github.com/pulumi/pulumi-random/sdk/v4 v4.21.1/go.mod h1:4Q2jFqgCimgOQxvWntZSnV6u8+JhCkPHewloJQfLoeQ=
|
||||||
github.com/pulumi/pulumi/sdk/v3 v3.256.0 h1:OrkIu7Iw3HUcMtoEy2uzpD21C32B5EYBLBgBoh/uQPM=
|
github.com/pulumi/pulumi/sdk/v3 v3.256.0 h1:OrkIu7Iw3HUcMtoEy2uzpD21C32B5EYBLBgBoh/uQPM=
|
||||||
|
|||||||
+92
-2
@@ -2,21 +2,76 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/cloudfront"
|
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/cloudfront"
|
||||||
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/ec2"
|
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/ec2"
|
||||||
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/mediaconvert"
|
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/mediaconvert"
|
||||||
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/rds"
|
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/rds"
|
||||||
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/s3"
|
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/s3"
|
||||||
|
"github.com/pulumi/pulumi-postgresql/sdk/v3/go/postgresql"
|
||||||
"github.com/pulumi/pulumi-random/sdk/v4/go/random"
|
"github.com/pulumi/pulumi-random/sdk/v4/go/random"
|
||||||
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
|
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// currentPublicIP returns the caller's public IP, used to scope the RDS
|
||||||
|
// security group to the machine that will actually run `pulumi up`.
|
||||||
|
func currentPublicIP() (string, error) {
|
||||||
|
resp, err := http.Get("https://checkip.amazonaws.com")
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
defer func() { _ = resp.Body.Close() }()
|
||||||
|
body, err := io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return strings.TrimSpace(string(body)), nil
|
||||||
|
}
|
||||||
|
|
||||||
const originId = "encoded-bucket-origin"
|
const originId = "encoded-bucket-origin"
|
||||||
|
|
||||||
// AWS managed "CachingOptimized" cache policy (same ID in every account/region).
|
// AWS managed "CachingOptimized" cache policy (same ID in every account/region).
|
||||||
const cachingOptimizedPolicyId = "658327ea-f89d-4fab-a63d-7e88639e58f6"
|
const cachingOptimizedPolicyId = "658327ea-f89d-4fab-a63d-7e88639e58f6"
|
||||||
|
|
||||||
|
// newServiceDatabase creates a login role and a same-named database owned by
|
||||||
|
// that role, so the service only ever touches its own database.
|
||||||
|
func newServiceDatabase(ctx *pulumi.Context, provider *postgresql.Provider, service string) (*random.RandomPassword, error) {
|
||||||
|
password, err := random.NewRandomPassword(ctx, service+"-db-password", &random.RandomPasswordArgs{
|
||||||
|
Length: pulumi.Int(24),
|
||||||
|
Special: pulumi.Bool(true),
|
||||||
|
MinUpper: pulumi.Int(1),
|
||||||
|
MinLower: pulumi.Int(1),
|
||||||
|
MinNumeric: pulumi.Int(1),
|
||||||
|
MinSpecial: pulumi.Int(1),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
role, err := postgresql.NewRole(ctx, service+"-db-role", &postgresql.RoleArgs{
|
||||||
|
Name: pulumi.String(service),
|
||||||
|
Login: pulumi.Bool(true),
|
||||||
|
Password: password.Result,
|
||||||
|
}, pulumi.Provider(provider))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = postgresql.NewDatabase(ctx, service+"-database", &postgresql.DatabaseArgs{
|
||||||
|
Name: pulumi.String(service),
|
||||||
|
Owner: role.Name,
|
||||||
|
}, pulumi.Provider(provider))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return password, nil
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
pulumi.Run(func(ctx *pulumi.Context) error {
|
pulumi.Run(func(ctx *pulumi.Context) error {
|
||||||
// Create an AWS resource (S3 Bucket) that holds encoded assets
|
// Create an AWS resource (S3 Bucket) that holds encoded assets
|
||||||
@@ -146,8 +201,14 @@ func main() {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
myIP, err := currentPublicIP()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
myIPCidr := fmt.Sprintf("%s/32", myIP)
|
||||||
|
|
||||||
dbSecurityGroup, err := ec2.NewSecurityGroup(ctx, "postgres-sg", &ec2.SecurityGroupArgs{
|
dbSecurityGroup, err := ec2.NewSecurityGroup(ctx, "postgres-sg", &ec2.SecurityGroupArgs{
|
||||||
Description: pulumi.String("Allow Postgres access from within the VPC only"),
|
Description: pulumi.String("Allow Postgres access from within the VPC and the deployer's IP"),
|
||||||
VpcId: pulumi.String(vpc.Id),
|
VpcId: pulumi.String(vpc.Id),
|
||||||
Ingress: ec2.SecurityGroupIngressArray{
|
Ingress: ec2.SecurityGroupIngressArray{
|
||||||
&ec2.SecurityGroupIngressArgs{
|
&ec2.SecurityGroupIngressArgs{
|
||||||
@@ -156,6 +217,13 @@ func main() {
|
|||||||
ToPort: pulumi.Int(5432),
|
ToPort: pulumi.Int(5432),
|
||||||
CidrBlocks: pulumi.ToStringArray([]string{vpc.CidrBlock}),
|
CidrBlocks: pulumi.ToStringArray([]string{vpc.CidrBlock}),
|
||||||
},
|
},
|
||||||
|
&ec2.SecurityGroupIngressArgs{
|
||||||
|
Protocol: pulumi.String("tcp"),
|
||||||
|
FromPort: pulumi.Int(5432),
|
||||||
|
ToPort: pulumi.Int(5432),
|
||||||
|
CidrBlocks: pulumi.ToStringArray([]string{myIPCidr}),
|
||||||
|
Description: pulumi.String("Deployer IP, for the postgresql provider to create databases"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Egress: ec2.SecurityGroupEgressArray{
|
Egress: ec2.SecurityGroupEgressArray{
|
||||||
&ec2.SecurityGroupEgressArgs{
|
&ec2.SecurityGroupEgressArgs{
|
||||||
@@ -197,7 +265,7 @@ func main() {
|
|||||||
Password: dbPassword.Result,
|
Password: dbPassword.Result,
|
||||||
DbSubnetGroupName: dbSubnetGroup.Name,
|
DbSubnetGroupName: dbSubnetGroup.Name,
|
||||||
VpcSecurityGroupIds: pulumi.StringArray{dbSecurityGroup.ID()},
|
VpcSecurityGroupIds: pulumi.StringArray{dbSecurityGroup.ID()},
|
||||||
PubliclyAccessible: pulumi.Bool(false),
|
PubliclyAccessible: pulumi.Bool(true),
|
||||||
MultiAz: pulumi.Bool(false),
|
MultiAz: pulumi.Bool(false),
|
||||||
BackupRetentionPeriod: pulumi.Int(0),
|
BackupRetentionPeriod: pulumi.Int(0),
|
||||||
DeletionProtection: pulumi.Bool(false),
|
DeletionProtection: pulumi.Bool(false),
|
||||||
@@ -208,6 +276,28 @@ func main() {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pgProvider, err := postgresql.NewProvider(ctx, "postgres-provider", &postgresql.ProviderArgs{
|
||||||
|
Host: db.Address,
|
||||||
|
Port: db.Port,
|
||||||
|
Username: pulumi.String("postgres"),
|
||||||
|
Password: dbPassword.Result,
|
||||||
|
Sslmode: pulumi.String("require"),
|
||||||
|
Superuser: pulumi.Bool(false),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = newServiceDatabase(ctx, pgProvider, "cms")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = newServiceDatabase(ctx, pgProvider, "discovery")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// Export the name of the bucket
|
// Export the name of the bucket
|
||||||
ctx.Export("bucketName", bucket.ID())
|
ctx.Export("bucketName", bucket.ID())
|
||||||
ctx.Export("cdnDomainName", distribution.DomainName)
|
ctx.Export("cdnDomainName", distribution.DomainName)
|
||||||
|
|||||||
Reference in New Issue
Block a user