diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml new file mode 100644 index 0000000..71d6598 --- /dev/null +++ b/.github/workflows/validate.yml @@ -0,0 +1,51 @@ +# push / PR のたびに IaC の静的チェックと構成図生成を検証するワークフロー。 +# +# 安全対策: +# - AWS credentials は一切使わない (GitHub Secrets にも設定しない) +# - 実行するのは validate / lint / 図生成のみで、AWS へは接続しない +name: validate + +on: + push: + branches: [main] + pull_request: + +# リポジトリの読み取りだけできれば十分 +permissions: + contents: read + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + # このジョブは認証済み Git 操作をしないため GITHUB_TOKEN を保持しない + persist-credentials: false + + # mise.toml に固定したツール (terraform / tflint / checkov / cfn-lint / cfn-dia) を導入 + - uses: jdx/mise-action@v2 + + # SAM CLI (mise 管理外なので公式 action で導入) + - uses: aws-actions/setup-sam@v2 + with: + use-installer: true + + # 構成図生成用の Graphviz + - name: Install Graphviz + run: sudo apt-get update -qq && sudo apt-get install -y -qq graphviz + + # InfraMap はバイナリ配布が無いため Go でソースからインストールする + # (macOS ローカルでは brew install inframap でよい) + - uses: actions/setup-go@v5 + with: + go-version: stable + cache: false + - name: Install InfraMap + run: | + go install github.com/cycloidio/inframap@v0.8.1 + echo "$HOME/go/bin" >> "$GITHUB_PATH" + + # ローカルの学習サイクルと同じ一括チェックを実行する + - name: Run make check + run: make check diff --git a/Makefile b/Makefile index 3e2dad2..bf18961 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,10 @@ lint-cfn: ## CloudFormation / SAM の lint $(RUN) cfn-lint $(SAM_DIR)/template.yaml lint-checkov: ## IaC のセキュリティ静的解析 (Terraform + SAM) - $(RUN) checkov --directory $(TERRAFORM_DIR) --directory $(SAM_DIR) --quiet --compact + @# --directory を複数同時に渡すと SAM 側が CloudFormation として + @# スキャンされないことがあるため、ディレクトリごとに実行する + $(RUN) checkov --directory $(TERRAFORM_DIR) --quiet --compact + $(RUN) checkov --directory $(SAM_DIR) --quiet --compact diagram: diagram-terraform diagram-sam ## Terraform と SAM の構成図を生成する diff --git a/mise.toml b/mise.toml index e89befd..c4c578f 100644 --- a/mise.toml +++ b/mise.toml @@ -1,6 +1,12 @@ +# プロジェクトで使うツールとバージョンの固定 (mise install で一括導入)。 +# CI (GitHub Actions) でも同じ定義を使うため、"latest" ではなく明示的に固定する [tools] -"pipx:checkov" = "latest" -terraform = "latest" -tflint = "latest" -"pipx:cfn-lint" = "latest" -"npm:@mhlabs/cfn-diagram" = "latest" +terraform = "1.15.8" +tflint = "0.64.0" +"pipx:checkov" = "3.3.9" +"pipx:cfn-lint" = "1.54.0" +# fast-xml-parser@4.5.7 は provenance 無しのため mise の trust policy に検出されるが、 +# npm tarball と GitHub の v4.5.7 タグのソース一致・公開者が 4.x 系従来のメンテナ本人 +# であることを確認済み (5.x のみ trusted publishing を使う運用のため)。この 1 バージョン +# だけを検証済みとして除外する +"npm:@mhlabs/cfn-diagram" = { version = "1.1.40", trust_policy_excludes = ["fast-xml-parser@4.5.7"] } diff --git a/sam/template.yaml b/sam/template.yaml index b53a16c..e93a9c9 100644 --- a/sam/template.yaml +++ b/sam/template.yaml @@ -27,6 +27,17 @@ Resources: # AWS がランタイムを管理してくれる標準的な形。まずはこちらが基本 HelloFunction: Type: AWS::Serverless::Function + Metadata: + # checkov が指摘する下記 3 点は本来設計すべき項目だが、学習用プレースホルダの + # ため理由を明記した上でスキップする。本実装では各項目を設計判断すること + checkov: + skip: + - id: CKV_AWS_115 # 同時実行数制限: 暴走や下流サービス保護のための上限設定 + comment: "learning placeholder" + - id: CKV_AWS_116 # DLQ: 失敗イベントを退避して調査・再処理できるようにする + comment: "learning placeholder" + - id: CKV_AWS_117 # VPC 配置: プライベートリソースへ安全にアクセスするため + comment: "learning placeholder" Properties: CodeUri: src/hello/ # コードの場所 (ディレクトリ) Handler: app.lambda_handler # <ファイル名>.<関数名> @@ -40,6 +51,15 @@ Resources: Metadata: # sam build に「cargo-lambda でビルドする」ことを伝える設定 BuildMethod: rust-cargolambda + # HelloFunction と同じ理由で学習用プレースホルダとしてスキップ + checkov: + skip: + - id: CKV_AWS_115 + comment: "learning placeholder" + - id: CKV_AWS_116 + comment: "learning placeholder" + - id: CKV_AWS_117 + comment: "learning placeholder" Properties: CodeUri: src/hello-rust/ # Cargo.toml があるディレクトリ Handler: bootstrap # カスタムランタイムでは固定値 (バイナリ名)