久しぶりに使うことになったのでアンラーニングを兼ねてメモ
Terraformって何?
クラウドインフラに対するinfrastructure as code。クラウドインフラの設定をコード化して、保存/実行できる
infrastructure as codeできると何が良いの?
コードにすることで、インフラの更新をVCSに残せる
VCSに残せると、変更履歴が残せる。インフラの変更をレビューしやすくなる。CIに乗せることができる。とメリットが多い
Terraformがinfrastructure as codeできるインフラって何があるの?
AWSとかGCPとかAzureとかいろいろ。Datadogの設定とかもTerraform化できる
AWSだとCloudFormationもあるけど?
肌感覚だとTerraform使っている人が多い印象。ぶっちゃけどっちでも良いと思うのでチームで決めれば良いと思う。弊社はTerraform
Terraformの流れ
- インフラの設定を
.tf
ファイルに独自言語で記述 terraform plan
で変更内容を確認terraform apply
で実際に変更
変更されたあと、生成されたリソースのIDなどの具体的な情報が tfstate というテキストファイルに保持される。ここがポイント
tfstateをVCSで管理することは非推奨
VCS を用いることは非推奨とされています。これは例えば複数人が git clone して同時に terraform apply を実行してしまった場合などに、競合が発生する可能性があるからです。 tfstate は常に唯一無二のファイルがどこかに存在し、誰もがそのファイルを参照する必要があります。
んじゃどうやって管理するの?
Terraformでは、backendという設定でtfstateの管理場所を設定できる。AWSだと大体S3にupして管理するのが主流っぽい
ただしS3にしても、複数箇所で同時にTerraform applyが実行されると、変更がコンフリクトする可能性がある
これを回避するため、S3+何かしらのデータベースでロックして、1回に1人しかTerraform applyできないように設定することもできる(らしい)
ここまでやれば安心だけど、Terraformのためにインフラを作る必要があったりして大変
そこで Terraform Coud
Terraform Cloudは公式のterraformのSaaS
できることは大まかに
- tfstateの管理
- Terraformコマンドの実行
- TerraformのCI化(VCSの更新をトリガに
terraform apply
を実行できる) - APIキーなどの秘匿情報のセキュアな管理
エンジニアはtfファイルを書いて、github に push すれば、あとのことはTerraform Cloudがやってくれるので大変便利
今現在、フリープランだとチーム5名まで無料なので、小規模なチームだったらとりあえず入れちゃって良いんじゃないかなという理解
無料版と有料版の違いはこちらも参照
TerraformのLinerやセキュリティスキャナーについて
このあたりをgithub Actionsで動作させると幸せになれるはず
tflint
Terraformのlinter。存在しないインスタンスタイプなど、Terraformではエラーにならないが、NGなものをチェックして指摘してくれる
tfsec
Terraformのセキュリティスキャナー。機密情報が紛れていないかとか、AWSやGCPのベストプラクティスに違反していないかチェックしてくれる
まとめ
- Terraformはクラウドインフラのinfrastructure as code
- Terraform Cloudをつかうことで、面倒くさいところをSaaSに移譲できる
- Linerやセキュリティスキャナーがあるので使おう