Pocket

プライベートで利用しているインフラ環境(DigitalOcean)ですが、Terraformで全てコード化しています。去年以下ブログより開発環境や、CircleCIでCI/CDの環境も出来上がったというところで、TFLintを導入してみました。導入したものの、Warningが40個以上出てやる気を失いましたが、なんとか全部対応したので振り返っていきたいと思います。

[CircleCI][Orbs][path-filtering]特定ディレクトリに差分が出たらterraform applyを適用するように実装してみた


TFLintって何よ?

https://github.com/terraform-linters/tflint

TerraformのLinterです。上記のブログで terraform validateやplan をCIで実行していますが、検知できないものもあります。また、TFLintは構文やパラメータなどTerraform本家のルールに相違ないかをチェックしてくれるツワモノなので、新規でインフラ構築をするには必須となるツールでしょう。インストール方法はローカルならbrewで、自分のTerraform開発環境はAlpineなのでwgetで解凍して利用しました。

  • Dockerfile

  • version


.tflint.hcl(DigitalOcean)

https://github.com/terraform-linters/tflint/blob/master/docs/user-guide/config.md

https://github.com/terraform-linters/tflint/tree/master/docs/rules

  • .tflint.hcl

.tflint.hcl各クラウドで利用できるプラグインやruleを指定できます。AWSやGCPの場合、専用のプラグインを利用することで、そんなインスタンスタイプないぜ!、applyすることで失敗になる場合も下がる、など検知が可能になりますが、DigitalOceanはプラグインがなさそう!?とのことで今回は一般的に利用されているデフォルトのruleに絞りました。さて、ここからが正念場となります。


Warning/Notice対応

  • Warning: List items should be accessed using square

https://github.com/terraform-linters/tflint/blob/v0.38.1/docs/rules/terraform_deprecated_index.md

Warning: List items should be accessed using square brackets(terraform_deprecated_index)

on do_kubernetes.tf line 17:

17: client_certificate = base64decode(digitalocean_kubernetes_cluster.adachin-wiki-cluster.kube_config.0.client_certificate)

listでcountがある場合は大括弧を指定しよう!と言われているので、以下のように数字のところを [] で囲いました。自分で書いててこれは気づかないぞ…!

  • Notice: k8s-size variable has no description (terraform_documented_variables)

https://github.com/terraform-linters/tflint/blob/v0.38.1/docs/rules/terraform_documented_variables.md

Notice: k8s-size variable has no description (terraform_documented_variables)

on variables.tf line 29:
29: variable “k8s-size” {

変数名は必ずdescriptionを書いて誰でも分かるようにしましょう!とのことなので追加するだけです。初めて知った…!

  • Notice: resource name adachin-wiki-cluster must match the following format: snake_case (terraform_naming_convention)

https://github.com/terraform-linters/tflint/blob/v0.38.1/docs/rules/terraform_naming_convention.md

Notice: resource name adachin-wiki-cluster must match the following format: snake_case (terraform_naming_convention)

on do_kubernetes.tf line 1:
1: resource “digitalocean_kubernetes_cluster” “adachin-wiki-cluster” {

resource名はアンダーバーにしましょう!とのことなので、これはterraform mvコマンドを利用して参照しているものを全て変更しました。これくらいは朝飯前ですな。

  • Warning: Missing version constraint for provider “kubernetes” in “required_providers” (terraform_required_providers)

https://github.com/terraform-linters/tflint/blob/v0.38.1/docs/rules/terraform_required_providers.md

Warning: Missing version constraint for provider “kubernetes” in “required_providers” (terraform_required_providers)

on do_kubernetes.tf line 14:
14: provider “kubernetes” {

provider指定しているならバージョン指定しましょう!とのことで、backend.tfに追加しました。こんなん知らんぞ…

  • Warning: Module should include a main.tf file as the primary entrypoint (terraform_standard_module_structure)
  • Warning: Module should include an empty outputs.tf file (terraform_standard_module_structure)

https://github.com/terraform-linters/tflint/blob/v0.38.1/docs/rules/terraform_standard_module_structure.md

Warning: Module should include a main.tf file as the primary entrypoint(terraform_standard_module_structure)

on main.tf line 1:
(source code not available)

Warning: Module should include an empty outputs.tf file (terraform_standard_module_structure)

on outputs.tf line 1:
(source code not available)

最小限のモジュールとしてmain.tf、outputs.tfは空でもいいから作成してね!とのことだったので追加しました。基本各役割ごとにファイルを作成していたので必須なの知らんかった…

  • Warning: k8s_size variable has no type (terraform_typed_variables)

https://github.com/terraform-linters/tflint/blob/v0.38.1/docs/rules/terraform_typed_variables.md

変数にはちゃんと型を定義してね!とのことなのでstringを追加しました。なかなか細かい…!

これらが実際40個以上あったので対応完了となります。死にそうだった…


CircleCIにTFLintを追加

  • .circleci/config.yml

  • .circleci/workflows.yml

Terraform CircleCIは最近Orbsに移行し、path-filteringで差分があるときに実行できるようにしています。追加したところはTFLintのインストール36行目と、validate後にTFLintを実行したいため、68、87行目に追加しました。実際にWarningを出してみましょう。

  • Warning

  • 正常時


まとめ

まずは8月までの目標としてTFLintを導入することができました。Terraformのリファクタリングを前進できたのは良かったですし、新たなる気付きと勉強にもなりました。ただ、初期の状態から導入しておけばよかったと後悔…!次はwikiのWordPressコンテナをCircleCIでbuildできるように作ってみたいと思います。tfsecも面白そうなので時間ある時に試してみたいと思います。

Pocket


adachin

1989年生まれのSRE。ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。現在はサービスの信頼性向上、DevOps、可用性、レイテンシ、パフォーマンス、モニタリング、オブザーバビリティ、緊急対応、AWS/Azureでのインフラ構築、Docker開発環境の提供、Kubernetes保守、インフラコード化、新技術の検証、リファクタリング、セキュリティ強化などを担当している。個人事業主では数社サーバー保守とベンチャー企業のSREインフラコンサルティングやMENTAで未経験者にインフラのコーチング/コミュニティの運用を実施している。また、「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。

0件のコメント

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください