LoginSignup
1
1

More than 5 years have passed since last update.

terraformをパースして自動で命名規則等のアラートを出したい!

Last updated at Posted at 2018-09-20

やりたきこと

  • いちいち命名規則を見に行きたくない
  • tagとかも統一したい
  • s3のloggingルールとかも忘れないように・・・
  • description書けるやつは忘れずに書きたい!

tfファイルをパースして名前とかを正規表現で引っ掛けるしかない!!

まずローカルでプログラムが動くように!

以下のサンプルを例にファイルから読み込んでパースできるようにする
ohsawa0515/hcl_parse_sample

発生した問題

docker内のGoで以下のようなコードを書いていたのですが。。。

Dockerfile
FROM golang:latest

WORKDIR /go/src/app
RUN go get -u github.com/golang/dep/cmd/dep

ADD . .
RUN dep ensure

CMD ["go", "run", "main.go"]
main.go
package main

import (
    "fmt"
    "io/ioutil"
    "log"

    hclParser "github.com/hashicorp/hcl/hcl/parser"
)


func main() {
    log.Println("--- Parsing HCL ---")

    d, err := ioutil.ReadFile("./s3.tf")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(d))

    if astFile, err := hclParser.Parse([]byte(string(d))); err == nil {
        fmt.Println(astFile)
    } else {
        fmt.Println("Parsing failed.")
    }
    fmt.Println(astFile.name)

    log.Println("--- Generate HCL ---")
}

goがよくわからない!!!笑
パースした中身がちゃんとできているか確認もできない状態。。。

pythonのパッケージを見つけたので急遽そちらに

virtuald/pyhcl
pythonでdict型に変換できるのでスラスラ進み始める

最終的にできたもの

ひとまず動くものができた!!
test_tf_review

main.py
# coding: UTF-8
import hcl
import yaml
import re
import codecs


def tag_check_review(resource_dict, review_dict_list):
    for review_dict in review_dict_list:
        if "tags" not in resource_dict:
            return False, "tags not use"
        if review_dict["tag"]["key"] not in resource_dict["tags"]:
            return False, "need tag " + review_dict["tag"]["key"]
        if not re.match(review_dict["tag"]["regex"], resource_dict["tags"][review_dict["tag"]["key"]]):
            return False, "tag regex not matched " + review_dict["tag"]["key"] + " " + review_dict["tag"]["regex"]
        return True, "pass"


if __name__ == '__main__':
    with codecs.open('./s3.tf', 'r', 'utf-8') as fp:
        obj = hcl.load(fp)

    with codecs.open('./review_book/s3.yaml', 'r', 'utf-8') as fp2:
        review_book = yaml.load(fp2)

    for key in obj["resource"]["aws_s3_bucket"].keys():
        flg, res = tag_check_review(obj["resource"]["aws_s3_bucket"][key], review_book["aws_s3_bucket"])
        print(key)
        print(res)

今後やりたいこと

ひとまずローカルで動くものができたので、

  • レビューの設定(今回だと review_book/s3.yaml)をどのようにまとめるかを決める
  • タグ以外のテストも汎用的に動くようにする
  • 既存のterraform reposirtoryに対してpull requestでレビューを実行する

あたりを進めていこうと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1