【terraform】也许我这个Workspace搞错了
这是「「首先」的 Advent Calendar 2021」的第二天文章。
烦恼
- tfファイルは1つで、複数環境への反映するベストプラクティスがわからない。
管理多个环境的方法
要创建相同资源的三个AWS帐户,该怎么做?
这三个AWS帐户各自
-
- 開発環境: development
ステージング: staging
本番環境: production
假设我们将要搭建开发环境,配置如下所示。
terraform
|- terraform.tf
|- ec2.tf
|- vpc.tf
|- s3.tf
|- provider.tf
如果要从这里开始,增加第二个账户和第三个账户,如何有效地管理状态呢?
请注意,状态管理将在远程进行,而不是在文件中进行。
A: 一个目录,多个状态,默认工作空间。
-
- ディレクトリ内のファイル構成:
そのまま
State:
アカウントごとにStateを管理するS3を準備
環境の切替方法:
init時にでstateの場所を指定
ワークスペース:
default
请以不同环境为例,
rm -fr .terraform
terraform init -backend-config=../staging.conf
执行。
虽然相对简单,但因工作空间固定在默认值上,难以分辨正在处理哪个State,因此尝试在开发环境中进行更改测试时,可能会发生意外进入了生产环境的情况。
为了避免此类事故并简化后端指定,需要借助包装器脚本或terraform外部的工具。
B: 一个目录,一个状态,多个工作区
-
- ディレクトリ内のファイル構成:
そのまま
State:
Stateを管理する専用のS3を1つ準備
環境の切替方法:
workspaceの切り替え
ワークスペース:
development staging production
在工作台上切换的方式似乎是最清晰的,但据官方称其并不受推荐。
可能是因为需要使用count进行控制,变得更加复杂吧。
在哪里放置管理S3账户的State,这是个问题。
将其放置在production中,在数据管理方面会有很多限制,将其放置在development中,生产环境的资源信息就会泄露给开发环境,这种情况也很常见。
所以,为了安全管理,需要另外准备一个账户。真是令人烦恼。
C: 一个目录,多个状态,各自有工作空间名称
-
- ディレクトリ内のファイル構成:
そのまま
State:
アカウントごとにStateを管理するS3を準備
環境の切替方法:
init時にでstateの場所を指定した後、workspaceの切り替え
ワークスペース:
development staging production
这是一种A模式的变种,通过将工作空间分开,以减少事故发生的可能性。
在使用时将变成这样。
rm -fr .terraform
terraform init -backend-config=../staging.conf
terraform workspace select staging
如果在Shell提示符上显示工作区名称,可以减少事故发生的概率。
操作会变多。
顺便说一下,我之前使用过这种模式,但是我发现在S3桶的staging环境中竟然生长出了一个production工作区的空间。
虽然我用变量做了一些安全性检查,但是不能应用,感觉有些东西在增加而且无用,让人感到不舒服。
D:通过模块分割,每个环境都有一个目录,每个目录有一个状态,并且有一个默认工作空间。
-
- ディレクトリ内のファイル構成:
環境ごとにディレクトリを分ける。リソースは全てモジュール化。
State:
アカウントごとにStateを管理するS3を準備
環境の切替方法:
ディレクトリ移動
ワークスペース:
default
在官方文件中也推荐的方法。
在多个环境中使用 = 重复利用,所以需要进行共通模块化。
确实是最低耦合的。
但是,感觉付出的努力与回报不相称。
如果有许多团队,并且每个团队都可以自由使用模块的话,我可以理解这样的组织结构,但对于小团队来说太过艰辛。
我觉得缺点的时间成本比优点更大。
最后怎么样了?
由于在S3上进行管理很麻烦,所以尝试使用Terraform Cloud。结果是这样的。
-
- ディレクトリ内のファイル構成:
そのまま
State:
terraform cloudのworkspace
環境の切替方法:
initは最初の1回だけ。あとはworkspaceの切り替え。
ワークスペース:
development staging production
只需将状态管理从S3更改为terraform云,选择模式B。
文件在GitHub上进行管理。
在Terraform Cloud上创建了3个工作区,全部指向同一代码库、同一目录。
接下来将terraform.tf文件配置如下:
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "hajimeni"
workspaces {
prefix = "hajimeni-"
}
}
}
只需运行一次terraform init,并切换工作区即可切换环境;将状态管理交给terraform云,禁止本地应用可以防止意外事件发生。
公式建议模块化,但目前我觉得这种方式正合适。
当资源增加时,可能会出现不同的问题和烦恼。
因此,让我们大家一起使用 Terraform Cloud 吧!(发推)
-
- 開発チームが少なければ(5人以下なら)FreePlanで全然使える。
-
- Team planでも1人あたり $20/mo なので、高くはないと思う。
チーム内にTerraform触れる人数によると思うけど。
20人触る人がいても $400/mo で日本円で4万チョットだし会社組織なら余裕だと思う。
另外说
-
- タイトルはとあるラノベのタイトルから拝借いたしました。
-
- が、私はそのラノベを読んでおりませぬ・・・
-
- タイトルは煽りであって、自分のワークスペースが間違っているかどうかは知りません
- みんなどういう管理をしているのだろうか・・・