インフラをコード化したし、オートレビューするか（tf_cop）

## tl;dr

- インフラのネーミングルールやtagの運用を自動レビューで担保したい！
- ローカルでできたので `pip パッケージ化` した<br>[（前回の記事：インフラをオートレビューしたい！！）](https://qiita.com/ys_tydy/items/c223d0e9f7b8164d1944)
- [Pypi](https://pypi.org/project/tf-cop/#description)と[Git](https://github.com/ys-tydy/tf_cop)で公開しています( `pip install tf_cop` )
- 詳しい使い方はReadmeに書いています

## 何が嬉しいの？

- わざわざネーミングルールを意識しなくてよくなります
- コンソール上で名前の表示されないEC2やらが無くなります（tagのつけ忘れ防止）
- descriptionのないterraformのコードが無くなります（descriptionつけ忘れ防止）
- その他色々

## テスト実行結果

以下の感じでコードをかくと...

```python:test.py
import tf_cop

if __name__ == '__main__':
    test = tf_cop.TfCop()
    test.tf_review("./test", "./review_book")
    output = test.output()
    print(output["output_log"])
    print(output["output_summary_log"])
```

こんな感じの結果が出る

```terminal:output
==========================================================
RESOURCE AWS_S3_BUCKET.TEST_TF_REVIEW_BUCKET
==========================================================
[WARN] desc_checker : description not use
{   'acl': 'private',
    'bucket': '${terraform.env}-tf-review-bucket'}
[ALERT] tag_checker : tags not use
{   'acl': 'private',
    'bucket': '${terraform.env}-tf-review-bucket'}

==========================================================
RESOURCE AWS_S3_BUCKET.TEST_TF_REVIEW_BUCKET2
==========================================================
[WARN] desc_checker : description not use
{   'acl': 'private',
    'bucket': '${terraform.env}-tf-review-bucket2',
    'lifecycle_rule': {...},
    'logging': {...},
    'tags': {...}}
[PASS] tag_checker : passed
[PASS] name_checker : passed
[PASS] env_checker : passed


 =======================
| RESOURCE NUM  : 2     |
| SKIP NUM      : 0     |
| PASS NUM      : 3     |
| WARN NUM      : 2     |
| ALERT NUM     : 1     |
 =======================
```
※実際は色付きで出ます


## チェックの内容
テストだと以下のyamlの設定でS3をテストしています。

```yaml:s3.yaml
aws_s3_bucket:
-
  title: desc_checker
  desc: simple existance checker
  mode: existance
  warn: True
  key: description
-
  title: tag_checker
  desc: nested value checker
  mode: nested
  key: tags
  nest:
    -
      title: name_checker
      desc: nested value checker
      mode: existance
      key: Name
    -
      title: env_checker
      desc: nested value checker
      mode: value
      warn: True
      key: Env
      value: (dev|stg|prd)
```

テスト対象のtfファイルは以下のものです

```hcl:s3.tf
resource "aws_s3_bucket" "test_tf_review_bucket" {
  bucket = "${terraform.env}-tf-review-bucket"
  acl = "private"
}

resource "aws_s3_bucket" "test_tf_review_bucket2" {
  bucket = "${terraform.env}-tf-review-bucket2"
  acl = "private"

  logging {
    target_bucket = "${terraform.env}-tf-review-bucket-log"
    target_prefix = "${terraform.env}-tf-review-bucket/"
  }

  lifecycle_rule {
    id = "cap-s3bucket-lifecycle-rule"
    prefix = ""
    enabled = true
    abort_incomplete_multipart_upload_days = 7
  }

  tags {
    Name = "${terraform.env}-tf-review-bucket"
    Env = "dev"
  }
}
```

そのため `tags` で `Name =` が書かれていない等のアラートが出ます。

## できるまで

- テスト用のyamlの設計が悩む
    - alertかどうかを `alert: True` で入れるのはいまだに微妙な気がする笑
    - 否定形も定義できるようにと言いつつまだやっていない
- `Pypi` で公開するのが難しかった。。。
    - めっちゃ参考にした => [Pythonで作成したライブラリを、PyPIに公開/アップロードする](https://qiita.com/icoxfog417/items/edba14600323df6bf5e0)
    - defaultのテストを入れるためにパッケージにyamlを入れるのにも苦労...

## 感想！！
- 自分で作ったものが世に出て行くのは気持ちいい！
- `Pypi` に公開するのが想像の100倍楽だった
- 誰かにイシュー上げてもらえるぐらいになりたいな。。。