VTRyo Blog

一歩ずつ前に進むブログ

よく使うコードはスニペット化しよう

f:id:vtryo:20180715005003j:plain

いちいちコード書くの面倒くさい!

Terraformにかぎらず、よく使うコードはスニペットに登録しておいた方が効率がよい。

今回はTerraformを書いている時に書くのが面倒だったのでやってみた。

tfファイルの記述方法をJSONにする

今回はterraformということで、JSON(HCL)で記述しようとしたときにスニペットが呼び出されるようにしてあげる。

Atomでtfファイルを開いて、言語をJSONに設定する。(→この方法でもできる。「右下のバーで表示形式を変えられる」参照

f:id:vtryo:20180715005109j:plain

以下の画像のように右下のステータスがJSONになったらOK。

f:id:vtryo:20180715005145j:plain

セレクタを調べる

tfファイル内で、command+alt+pを押すことで右上にセレクタが表示される。

スニペット登録にはこれが必要。JSONはsource.jsonらしい。

f:id:vtryo:20180715005219j:plain

.atom/snippet.cson

いよいよ登録。[ATOM]->[スニペット…]をクリックすると、snippet.csonが開かれる。

ここに登録したいスニペットを書いていく。

csonって何ぞ?

CoffeeScript-Object-Notationのこと。要はcoffeeで書いてるという話。

登録方法

terraformでよく使う以下のスニペットを作成してみる。

  • variable
  • aws_instance
  • aws_eip
  • aws_vpc
  • aws_subnet

variable

一行目:さきほど調べたセレクタ

二行目:スニペット説明文

三行目:スニペット展開に使用するキー

四行目:スニペット本体。複数行で記述する場合は「”””」から始めて、「”””」で閉める

'.source.json':
  'variable':
    'prefix':'variable'
    'body': """
        variable "${1:resource_name}" {
          default = "${1:value}"
        }
    """

スニペット内に記述している「${1:}」はスニペット展開時に値を入力する場所となる。

上記の場合、番号をすべて1にしている。全部1にしておけば以下の動画のように一度に編集する場所がわかる。(本来同じ値が入る場所を同時に編集するための方法だと思うけど)

f:id:vtryo:20180715005412g:plain

もちろん番号を変えれば、tabキーで順番に値を編集できるので、2..3..4..と連番で設定してあげても良い。

その他のスニペットも同時に登録する

同時に同じセレクタで登録する場合、セレクタの記述は最初だけでよい。

なので以下の記述になる。

'.source.json':
  'variable':
    'prefix':'variable'
    'body': """
        variable "${1:resource_name}" {
          default = "${1:value}"
        }
    """
  'aws_instance':
    'prefix':'aws_instance'
    'body': """
       resource "aws_instance" "${1:value_instance_name}" {
           ami = "${var.ami}"
           instance_type = "${var.instance_type}"
           disable_api_termination = true
           key_name = "${1:value}"
           vpc_security_group_ids = "${1:value}"
           subnet_id = "${aws_subnet.public-a.id}"
           root_block_device = {
             volume_type = "${1:value}"
             volume_size = "${var.volume_size}"
           }
          tags {
           Name = "${1:value_instance_name}"
         }
       }
    """
  'aws_eip':
    'prefix':'aws_eip'
    'body': """
       resource "aws_eip" "${1:value_eip_name}" {
           instance = "${1:value_instance_id}"
           vpc = true
       }
     """
  'aws_vpc':
    'prefix':'aws_vpc'
    'body':"""
      resource "aws_vpc" "${1:vpc_name}" {
        cidr_block = "${1:10.0.0.0/16}"
        instance_tenancy = "default"
        enable_dns_support = true
        enable_dns_hostname = true
        assign_generated_ipv6_cidr_block = true
        tags {
          Name = "${1:vpc_name}"
        }
      }
    """
  'aws_subnet':
    'prefix':'aws_subnet'
    'body':"""
      resource "aws_subnet" "${1:public-a}" {
        vpc_id = "${aws_vpc.${1:vpc_name}.id}"
        cidr_block = "${1:value}"
        availability_zone = "${1:ap-northeast-1}"
        tags {
          Name = "${1:tag_name}"
        }
      }
      """

まとめ

これでterraformのコード化がさらに効率よくなった。

コピペより速いはず。

参考

https://qiita.com/GotoKazu/items/ce1ad0d2ac51395fe3d0