Skip to content

Trivy導入

Trivy導入 #365

Workflow file for this run

name: test
# PR作成時、コミットプッシュ時にワークフローを実行
on:
pull_request:
branches:
- main
types: [opened, synchronize]
# ワークフローの同時実行数を1にするための設定
# 複数のPRからterraform applyやterraform testが同時実行されないようにする
# groupの値をstg.yamlやprod.yamlでも同じにすると、全環境で1度に1つのワークフローしか実行できなくなるので注意
# (ただしstagingのapply中にこのワークフローを実行すると、plan時にロックが取得できずにエラーが出るのでその辺りの取り扱いはポリシー次第)
# cancel-in-progress:falseにすると既に実行済みのワークフローの実行が完了するまで、後続のワークフローは待機するようになる
# cancel-in-progress:trueにすると既に実行済みのワークフローをキャンセルして、後続のワークフローを開始する
concurrency:
group: test
cancel-in-progress: false
# すべてのアクセス許可を無効に設定
permissions: {}
env:
# v0.50.3 ref. https://github.com/terraform-linters/tflint/releases/tag/v0.50.3
TFLINT_VERSION: e34bda7f398c139d7bc528261ee96998c10e79c8
OPA_VERSION: 0.64.1
CONFTEST_VERSION: 0.51.0
REGAL_VERSION: 0.21.3
TRIVY_VERSION: 0.51.1
jobs:
validation:
runs-on: ubuntu-22.04
steps:
# プロジェクトのチェックアウト(ジョブ毎に実行必須)
- name: checkout project
# @vXのようなバージョン指定にすると、最新バージョンでセキュリティ的に問題があるアクションを意図せず使用してしまう可能性がある
# よって@vX.Y.Zにすればリスクは軽減するが、それでもバージョンは自由に作り直せるのでより厳密にコミットハッシュを指定
# v4.1.1 ref. https://github.com/actions/checkout/releases/tag/v4.1.1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
# テストコード実行対象モジュールリストを定義する.github/data/test_matrix.yamlとterraform/modulesディレクトリが
# 同期されている状態かチェックするスクリプトを実行
- name: check test_matrix.yaml
run: |
./scripts/check_test_matrix.sh
# opa CLIをインストール
- name: install opa CLI
# v2.2.0 ref. https://github.com/open-policy-agent/setup-opa/releases/tag/v2.2.0
uses: open-policy-agent/setup-opa@34a30e8a924d1b03ce2cf7abe97250bbb1f332b5
with:
version: ${{ env.OPA_VERSION }}
# Regoファイルのフォーマットをチェック
- name: run opa fmt
run: |
./scripts/opafmt.sh
# regal CLIをインストール
- name: install regal CLI
# v1.0.0 ref. https://github.com/StyraInc/setup-regal/releases/tag/v1.0.0
uses: StyraInc/setup-regal@33a142b1189004e0f14bf42b15972c67eecce776
with:
version: ${{ env.REGAL_VERSION }}
# Regoファイルに対してリンタを実行
- name: run regal lint
run: |
./scripts/regal.sh
# 既にインストール済みのConftestがキャッシュに存在する場合restore
- name: cache conftest CLI
id: conftest-cache
# v4.0.2 ref. https://github.com/actions/cache/releases/tag/v4.0.2
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
with:
path: /usr/local/bin/conftest
key: conftest-${{ env.CONFTEST_VERSION }}
# キャッシュにConftestが存在しない場合インストール
- name: install conftest if the cache doesn't exist
if: steps.conftest-cache.outputs.cache-hit != 'true'
run: |
CONFTEST_FILE=conftest_${{ env.CONFTEST_VERSION }}_$(uname)_$(arch).tar.gz
wget "https://github.com/open-policy-agent/conftest/releases/download/v${CONFTEST_VERSION}/${CONFTEST_FILE}"
tar xzf ${CONFTEST_FILE}
sudo mv conftest /usr/local/bin
# Conftestを使用してプロジェクト内の全設定ファイルの定義がポリシーに適合しているかチェック
- name: run conftest
run: |
./scripts/conftest.sh
# 既にインストール済みのTFLintがキャッシュに存在する場合restore
- name: cache tflint CLI
id: tflint-cache
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
with:
path: |
/usr/local/bin/tflint
~/.tflint.d/
key: tflint-${{ env.TFLINT_VERSION }}-${{ hashFiles('terraform/.tflint.hcl') }}
# キャッシュにTFLintが存在しない場合インストール
- name: install tflint if the cache doesn't exist
if: steps.tflint-cache.outputs.cache-hit != 'true'
run: |
# このスクリプトが万が一にもGCPにアクセス出来ないようvalidationとtest-prepでジョブを分けている
curl -s https://raw.githubusercontent.com/terraform-linters/tflint/${{ env.TFLINT_VERSION }}/install_linux.sh | sudo bash
cd terraform && tflint --init
# environmentsやmodules配下のHCLファイルが格納されているディレクトリ全てでtflintコマンドを実行
- name: run tflint
run: |
./scripts/tflint.sh
# 既にインストール済みのTtrivyがキャッシュに存在する場合restore
- name: cache trivy CLI
id: trivy-cache
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
with:
path: |
/usr/local/bin/trivy
key: trivy-${{ env.TRIVY_VERSION }}
# キャッシュにTrivyが存在しない場合インストール
- name: install trivy if the cache doesn't exist
run: |
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v${{ env.TRIVY_VERSION }}
# Trivyによるセキュリティスキャンを実行
- name: run trivy
run: |
./scripts/trivy.sh
# terraform CLIをインストール
- name: install terraform CLI
uses: ./.github/actions/setup
with:
auth_gcloud: "false"
# environmentsやmodules配下のHCLファイルが格納されているディレクトリ全てでterraform fmt -checkコマンドを実行
- name: run terraform fmt
run: |
./scripts/tffmt.sh
# environmentsやmodules配下のHCLファイルが格納されているディレクトリ全てでterraform validateコマンドを実行
- name: run terraform validate
run: |
./scripts/tfvalidate.sh
# test-prep:
# needs: validation
# runs-on: ubuntu-22.04
# # gcloudの認証で使用するWorkload Identity Providerで必要なパーミッション
# permissions:
# id-token: write
# contents: read
# steps:
# - name: checkout project
# uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
# # terraform CLIのインストールおよびgcloudの認証を実行
# - name: setup terraform and gcloud CLI
# uses: ./.github/actions/setup
# with:
# workload_identity_provider: ${{ secrets.TEST_WORKLOAD_IDENTITY_PROVIDER }}
# service_account: ${{ secrets.TEST_SERVICE_ACCOUNT }}
# # テストコードの依存関係解決に使われるtier1ディレクトリのHCLをプロビジョニング
# - name: run apply command to tier1 in test
# run: |
# ./terraform/environments/test/tier1/apply.sh
# env:
# TF_VAR_service: ${{ secrets.TEST_SERVICE }}
# TF_VAR_env: test
# test:
# needs: test-prep
# runs-on: ubuntu-22.04
# permissions:
# id-token: write
# contents: read
# # テストコードはジョブレベルで並列実行
# # 各ジョブで実行されるモジュールのリストはtest_matrix.yamlにて手動で設定している
# # (テスト実行時間をジョブ間で均等に振り分けるため)
# strategy:
# fail-fast: false
# matrix:
# shard: [modules1, modules2]
# steps:
# - name: checkout project
# uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
# - name: setup terraform and gcloud CLI
# uses: ./.github/actions/setup
# with:
# workload_identity_provider: ${{ secrets.TEST_WORKLOAD_IDENTITY_PROVIDER }}
# service_account: ${{ secrets.TEST_SERVICE_ACCOUNT }}
# # 各ジョブが担当するモジュールのテストコードを実行
# - name: run tests
# run: |
# while IFS= read MODULE; do
# ./terraform/modules/$MODULE/test.sh
# done <<< "$(yq -r .${{ matrix.shard }}[] ./.github/data/test_matrix.yaml)"
# env:
# TF_VAR_service: ${{ secrets.TEST_SERVICE }}
# TF_VAR_env: test
# plan:
# needs: test
# runs-on: ubuntu-22.04
# # 'pull-requests: write'はアクションからPRにコメントを書き込む際に必要
# permissions:
# id-token: write
# contents: read
# pull-requests: write
# steps:
# - name: checkout project
# uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
# - name: setup terraform and gcloud CLI
# uses: ./.github/actions/setup
# with:
# workload_identity_provider: ${{ secrets.STG_WORKLOAD_IDENTITY_PROVIDER }}
# service_account: ${{ secrets.STG_SERVICE_ACCOUNT }}
# # staging環境に対してterraform planコマンドを実行して、実行結果サマリをPRコメントに出力
# - name: run terraform plan in stg
# uses: ./.github/actions/tfcmd
# with:
# service: ${{ secrets.STG_SERVICE }}
# env: stg
# command: plan
# gh_token: ${{ secrets.GITHUB_TOKEN }}
# slack:
# if: always()
# runs-on: ubuntu-22.04
# needs: plan
# permissions:
# contents: read
# steps:
# - name: checkout project
# uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
# # ワークフローの実行結果をSlackの指定したチャネルに通知
# - name: send the workflow result to the slack channel
# uses: ./.github/actions/slack
# with:
# conclusion: ${{ needs.plan.result }}
# channel_id: ${{ vars.SLACK_CHANNEL_ID }}
# webhook_url: ${{ secrets.SLACK_WEBHOOK_URL }}