CloudFormationテンプレートの確認: cfn-lintを利用した効果的なチェック方法

はじめに

CloudFormationでテンプレートを書くとき、実際にAWS環境で実行しようとしたときにTypoとかで失敗するとがっくりします。こんなことを防ぐために、実際にAWS環境で実行する前になんらかの検証したいことがよくあります。その方法としてLocalStackの活用があると考えています。具体的な実装方法は以下を参照してください。

miyohide.hatenablog.com

ただ、ちょっと大袈裟すぎる感じもするので何かいい方法がないかなと思っていたらAWS CloudFormation Linterというものを知ったので紹介します。

github.com

使い方

Python 3.8以上の環境で動きます。その後は、pip install cfn-lintを実行してインストール。その後はcfn-lintコマンドを実行すればOKです。

例えば、hoge.ymlというファイルがカレントディレクトリにあった場合は、以下のように実行します。

cfn-lint hoge.yml

複数のファイルをチェックしたい場合は、以下のように実行します。

cfn-lint *.yml

例えば以下のテンプレートを用意して実行してみました。

AWSTemplateFormatVersion: 2010-09-09
Description: Create Cloud9

Parameters:
  ProjectName:
    Type: String
  PublicSubnet1:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Subnet::Id>
    Description: Enter AWS SSM Parameter Store Key

Resources:
  Cloud9:
    Type: AWS::Cloud9::EnvironmentEC2
    Properties:
      AutomaticStopTimeMinutes: 30
      ConnectionType: CONNECT_SSM
      Description: My Cloud9
      ImageId: amazonlinux-2023-x86_64
      InstanceType: t3.small
      Name: !Sub ${ProjectName}-Cloud9
      SubnetId: !Ref PublicSubnet1

実行結果として以下のものが得られました。

E1152 'amazonlinux-2023-x86_64' is not a 'AWS::EC2::Image.Id'
sample3.yml:18:7

ただ、上記のテンプレートはCloudFormation上では正常に動きますし、AWSのドキュメントでもエイリアスとして認められているのでちょっとあれ?って感じです。

docs.aws.amazon.com

考察

お手軽にCloudFormationのテンプレートをチェックできるLinter、cfn-lintを紹介しました。インストールがちょっとばかし面倒で、公式のDockerイメージが配布されていないので、ちょっとハードルは高いかもしれません。

ただ、目でチェックするよりかは確実にチェックできて、導入する価値はあるかなと思います。