使用tfcmt和tfsec进行设置,增强terraform的CI工具
首先
如果引入tfcmt,您可以在拉取请求中显示terraform plan的结果。
另外,通过引入tfsec,它可以检测您所创建的资源在安全性和最佳实践方面是否存在安全问题。
通过将这两个工具作为CI引入,让我们过上舒适的Terraform生活吧。
欲找到目标读者
-
- Planの結果をActionsの中から確認するのが手間な方
- Terraformのコードの品質とセキュリティを向上させたい方
上一篇文章
- https://qiita.com/bkend_2/items/b651614576a239004c3f
工具的说明
很抱歉,我不明白”tfcmt”的含义,无法提供你所需的中文翻译。请提供更多上下文或详细说明。
-
- terraform planやapplyの結果をプルリクにコメントするツール
- Actionsのページへ移動する手間を解消する
“tfsec”可以用中文解释为:”tfsec”
-
- Terraformコード向けの静的解析ツール
- セキュリティ上の問題を検出する
Terraform的代码
认证将使用OIDC进行。
使用Terraform创建OIDC。
引入TFCMT
为了使用tfcmt,需要添加两个步骤。
-
- 安装tfcmt
- 使用tfcmt执行terraform plan
※ TOKEN是将生成的访问令牌存储在secrets中。生成方法在此。
.github/workflows/dev_plan.yml -> .github工作流程/开发计划.yml
name: tfcmtを導入
on:
push:
branches:
- feature/*
- hotfix/*
pull_request:
branches:
- feature/*
- hotfix/*
permissions:
id-token: write
contents: read
jobs:
terraform_dev_plan:
name: terraform - dev - plan
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: 1.5.4
- name: AWS OIDC credential
uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT }}:role/${{ secrets.OIDC_ROLE }}
aws-region: ap-northeast-1
- name: setup tfcmt # 1. tfcmtをインストール
env:
TFCMT_VERSION: v3.4.1
run: |
wget "https://github.com/suzuki-shunsuke/tfcmt/releases/download/${TFCMT_VERSION}/tfcmt_linux_amd64.tar.gz" -O /tmp/tfcmt.tar.gz
tar xzf /tmp/tfcmt.tar.gz -C /tmp
mv /tmp/tfcmt /usr/local/bin
tfcmt --version
- name: Terraform Init
run: terraform init -upgrade
working-directory: ./envs/dev
- name: Terraform fmt
run: terraform fmt -check
- name: Terraform Validate
run: terraform validate -no-color
- name: terraform refresh
run: terraform refresh -no-color -lock=false -var="env=dev"
working-directory: ./envs/dev
- name: Terraform Plan
run: |
terraform plan \
-no-color \
-lock=false \
-var="env=dev"
working-directory: ./envs/dev
- name: Terraform Plan cmt # 2. tfcmtを使用して、terraform planを実行
run: tfcmt plan -patch -- terraform plan -no-color -input=false -lock=false -var="env=dev"
working-directory: ./envs/dev
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }}
安装tfsec
-
- tfsecでチェックし、危険性が「critial」と「high」があった場合はCIが失敗させます。
- 危険性が「medium」と「low」があってもCIが失敗しないようにしています。
.github/workflows/dev_tfsec.yml 的中文表达如下:
name: dev環境にtfsec
on:
push:
branches:
- feature/*
- hotfix/*
pull_request:
branches:
- feature/*
- hotfix/*
jobs:
tfsec:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Go # Golangをインストール
uses: actions/setup-go@v4
with:
go-version: 1.20.8
- name: Install tfsec # tfsecをインストール
run: go install github.com/aquasecurity/tfsec/cmd/tfsec@v1.28.1
- name: Install jq # jqをインストール
run: sudo apt-get install jq
- name: Show Result tfsec # ./envs/devに対してtfsecを実行
run: tfsec ./envs/dev || true
- name: Run tfsec # ./envs/devに対してtfsecを実行し、結果をjson形式で出力
run: tfsec ./envs/dev --format json > tfsec_output.json || true
- name: Check tfsec results # tfsecの結果を確認し、critical/highの結果があればCIが失敗
run: |
critical_count=$(jq '[.results[] | select(.severity == "CRITICAL")] | length' tfsec_output.json)
high_count=$(jq '[.results[] | select(.severity == "HIGH")] | length' tfsec_output.json)
if [ $critical_count -eq 0 ] && [ $high_count -eq 0 ]; then
echo "No critical or high findings, CI passes."
exit 0
else
echo "Critical or high findings detected, CI fails."
exit 1
fi
确认行动

最后
通过引入TFCMT和TFSEC,可以更轻松地进行代码审查并进行安全检查,强烈推荐。请尝试将其中一种引入到CI中。非常感谢您阅读到最后。
这是我们最近创建的 GitHub 仓库:https://github.com/hikobend/terraform-qiita。
文献资料
-
- suzuki-shunsuke/tfcmt
-
- tfcmt で Terraform の CI/CD を改善する
-
- tfcmt
-
- aquasecurity/tfsec
-
- 【tfsec】Terraformの静的セキュリティスキャンを行ってみよう!
- tfsecの基本的な使い方を説明します