【AWS】LinterによるCloudFormation構文エラーの自動検出
概要
AWSの環境構築にCloudFormationを使うことも多いと思います。
- CloudFormationテンプレートの構文エラーをソースコードレビューで全部発見できますか?
- 完璧だ!と思ってマネコンからアップロードして、構文エラーになったら辛くないですか?
- エラーにはならないが、不要な定義が残っていたり、変数の型が間違っていたりするテンプレートを綺麗にしたくないですか?
本投稿では、上記を劇的に改善してくれるツールAWS CloudFormation Linter(cfn-python-lint)を紹介します。
記載内容
- Linterが検出する構文エラーの具体例(クイズ)
- Linterの紹介
- Linterが何に基づき構文チェックを行っているか
- コマンドラインで使用した際の構文エラー検出画面イメージ
- VS Codeで使用した際の構文エラーの検出イメージ
- まとめ
- Tips
- CloudFormationテンプレート上のコメントは英語で記載
- 無視しても良い構文エラーの定義方法
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で公開されている3rd Party製の構文チェックツールです。
- AWSのブログでも紹介されています。
cfn-lint を使った AWS CloudFormation テンプレートの Git pre-commit バリデーション | Amazon Web Services ブログ - Python(Python 2.7+ and 3.5+ are supported.)で動ています。
- 多様なIDEにプラグインとして組み込めます。組み込むことで、クイズとして紹介した様な不備は、書いているそばから自動で検出してくれます。紹介した不備以外にも、"パラメータとして定義したが使用されていない変数"等、人の目では気が付きにくい沢山の不備を自動で検出してくれます。
Linterが何に基づき構文チェックを行っているか
AWSが公開しているCloudFormationリソース仕様に基づいてチェックしてくれます。 引用:AWS CloudFormation リソース仕様 - AWS CloudFormation
チェック方法
コマンドプロンプトでの使い方
公式ページに従って、Python,Pip,cfn-lintをインストールしてください。 後は以下のように簡単に使用可能です。
>cfn-lint {ファイルパス}
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
まとめ
- CloudFormationの構文チェックをLinterを使って効率化する方法を紹介しました。強力な構文チェックツールなので、 CloudFormationを使う案件は利用することを強く推奨します。
- Linterで検出される不備の中には、CloudFormationスタック作成時の構文チェックをスルーするものが多数あります(変数の型の誤り等)が、それはAWSがうまく解釈してくれているだけだと私は理解しています。ある日突然構文チェックが厳しくなる可能性も無いとは言えないので、構文はまもりましょう。(バージョンアップに伴って構文の型チェックが厳密になって動かなくなった・・・とか悲惨です。)
- Githubを見ると、terraform用、Python用など、多様なLinterが存在しているので、何かいいものがあったらみんなで共有しましょう。