Skip to content

Commit c15d47c

Browse files
committed
Go version
1 parent d81b4ca commit c15d47c

File tree

1 file changed

+131
-1
lines changed

1 file changed

+131
-1
lines changed

content/docs/iac/extending-pulumi/use-terraform-module.md

Lines changed: 131 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ packages:
121121
122122
{{% choosable language typescript %}}
123123
124-
Since this was a TypeScript project, Pulumi generated a TypeScript SDK for the modules, making those available to use as `@pulumi/vpcmod` and `@pulumi/rdsmod` respectively. We can now use the Terraform modules directly in our TypeScript code:
124+
Since this was a TypeScript project, Pulumi generated a TypeScript SDK for the modules, making those available to use as `@pulumi/vpcmod` and `@pulumi/rdsmod` respectively. We can now use the Terraform modules directly in our TypeScript code.
125125

126126
***Example:** index.ts - Using the Terraform VPC and RDS module in a Pulumi program*
127127

@@ -292,6 +292,136 @@ rdsmod.Module("test-rds",
292292

293293
{{% /choosable %}}
294294

295+
{{% choosable language go %}}
296+
297+
Since this was a Go project, Pulumi generated a Go SDK for the modules, making those available to use as `github.com/pulumi/pulumi-terraform-module/sdks/go/rdsmod/v6/rdsmod` and `github.com/pulumi/pulumi-terraform-module/sdks/go/vpcmod/v5/vpcmod`. We can now use the Terraform modules directly in our code:
298+
299+
```go
300+
package main
301+
302+
import (
303+
"github.com/pulumi/pulumi-aws/sdk/v6/go/aws"
304+
"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2"
305+
"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/vpc"
306+
"github.com/pulumi/pulumi-std/sdk/go/std"
307+
rdsmod "github.com/pulumi/pulumi-terraform-module/sdks/go/rdsmod/v6/rdsmod"
308+
vpcmod "github.com/pulumi/pulumi-terraform-module/sdks/go/vpcmod/v5/vpcmod"
309+
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
310+
"github.com/pulumi/pulumi/sdk/v3/go/pulumi/config"
311+
)
312+
313+
func run(ctx *pulumi.Context) error {
314+
// Get available availability zones
315+
azs := aws.GetAvailabilityZonesOutput(ctx, aws.GetAvailabilityZonesOutputArgs{
316+
Filters: aws.GetAvailabilityZonesFilterArray{
317+
aws.GetAvailabilityZonesFilterArgs{
318+
Name: pulumi.String("opt-in-status"),
319+
Values: pulumi.StringArray{pulumi.String("opt-in-not-required")},
320+
},
321+
},
322+
})
323+
324+
azNames := azs.Names().ApplyT(func(names []string) []string {
325+
if len(names) > 3 {
326+
return names[:3]
327+
}
328+
return names
329+
}).(pulumi.StringArrayOutput)
330+
331+
cidr := "10.0.0.0/16"
332+
cfg := config.New(ctx, "")
333+
prefix := cfg.Get("prefix")
334+
if prefix == "" {
335+
prefix = ctx.Stack()
336+
}
337+
338+
// Create a VPC using the terraform-aws-modules/vpc module
339+
vpcInstance, err := vpcmod.NewModule(ctx, "test-vpc", &vpcmod.ModuleArgs{
340+
Azs: azNames,
341+
Name: pulumi.Sprintf("test-vpc-%s", prefix),
342+
Cidr: pulumi.String(cidr),
343+
Public_subnets: applyAznamesForSubnet(ctx, azNames, cidr, 1),
344+
Private_subnets: applyAznamesForSubnet(ctx, azNames, cidr, 5),
345+
Database_subnets: applyAznamesForSubnet(ctx, azNames, cidr, 9),
346+
Create_database_subnet_group: pulumi.Bool(true),
347+
})
348+
if err != nil {
349+
return err
350+
}
351+
352+
// Create a security group for the RDS instance
353+
rdsSecurityGroup, err := ec2.NewSecurityGroup(ctx, "test-rds-sg", &ec2.SecurityGroupArgs{
354+
VpcId: vpcInstance.Vpc_id,
355+
})
356+
if err != nil {
357+
return err
358+
}
359+
_, err = vpc.NewSecurityGroupIngressRule(ctx, "test-rds-sg-ingress", &vpc.SecurityGroupIngressRuleArgs{
360+
IpProtocol: pulumi.String("tcp"),
361+
SecurityGroupId: rdsSecurityGroup.ID(),
362+
CidrIpv4: vpcInstance.Vpc_cidr_block,
363+
FromPort: pulumi.Int(3306),
364+
ToPort: pulumi.Int(3306),
365+
})
366+
if err != nil {
367+
return err
368+
}
369+
370+
// Create an RDS instance using the terraform-aws-modules/rds module
371+
_, err = rdsmod.NewModule(ctx, "test-rds", &rdsmod.ModuleArgs{
372+
Engine: pulumi.String("mysql"),
373+
Identifier: pulumi.Sprintf("test-rds-%s", prefix),
374+
Manage_master_user_password: pulumi.Bool(true),
375+
Publicly_accessible: pulumi.Bool(false),
376+
Allocated_storage: pulumi.Float64(20),
377+
Max_allocated_storage: pulumi.Float64(100),
378+
Instance_class: pulumi.String("db.t4g.large"),
379+
Engine_version: pulumi.String("8.0"),
380+
Family: pulumi.String("mysql8.0"),
381+
Db_name: pulumi.String("completeMysql"),
382+
Username: pulumi.String("complete_mysql"),
383+
Port: pulumi.String("3306"),
384+
Multi_az: pulumi.Bool(true),
385+
Db_subnet_group_name: vpcInstance.Database_subnet_group_name,
386+
Vpc_security_group_ids: pulumi.StringArray{rdsSecurityGroup.ID()},
387+
Skip_final_snapshot: pulumi.Bool(true),
388+
Deletion_protection: pulumi.Bool(false),
389+
Create_db_option_group: pulumi.Bool(false),
390+
Create_db_parameter_group: pulumi.Bool(false),
391+
})
392+
return err
393+
}
394+
395+
func applyAznamesForSubnet(
396+
ctx *pulumi.Context,
397+
azNames pulumi.StringArrayOutput,
398+
cidr string,
399+
offset int,
400+
) pulumi.StringArrayOutput {
401+
return azNames.ApplyT(func(azs []string) ([]string, error) {
402+
subnets := make([]string, len(azs))
403+
for i := range azs {
404+
netnum := offset + i
405+
r, err := std.Cidrsubnet(ctx, &std.CidrsubnetArgs{
406+
Input: cidr,
407+
Newbits: 8,
408+
Netnum: netnum,
409+
})
410+
if err != nil {
411+
return nil, err
412+
}
413+
subnets[i] = r.Result
414+
}
415+
return subnets, nil
416+
}).(pulumi.StringArrayOutput)
417+
}
418+
419+
func main() {
420+
pulumi.Run(run)
421+
}
422+
```
423+
{{% /choosable %}}
424+
295425
{{% choosable language yaml %}}
296426

297427
When authoring in YAML, there's no need for Pulumi to generate a SDK. In the YAML you can reference the Terraform module by its schema token, which takes the format `<module-name>:index:Module`:

0 commit comments

Comments
 (0)