当前位置: 首页 > 后端技术 > Java

《Terraform 101 从入门到实践》Terraform在公有云GCP上的应用

时间:2023-04-01 15:12:47 Java

《Terraform 101 从入门到实践》本手册在南瓜慢话官网和GitHub上同步更新。书中的示例代码也放在了GitHub上,供大家参考。Terraform支持的公有云有很多,如AWS、Azure、Google、阿里巴巴等,将Terraform应用到公有云中可以充分发挥其强大的功能。初始化一个GCP项目要创建一个新项目,首先我们需要初始化一个GCP项目。GCP为开发者提供免费试用服务,我们不用花钱就可以学习GCP的功能。要使用GCP,我们需要创建一个项目,它的所有资源都在项目下管理:创建服务账号在实际开发中,我们不能使用自己的账号来操作,最好的方式是创建一个服务账号(ServiceAccount),应该是所有云平台都推荐的。创建位置如下:输入账户名:选择角色。为了方便,我直接选择了Owner,这样就会拥有所有的权限,但是实际应用肯定不是这样的。必须做隔离:对于ServiceAccount,密钥文件的创建不是通过用户名和密码。已授权,但通过密钥文件,创建如下:选择新建密钥,格式为json。创建完成后,会自动下载密钥文件。拿到gcloudSDKKey文件后,我们可以设置环境变量:GOOGLE_APPLICATION_CREDENTIALS:$exportGOOGLE_APPLICATION_CREDENTIALS=/Users/larry/Software/google-cloud-sdk/pkslow-admin-for-all.json激活服务账号:$gcloudauthactivate-service-accountadmin-for-all@pkslow.iam.gserviceaccount.com--key-file=${GOOGLE_APPLICATION_CREDENTIALS}设置SDK项目ID:$gcloudconfigsetprojectpkslow检查设置是否正确:$gcloudauthlistCredentialed帐户活动帐户*admin-for-all@pkslow.iam.gserviceaccount.com要设置活动帐户,请运行:$gcloudconfigsetaccount`ACCOUNT`$gcloudconfiglist[core]account=admin-for-all@pkslow.iam。gserviceaccount.comdisable_usage_reporting=Trueproject=pkslow你的active配置是:[default]UsegcloudtocreatePub/SubSDK设置后就可以使用了。让我们用它来创建Pub/Sub。创建主题和订阅:$gcloudpubsubtopicscreatepkslow-testCreatedtopic[projects/pkslow/topics/pkslow-test].$gcloudpubsubsubscriptionscreatepkslow-sub--topic=pkslow-testCreatedsubscription[projects/pkslow/subscriptions/pkslow-子]。检查是否创建成功:$gcloudpubsubtopicslist---name:projects/pkslow/topics/pkslow-test$gcloudpubsubsubscriptionslist---ackDeadlineSeconds:10expirationPolicy:ttl:2678400smessageRetentionDuration:604800sname:projects/pkslow/subscriptions/pkslow-subpushConfig:{}topic:projects/pkslow/topics/pkslow-test在浏览器中查看,发现已经创建成功:TerraformCreatePub/Sub下载Terraform插件我们需要安装GCP的Terraform插件来管理GCP资源:#设置插件目录$exportTERRAFORM_PLUGIN=/Users/larry/Software/terraform/plugins#创建目录$mkdir-p${TERRAFORM_PLUGIN}/registry.terraform.io/hashicorp/google/4.0.0/darwin_amd64$cd${TERRAFORM_PLUGIN}/registry.terraform.io/hashicorp/google/4.0.0/darwin_amd64#下载$wgethttps://releases.hashicorp.com/terraform-provider-google/4.0.0/terraform-provider-googlee_4.0.0_darwin_amd64.zip#Unzip$unzipterraform-provider-google_4.0.0_darwin_amd64.zip准备Terraform代码,需要提供Terraform代码管理Pub/Sub。更多详情请参考:TerrafromGCP。版本文件version.tf:terraform{required_version="=1.0.11"required_providers{google={source="hashicorp/google"version="=4.0.0"}}}主文件main.tf:provider"google"{project="pkslow"}resource"google_pubsub_topic""pkslow-poc"{name="pkslow-poc"}resource"google_pubsub_subscription""pkslow-poc"{name="pkslow-poc"topic=google_pubsub_topic.pkslow-poc.namelabels={foo="bar"}#20分钟message_retention_duration="1200s"retain_acked_messages=trueack_deadline_seconds=20expiration_policy{ttl="300000.5s"}retry_policy{minimum_backoff="10s"}enable_message_ordering=true}初始化并更改指定的插件目录初始化:$terraforminit-plugin-dir=${TERRAFORM_PLUGIN}使更改生效,相应的资源将在GCP上创建:$terraformapply-auto-approve如果没有错误发生,则表示创建成功,让我们检查一下:$gcloudpubsubtopicslist---name:projects/pkslow/topics/pkslow-poc$gcloudpubsubsubscriptionslist---ackDeadlineSeconds:20enableMessageOrdering:trueexpirationPolicy:ttl:300000.500slabels:foo:barmessageRetentionDuration:1200sname:projects/pkslow/subscriptions/pkslow-pocpushConfig:{}retainAckedMessages:trueretryPolicy:maximumBackoff:600sminimumBackoff:10stopic:projects/pkslow/topics/pkslow-poc注意:我们没有提供任何密码或密钥,所以呢关于Terraform我可以直接操作我的GCP资源吗?因为会根据环境变量GOOGLE_APPLICATION_CREDENTIALS获取发送和接收消息我们使用gcloud向Pub/Sub发送消息:message="LarryDeng"messageIds:-'3491738650256958'$gcloudpubsubtopicspublishpkslow-poc--message="Hi,pkslower"messageIds:-'3491739306095970'从发布/订阅中拉取消息:$gcloudpubsubsubscriptionspullpkslow-poc--auto-ack我们也可以在GCP接口上监控对应的队列,非常方便:通过GoogleCloudStorage(GCS)来管理TerraformState的状态管理Terraform状态文件的最好方式是通过统一存储在云。例如,谷歌云使用GCS。首先创建一个Bucket:terraform/然后在Terraform文件中配置相应的信息:terraform{backend"gcs"{bucket="pkslow-terraform"prefix="state/gcp/pubsub"}}初始化后会在Bucket上创建相应的目录:$terraforminit-plugin-dir=${TERRAFORM_PLUGIN}修改生效:$terraformapply-auto-approve我们在浏览器中查看,发现对应的状态文件已经成功state:通过远程云端,不仅状态可以保存文件,也可以从状态文件中读取数据,比如一些输出变量。比如模块A创建了一个VM,我们可以通过这种方式获取到它的IP,供其他模块使用。一般配置如下:greeting}"vars{greeting="${data.terraform_remote_state.foo.greeting}"}}