【Windows11/VSCode/cfn-lint】CloudFormationテンプレートのエディタ環境を整える

記事タイトルとURLをコピーする

こんにちは、クラウドインテグレーション2部 技術1課 宮形 です。

先日私の業務PCを入替した際、CloudFormationテンプレート(以下CFn)のエディタ環境を再セットアップしました。

私は Microsoft Visual Studio Code (以下VSCodeと記載) をCFn用エディタとして利用していますが、サーバーワークス先輩方のアドバイスをもとに cfn-lint の拡張機能をアドオンして構文ミス・スペルミスを早い段階で気が付けるようしています。

この便利な cfn-lint ですが、Windows パソコンで利用する場合のセットアップ手順が一癖あります。まだ利用者がそれほど多くないと予想する Windows 11 でセットアップする手順を本BLOGでご紹介させていただきます。

参考資料

AWSの公式ブログで cfn-lint の利用開始手順が紹介されていますので、基本はこちらを参照します。

cfn-lint を使った AWS CloudFormation テンプレートの Git pre-commit バリデーション | Amazon Web Services ブログ

cfn-lint は Pythonランタイムがローカル環境に導入されていることが前提のため、経験の無いかたは戸惑われるかもしれません。 また、日本語版 Windows では後述する文字コード問題があるので、上手く動作せずハマる方も多いと思われます。

私が cfn-lint を導入するにあたり、多くの有志一般サイトを参照してトラブルシュートさせていただきました。著者方々へはこの場で感謝の意を伝えさせていただきます。

セットアップ手順

私の業務PCの環境説明

本BLOGを記載している、2022年4月28日時点での私のPC環境です。

  • OS: Windows 11 Pro 64bit x64 バージョン 21H2
  • VSCode: Visual Studio バージョン 1.66.2 (user setup)

VSCode のインストール

最初に VSCode のインストールを行います。Microsoftのサイトからインストーラーをダウンロードしてインストールします。私はすべてデフォルト設定としました。本BLOGでは説明は割愛し、経過の画面ショットだけ貼り付けとさせていただきます。

Visual Studio Code – コード エディター | Microsoft Azure

初回の起動で、日本語言語パックのインストールが促されます。「インストールして再起動」をクリックします。

拡張機能 cfn-lint インストール

VSCode の左メニューバーより「拡張機能」をクリックします。検索窓に「cfn-lint」と入力すると、CloudFormation Linter が表示されるので「インストール」をクリックします。

しばらくすると、拡張機能 cfn-lint がインストールされます。ただし、これだけではcfn-lin は利用できません!

Python ランタイムのインストール

cfn-lint は Python ランタイムが前提となっています。Windows版の Python ランタイムをダウンロードしてインストールします。

Download Python | Python.org

Pythonランタイムのインストール最初の画面で「Add Python 3.xx to PATH」のチェックをオンとします。「Install Now」をクリックします。

pipより linter のインストール

Windowsコマンドプロンプトを起動し、下記コマンドを実行します。Python 環境に cfn-lint が追加されます。

pip3 install cfn-lint

whereコマンドで cfn-lint のパスを確認します。出力される結果をコピーして控えておきます。

where.exe cfn-lint

VSCode の設定

再び、VSCode の左メニューバーより「拡張機能」をクリックします。一覧の CloudFormation Linter より歯車アイコンをクリックし、サブメニューより「拡張機能の設定」をクリックします。

CloudFormation Linster の設定画面が表示されます。「Cfn Lint: Path」の箇所に、先ほど "where.exe cfn-lint" で確認した、cfn-lint のパスを貼り付け記載します。

続けて、VSCode の「制限モード」をオフにします。画面左下に「制限モード」の表示となっている場合、オフにする必要があります。

左メニューバーの下段歯車アイコンより「設定」をクリックします。

設定の画面が表示されます。「セキュリティ」-「ワークスペース」を展開します。一覧より「Trust: Enabled」をみつけて、チェックをオフとします。

画面左下の「制限モード」が表示されなくなったことを確認します。

cfn-lint を使ってみる

ここまで進めると、VSCode で cfn-lint が利用可能です。意図的に誤った構文の CloudFormationテンプレートを記載してみます。下記の例では、"DeletionPolicy" のスペルミスをしています。

VSCode問題パネルに、構文・スペルミスをしている箇所が通知されます。cfn-lint が動作していることが確認できました。

日本語版 Windows でうまく動作しない場合

下記のような警告が出て、cfn-lint が正しく動作しない場合があります。

[cfn-lint] 2022-04-28 15:19:04,108 - cfnlint.decode - ERROR - Cannot read file contents: (CFnファイル名)

2024/2/2 追記:再度同じセットアップを Python3.12 で行ったところ日本語マルチバイトを含むテンプレートでも正しく動作するようになっていました。エラーにならない方は以降はスキップしても大丈夫です。古いバージョンのままお使いの方は、Pythonランタイムの更新と pip3 install cfn-lint を再度実施してみてください。

この場合、CFnテンプレート内に日本語マルチバイト文字が含まれていないか確認します。下記例では日本語注釈が入っています。

これは Windows版 Python の問題のようで、CP932(Shift-JIS) エンコード以外のファイルを Python がOpenする際に起こっているようです。

私が調べた限り、下記3つの対応方法があるようです。

  1. CFnテンプレート内に日本語マルチバイト文字を記載しない。日本語注釈を入れたい場合は、コーディングを終えた最後に記載する。
  2. Windows の「ワールドワイド言語サポート Unicode UTF-8を使用」を有効化する。
  3. WSL環境を構築し、Python Linux版をインストール。WSLからVSCode を実行する。

私は 1. の対応を行っていますが、おすすめは 3. の方法だと思います。WSLからVSCodeを実行する方法は、Microsoft下記資料を参照ください。

WSL で VS Code の使用を開始する | Microsoft Learn

WSLについては、弊社同僚がBLOGで紹介しておりますので紹介いたします。

blog.serverworks.co.jp

2.の対応は一見よさそうですが、本BLOG執筆時点では Windowsの「ベータ機能」となっていました。 また、この設定により一部ソフトウェアが文字化けしてしまうことを確認しています。下記は定番ターミナルソフト TeraTerm が文字化けしている状況です。 どなたにでもお勧めできる方法とは言えないと思います。

まとめ

先輩に紹介されて何となく利用しはじめた cfn-lint ですが、作業効率が格段によくなり今では手放せないツールとなりました。 CFnをAWSマネージメントコンソールから実行 → 構文エラートラブルシュートの反復行為は、経験するとわかりますが、多くの時間を要してしまいモチベーション的にも辛いです。 この無駄な行為を大幅カットできるのは、とても大きな業務効率改善です。

他にもVSCodeをCFn用エディタとして利用するための役立つ拡張機能は多々あるようですので、機会があればご紹介できればと考えます。

宮形純平(執筆記事の一覧)

エンタープライズクラウド部 ソリューションアーキテクト1課

好きなお酒は缶チューハイと本格焼酎