🦙
GitHub Actionsでcfn-lint を使ったCloudFormationテンプレートのテスト
はじめに
CloudFormationテンプレートを作って、AWSコンソールでスタックを作成しようと思ったら構文エラーになってしまうことがありませんか?私はよくあります。。
そんなときに、cfn-lintを使えばテンプレートの間違いを事前に検知することができます。今回はcfn-lintをGitHub Actionsのアクションに導入してみました。
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