🦙

GitHub Actionsでcfn-lint を使ったCloudFormationテンプレートのテスト

2024/10/23に公開

はじめに

CloudFormationテンプレートを作って、AWSコンソールでスタックを作成しようと思ったら構文エラーになってしまうことがありませんか?私はよくあります。。

そんなときに、cfn-lintを使えばテンプレートの間違いを事前に検知することができます。今回はcfn-lintをGitHub Actionsのアクションに導入してみました。
https://aws.amazon.com/jp/blogs/news/git-pre-commit-validation-of-aws-cloudformation-templates-with-cfn-lint/

GitHub Actionsの作成

.github/workflows/cfn-linter.yml
name: cfn-linter

on:
  - push

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.12' 

      - name: Install cfn-lint
        shell: bash
        run: pip3 install cfn-lint
      
      - name: cfn-lint
        shell: bash
        run: |
          cfn-lint template/test.yml

今回はgit PushでActionsが動作するようにしました。
cfn-lintはPython環境で動くので、Pythonのセットアップを行い、pip3でcfn-lintをインストールしています。cfn-lintで読み込む対象のCFnテンプレートを指定しています。

CloudFormationテンプレートの作成

今回はこちらのAmazon Web Services ブログを参考にさせていただき、CFnテンプレートを作成しました。

template/test.yml
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Bad SubnetRouteTableAssociation'

Parameters:
  PublicRouteTable:
    Type: String

  PrivateRouteTable:
    Type: String

  PublicSubnet01:
    Type: String

  PrivateSubnet01:
    Type: String

Resources:
  PublicSubnetRouteTableAssociation1:
      Type: AWS::EC2::SubnetRouteTableAssociation
      Properties:
        RouteTableId: {Ref: PublicRouteTable}
        SubnetId: {Ref: PublicSubnet01}

  PrivateSubnetRouteTableAssociation1:
      Type: AWS::EC2::SubnetRouteTableAssociation
      Properties:
        RouteTableId: {Ref: PrivateRouteTable}
        SubnetId: {Ref: PublicSubnet01}

このCFnテンプレートをgit pushしてみると、無事Action内でエラーが発生しました。

W2001 Parameter PrivateSubnet01 not used.
template/test.yml:14:3

E3022 SubnetId in PublicSubnetRouteTableAssociation1 is also associated with PrivateSubnetRouteTableAssociation1
template/test.yml:23:9

E3022 SubnetId in PrivateSubnetRouteTableAssociation1 is also associated with PublicSubnetRouteTableAssociation1
template/test.yml:29:9

おわりに

GitHub Actionsにcfn-linterを組み込んでおくと、手戻りが減って開発効率が向上しそうです。pre-commitに入れておくのがベターだとは思いますが、、

Discussion