Infrastructure as Code
Infrastructure as Code
Bo-Yi Wu
2021/11/16
Pulumi vs Terraform
About me
• Software Engineer in Mediatek
(避免⼈為操作失敗?)
IaC 帶來的好處?
• 版本控制 (審核避免錯誤)
• 重複使⽤ (減少建置時間)
• 環境⼀⾄性 (測試及正式)
• 團隊成長 (分享學習資源)
⼯具選擇?
Terraform
• Domain Speci c Language of IaC Tool
HCL 語法
f lter {
name = "name"
values = ["app base docker image *"]
}
f lter {
name = "virtualization type"
values = ["hvm"]
}
owners = ["161654634948"] # Canonical
}
tags = {
Name = "foobar api 01"
Project = "foobar"
Environment = var.environment["production"]
}
}
i
i
-
i
-
-
-
-
i
What if you need more logic?
• Conditionals
• Loops
• Functions
• re-use logic
_, err s3.NewBucket(ctx, "wms bucket", &s3.BucketArgs{
Acl: pulumi.String("private"),
Bucket: pulumi.String("objects.wms"),
ForceDestroy: pulumi.Bool(false),
LifecycleRules: s3.BucketLifecycleRuleArray{
&s3.BucketLifecycleRuleArgs{
Enabled: pulumi.Bool(true),
Expiration: &s3.BucketLifecycleRuleExpirationArgs{
Days: pulumi.Int(7),
},
Pref x: pulumi.String("backup"),
Tags: pulumi.StringMap{
"autoclean": pulumi.String("true"),
"name": pulumi.String("database"),
},
},
}, AWS S3 using Golang
}, pulumi.Protect(true))
:
=
i
-
Con guration by ENV
(AWS Global and China)
fi
Amazon FSx for Lustre
(Don’t support in China)
Conf g struct {
Logging Logging
Server Server
Database Database
Redis Redis
Storage Storage
Queue Queue
}
Database struct {
Driver string `envconf g:"APP_DATABASE_DRIVER"`
Username string `envconf g:"APP_DATABASE_USERNAME"`
Password string `envconf g:"APP_DATABASE_PASSWORD"`
Name string `envconf g:"APP_DATABASE_NAME"`
}
i
i
i
i
i
Pulumi Support Language
• Golang
• C#
• Python
• JavaScript
• TypeScript
• F#
• VB
Terraform
就不能⽤程式語⾔來寫?
https: github.com/hashicorp/terraform cdk
/
/
-
Pulumi
Cloud Provider
Converting From Terraform
Using tf2pulumi Tool
Using Pulumi and Terraform
Side-by-Side from
Terraform state
import * as pulumi from "@pulumi/pulumi"
import * as terraform from "@pulumi/terraform"
fi
{
fi
,
fi
;
⾃⾏開發整合⼯具?
(Automation API)
https: .pulumi.com/blog/automation api/
/
/
w
w
w
-
YA! 不⽤使⽤ CLI Tool
(pulumi command)
Automation API allows you to embed Pulumi within your application code
1. Database Migration
_, err = rds.NewClusterInstance(ctx, "dbInstance", &rds.ClusterInstanceArgs{
ClusterIdentif er: cluster.ClusterIdentif er,
InstanceClass: rds.InstanceType_T3_Small,
Engine: rds.EngineTypeAuroraMysql,
EngineVersion: pulumi.String("5.7.mysql_aurora.2.03.2"),
PubliclyAccessible: pulumi.Bool(true),
DbSubnetGroupName: subnetGroup.Name,
})
if err nil {
return err
}
ctx.Export("host", cluster.Endpoint)
ctx.Export("dbName", dbName)
ctx.Export("dbUser", dbUser)
ctx.Export("dbPass", dbPass)
!
=
i
i
create our stack with an "inline" Pulumi program (deployFunc)
stack auto.UpsertStackInlineSource(ctx, stackName, projectName, deployFunc)
run the update to deploy our database
res, err stack.Up(ctx, stdoutStreamer)
fmt.Println("Update succeeded!")
establish db connection
db sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:3306)/%s", dbUser, dbPass, host, dbName))
defer db.Close()
stackName createReq.ID
program createPulumiProgram(createReq.Content)
w.WriteHeader(500)
fmt.Fprintf(w, err.Error())
return
}
s.SetConf g(ctx, "aws:region", auto.Conf gValue{Value: "us west-2"})
• 可以使⽤熟悉的語⾔, 不⽤學習新語法
• 減少複製流程, ⾃由建立模組清單
DevOps 團隊
• Policy as Code
import (
"github.com/pulumi/pulumi aws/sdk/v4/go/aws/s3"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx pulumi.Context) error {
Create an AWS resource (S3 Bucket)
bucket, err s3.NewBucket(ctx, "my bucket", nil)
if err nil {
return err
}
return nil
})
/
/
/
i
/
:
=
!
!
:
=
=
=
!
:
=
:
=
:
=
=
*
i
-
-
i
i
Pulumi Pricing
免費⽅案
Convince Your Boss
Thank You