terrascan にも無視してもらいたい

## はじめに

terrascan は素晴らしいツールです

Terraform で書いたインフラの脆弱性を指摘してくれます

https://github.com/accurics/terrascan

AWS などのクラウドインフラを構築する際、推奨の構成を知らないままだと、必要な設定が漏れていたり、よりセキュアな値になっていなかったりします

terrascan は私たちに最適でセキュアなインフラを教えてくれるのです

私は GitHub Actions の Super-Linter でいつもお世話になっています

しかし、やはり、どうしても無視してほしいときがあるのです

## どうしても無視してほしい

AWS で API Gwateway を使って REST API を構築しています

```terraform
resource "aws_api_gateway_rest_api" "hello" {
  name        = "Hello API"
  description = "Hello!!"
  body        = data.template_file.hello.rendered

  endpoint_configuration {
    types = ["EDGE"]
  }

  tags = local.tags.stage
}
```

これに対して、 terrascan は怒るのです

```text
	Description    :	API Gateway Private Endpoints
	File           :	apigateway-stage.tf
	Line           :	1
	Severity       :	MEDIUM
```

`endpoint_configuration` で `types` に `EDGE` を指定しています

`types` はどのように API にアクセスするかを指定します

- EDGE

    CloudFront を経由してアクセスします

    世界各地からアクセスされる場合に最適です

- REGIONAL

    直接アクセスします

    同じ地域からのみアクセスする場合に最適です

- PRIVATE

    VPC 内からのみアクセス可能にします

    システム内部の API の場合に最適です

当然、 PRIVATE が最もセキュアですが、今回作っているのは公開 API なので、そのような指摘はお節介なのです

## なぜか無視できない

当然、[無視したいときのためにコメントで指定できるようになっています][ignore]

`"ts:skip=<RULENAME><SKIP_REASON>"` を無視したいブロックの中に書きます

```terraform
resource "aws_db_instance" "aaa" {
  "ts:skip=AWS.RDS.DataSecurity.High.0414 need to skip this rule
```

早速、エラーメッセージに出ていた `API Gateway Private Endpoints terrascan` で検索します

すると、エラー一覧のドキュメントが出てきました

https://docs.accurics.com/projects/accurics-terrascan/en/latest/policies/aws.html#aws_api_gateway_rest_api

当該エラーの `Reference ID` は `AWS.APIGateway.Network Security.Medium.0570` になっていました

というわけで、無視のためのコメントを加えます

```terraform
resource "aws_api_gateway_rest_api" "hello" {
  #ts:skip=AWS.APIGateway.Network Security.Medium.0570 This is public API
  name        = "Hello API"
  description = "Hello!!"
  body        = data.template_file.hello.rendered

  endpoint_configuration {
    types = ["EDGE"]
  }

  tags = local.tags.stage
}
```

が、なぜかエラーは変わらず

どういうわけだ？

## 詳細結果を見る

GitHub Actions の結果ではエラーの ID が分からないので、ローカルで実行して詳細結果を表示します

```bash
terrascan -t aws -v
```

多くのツールで `-v` は `verbose` 詳細を意味します

これで実行すると、以下のようにエラーが表示されました

```text
        Description    :        API Gateway Private Endpoints
        File           :        apigateway-stage.tf
        Module Name    :        root
        Plan Root      :        ./
        Line           :        1
        Severity       :        MEDIUM
        Rule Name      :        apiGatewayEndpointConfig
        Rule ID        :        AWS.APIGateway.NetworkSecurity.Medium.0570
        Resource Name  :        sodai-vision-api-stage
        Resource Type  :        aws_api_gateway_rest_api
        Category       :        Infrastructure Security
```

`Rule ID` は `AWS.APIGateway.NetworkSecurity.Medium.0570` です

つまり、スペースを省くのが正しかったのです

よく考えれば当然ですね

というわけで、以下のように修正します

```terraform
resource "aws_api_gateway_rest_api" "hello" {
  #ts:skip=AWS.APIGateway.NetworkSecurity.Medium.0570 This is public API.
  name        = "Hello API"
  description = "Hello!!"
  body        = data.template_file.hello.rendered

  endpoint_configuration {
    types = ["EDGE"]
  }

  tags = local.tags.stage
}
```

これでエラーにならず、 `Skipped Violations` として表示されるようになりました

## 最後に

公式ドキュメントを見ても分からないこともあります

エラー時にはより詳細なログを見てみましょう

[ignore]: https://github.com/accurics/terrascan#how-to-exclude-a-policy-while-scanning-a-resource