アジェンダ
いちいちコード書くの面倒くさい!
Terraformにかぎらず、よく使うコードはスニペットに登録しておいた方が効率がよい。
今回はTerraformを書いている時に書くのが面倒だったのでやってみた。
tfファイルの記述方法をJSONにする
今回はterraformということで、JSON(HCL)で記述しようとしたときにスニペットが呼び出されるようにしてあげる。
Atomでtfファイルを開いて、言語をJSONに設定する。(→この方法でもできる。「右下のバーで表示形式を変えられる」参照)
以下の画像のように右下のステータスがJSONになったらOK。
セレクタを調べる
tfファイル内で、command+alt+pを押すことで右上にセレクタが表示される。
スニペット登録にはこれが必要。JSONはsource.jsonらしい。
.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にしておけば以下の動画のように一度に編集する場所がわかる。(本来同じ値が入る場所を同時に編集するための方法だと思うけど)
もちろん番号を変えれば、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のコード化がさらに効率よくなった。
コピペより速いはず。