【AWS】LinterによるCloudFormation構文エラーの自動検出

概要

AWSの環境構築にCloudFormationを使うことも多いと思います。

  • CloudFormationテンプレートの構文エラーをソースコードレビューで全部発見できますか?
  • 完璧だ!と思ってマネコンからアップロードして、構文エラーになったら辛くないですか?
  • エラーにはならないが、不要な定義が残っていたり、変数の型が間違っていたりするテンプレートを綺麗にしたくないですか?

本投稿では、上記を劇的に改善してくれるツールAWS CloudFormation Linter(cfn-python-lint)を紹介します。

記載内容

CloudFormation構文クイズ

Linterが検出する構文エラーの具体例をご理解いただくために、クイズを作りました。 各ボックスの中には、好ましくない記載箇所があります。探してみてください。

問題1:

ALB:
  Type: AWS::ElasticLoadBalancingV2::LoadBalancer
  Properties:
    IpAddressType: ipv4
    LoadBalancerAttributes:
      - Key: sample_key
        Value: true
                    ~~~~~~略~~~~~~

問題2:

 BackupSelection:
    DependsOn: BackupPlan
    Type: AWS::Backup::BackupSelection
    Properties:
                    ~~~~~~略~~~~~~
      BackupPlanId: !Ref BackupPlan
                    ~~~~~~略~~~~~~

問題3:

SnsTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Version: '2008-10-17’
                    ~~~~~~略~~~~~~

CloudFormation構文クイズ解答

問題1:LoadBalancerAttributesのValueはString型ですが、BooleanのTrueが設定されている。

問題2:DependsOnは不要。"!Ref BackupPlan"により、暗黙的にBackupPlanが先行して作成される。

問題3:IAM Policyのバージョンが古い。最新は2012-10-17。

cfn-python-lintのご紹介

github.com

Linterが何に基づき構文チェックを行っているか

AWSが公開しているCloudFormationリソース仕様に基づいてチェックしてくれます。 f:id:VbuiV:20220308232544p:plain 引用:AWS CloudFormation リソース仕様 - AWS CloudFormation

チェック方法

コマンドプロンプトでの使い方

公式ページに従って、Python,Pip,cfn-lintをインストールしてください。 後は以下のように簡単に使用可能です。

 >cfn-lint {ファイルパス}

f:id:VbuiV:20220308232820p:plain

Visual Studio Codeでの使い方

先にコマンドプロンプトで使える状態にした上で、yml用、cfn-python-lint用、CloudFormation用のExtensionsをインストールしてください。

Name: YAML
Id: redhat.vscode-yaml
Description: YAML Language Support by Red Hat, with built-in Kubernetes syntax support
Version: 1.4.0
Publisher: Red Hat
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml
Name: CloudFormation
Id: aws-scripting-guy.cform
Description: VS Code Plugin for CloudFormation
Version: 0.0.24
Publisher: aws-scripting-guy
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=aws-scripting-guy.cform
Name: CloudFormation Linter
Id: kddejong.vscode-cfn-lint
Description: AWS CloudFormation template Linter
Version: 0.21.0
Publisher: kddejong
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=kddejong.vscode-cfn-lint

f:id:VbuiV:20220309092413p:plain

まとめ

  • CloudFormationの構文チェックをLinterを使って効率化する方法を紹介しました。強力な構文チェックツールなので、 CloudFormationを使う案件は利用することを強く推奨します。
  • Linterで検出される不備の中には、CloudFormationスタック作成時の構文チェックをスルーするものが多数あります(変数の型の誤り等)が、それはAWSがうまく解釈してくれているだけだと私は理解しています。ある日突然構文チェックが厳しくなる可能性も無いとは言えないので、構文はまもりましょう。(バージョンアップに伴って構文の型チェックが厳密になって動かなくなった・・・とか悲惨です。)
  • Githubを見ると、terraform用、Python用など、多様なLinterが存在しているので、何かいいものがあったらみんなで共有しましょう。

Tips

  • cfn-python-lintは全角文字があると動きません。使う場合はコメントはすべて英語で記載する必要があります。 f:id:VbuiV:20220308233201p:plain

  • 無視したいチェック項目は無視できます。