やりたきこと
- いちいち命名規則を見に行きたくない
- 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でレビューを実行する
あたりを進めていこうと思います。