AtomでCloudFormationのテンプレート作成

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CloudFormationのテンプレートを書く時はAWS Toolkit for Eclipseを使うとJSONのシンタックスチェックやリソース(AWS::EC2::Instanceなど)の入力補完が効いて、とても便利です。

AWS CloudFormation Template Editor for Eclipse を使用する - AWS Toolkit for Eclipse

しかし、CloudFormationのテンプレートと言ってもその実はJSONファイル。JSONなら、普段使いのエディタでテンプレートを書きたい(書いている)という方もそれなりの数いらっしゃるかと思います。(私もそんな中の一人です。)

普段使いのエディタは皆さんそれぞれかと思いますが、私の場合はAtomがそれにあたります。(先日初の安定版となる1.0がリリースされました。)

ということで、手元のMacで、AtomでCloudFormationのテンプレートを書く環境をそれなりに整えてみましたので、今回はその手順をご紹介します。

シンタックスハイライト

AtomはデフォルトでJSONのシンタックスハイライトに対応しているので、特にやることはありません。

atom/language-json

シンタックスチェック

これなしでテンプレートを書ける気がしません。

Atomでシンタックスチェックといえばlinterがデファクトスタンダードです。このlinter自身はFrameworkを提供しているだけなので、シンタックスチェックの機能そのものは持っていません。JSON用にlinter-jsonlintも合わせてインストールします。

$apm install linter linter-jsonlint

シンタックスチェックはリアルタイムで実行可能で、以下のようにツールチップでエラーの内容を表示してくれます。

template.json - :Users:yawata.yutaka:Dropbox:Repos:lambda-gulp-sample - Atom 2015-06-29 02-12-06

入力補完(スニペット)

残念ながらCloudFormationのスニペットを提供してくれるAtomプラグインは存在しないようです。一からスニペットを自分で作ろとも思いましたが、CloudFormationが対応しているリソースの数を見て早々と心が折れました。。

さてどうしたものか。調べてみると、Sublime TextにはcformというCloudFormationのプラグインが存在することがわかったので、これを拝借し、Atom用のスニペットにフォーマットを変換して使うことにしました。

フォーマットの変換にはsublime-to-atom-snippetsを使います。

Atom用スニペットファイルの生成

sublime-to-atom-snippetsの使い方は簡単で、

  1. sourceディレクトリとoutputディレクトリを作成
  2. sourceディレクトリの下に任意の名前でディレクトリを作成し、そこにSublime Textのスニペットファイルを格納
  3. node indexコマンドを実行
  4. outputディレクトリ下に2.で作成したのと同名のディレクトリが作成され、その下に変換後のスニペットファイルが生成される

といった流れです。

# githubからcformとsublime-to-atom-snippetsをクローン
$ git clone https://github.com/beaknit/cform.git
$ git clone https://github.com/james2doyle/sublime-to-atom-snippets.git

# source/cformディレクトリを作成(outputディレクトリはsublime-to-atom-snippetsに含まれている)
$ mkdir sublime-to-atom-snippets/source/cform

# スニペットファイル一式を作成したsource/cform下にコピー
$ cp cform/*snippet sublime-to-atom-snippets/source/cform

# node indexを実行(実行前にnpm installで依存パッケージをインストール)
$ cd sublime-to-atom-snippets
$ npm install
$ node index

これでsublime-to-atom-snippets/output/cform下にAtom用に変換されたスニペットファイルが生成されます。

スニペットファイルのAtomへの適用方法

cformのスニペットファイルはAWSのリソース毎にファイルが分かれています。(変換後のAtom用スニペットファイルも同様の構成です。)

Atomには独自のスニペットを登録するための仕組みがありますが、~/.atom/snippets.csonという単一のファイルにスニペット定義を書く仕組みとなっており、複数のスニペットファイルのインクルードのような機能は持っていません。

ので、今回はCloudFromation用のオレオレAtomパッケージを新規で作成して、そのパッケージ内でスニペットを定義することにしました(パッケージにしておけば、複数のスニペットファイルを自動的にインクルードさせることができます。)

Atomパッケージの作成

Atomのメニューから「Package」-「Package Generator」-「Generate Atom Package」を選択するとパッケージのひな形が自動生成されます。

デフォルトでは、~/github下にパッケージ用のディレクトリが作成され、そのシンボリックリンクが~/.atom/packages下に作成されます。

パッケージのファイル・ディレクトリ構成は以下のようになります。(atom-cformが今回作成したオレオレパッケージの名称です。)

└── atom-cform
    ├── CHANGELOG.md
    ├── LICENSE.md
    ├── README.md
    ├── keymaps
    ├── lib
    ├── menus
    ├── package.json
    ├── spec
    └── styles

今回使いたいのではスニペットなので、atom-cform下にsnippetsディレクトリを作成し、そこにAtom用に変換したスニペットファイルをコピーします。

$ cd ~/.atom/packages/atom-cform
$ mkdir snippets
$ cp cp <sublime-to-atom-snippetsディレクトリ>/output/cform/* ~/.atom/packages/atom-cform/snippets

スニペットの"スコープ"の変換

Atom用に変換したスニペットファイルを開いてみると、冒頭に'.source.cloudformation':という記述が見つかります。これはこのスニペットが有効になるスコープの定義で、cloudformation(とうい言語)のファイルの編集時にこのスニペットが有効になるという意味合いです。

Javaであれば、'.source.java':、Javascritpであれば'.source.js':と書きます。

変換元のcformではCloudFormationが1つの言語として定義されているためスニペットファイルにも上記のような記述がされているのですが、今回は言語の定義は追加せず、スコープがJSONの時にスニペットが有効になるよに'.source.cloudformation':'.source.json':に置換します。

この置換作業は今回生成した全てのスニペットファイルが対象となります。(Atomでsnippetsディレクトリを開いて、「Find in Project」から一括変換しましょう。」)

置換が完了したら、設定を反映させるためAtomを再起動します。

動作確認

再起動後、JSONファイルを新規作成しスニペットが有効担っていることを確認します。例えばec2と入力してTABキーを押すと、"AWS::EC2::Instance"定義のひな形が展開されます。

"-": {
  "Type": "AWS::EC2::Instance",
  "Properties": {
    "KeyName": -,
    "DisableApiTermination": "-",
    "ImageId": { - },
    "InstanceType": "-",
    "Monitoring": "true|false",
    "SecurityGroupIds" : [-],
    "Tags": [
      {
        "Key": "-",
        "Value": "-"
      }
    ],
    "UserData": {
      "Fn::Base64": {
        "Fn::Join": [
          "",
          [
            "#!/bin/bash -ex",
            "-"
          ]
        ]
      }
    }
  }
}

autocomplete-snippetsが有効になっていれば、補完候補が自動的に表示されます。

atom-autocomplete-snippets

注意事項

変換元のcformですが、ここ最近のCloudFormationのアップデートにはまだ対応していません。必要に応じて自力でスニペットを登録しましょう。

まとめ

やや強引な方法ではありますが、AtomでCloudFormatioのテンプレートを快適に(?)書くことが出来る環境が整いました。

オレオレパッケージというのはとても中途半端な状態ですし、できればテンプレートのバリデーションもAtomで実行したいところです。今回作成したパッケージを発展させ、Atomのパッケージレジストリにパブリッシュすることを妄想しています。(あくまでも妄想です。)

参考