【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万チョットだし会社組織なら余裕だと思う。

另外说

    • タイトルはとあるラノベのタイトルから拝借いたしました。

 

    • が、私はそのラノベを読んでおりませぬ・・・

 

    • タイトルは煽りであって、自分のワークスペースが間違っているかどうかは知りません

 

    みんなどういう管理をしているのだろうか・・・
广告
将在 10 秒后关闭
bannerAds