シェルスクリプトで再実行するための関数
retry() { command="$@" local try_count=0 local retry_limit=3 local wait_seconds=300 until sh -c "$command"; do [ $try_count -eq $retry_limit ] && return 1 sleep $wait_seconds try_count=$(expr $try_count \+ 1) done } # example retry ls -ltra hoge
北海道旅行に行ってきた
8/10~13 の3泊で北海道に行ってきました。
1日目(8/10)
直前に飛行機を取ろうとしましたが、羽田発の便は全滅だったので茨城空港から出発。東京駅から500円のバス便があるのでそれを利用しました。茨城空港はガルパン推しがヤバかったです。
12時前に新千歳に着いてそのまま電車で小樽へ。澤崎水産で特選ちらし丼を注文、ウニがとろけました。
その後は近くの店で生とうもろこしを食べ(これがものすごく甘かった..!)、小樽運河クルージングして札幌に戻りこの日は終了。
2日目(8/11)
朝から旭川に車を走らせ昼前に旭山動物園に到着。この日は北海道にしては結構暑く、いろいろな動物を見ましたが、ほぼすべての動物が日陰で寝てましたw そんな中でテナガザルの機敏な動きはかなり感心させられるもので、観客も集まってました。
その後あさひかわラーメン村にて利尻昆布とホタテを使ったラーメンを食べ、滝川市へ。
滝川市でローカルの花火大会に参加。the 地元の花火大会という感じで規模的には小さなものでしたが、打ち上げ場所のすぐ近くで見れたので迫力はすごかったです。
3日目(8/12)
旭川から出発し、美瑛の青い池に。いい青でした。
その後四季彩の丘と富良野のファーム富田、六花亭カンパーナに寄り自然を満喫。富良野のホテルへ。
夜は何もすることが無いかなと思ってたのですが、地元のお祭的なものが駅前で開催されてて小学校低学年くらいのちびっ子たちのライブを楽しめました、演奏めちゃ上手かった。
4日目(8/13)
朝に出て昼前に札幌へ戻り、回転寿しのトリトンへ。この日のオススメのボタンエビが濃厚で美味でした...!
その後、北海道大学でクラーク博士に会ったり雪印パーラーで(ジャンボじゃない)パフェを食べたりして、新千歳空港へ戻り東京へ帰りました。
まとめ
北海道はとにかく広くて隣の観光地に行くのにも車で50kmとか走らないといけないので大変でした(3日間の運転距離約500km)。が今まで経験したことのない自然だったり食べ物だったりを経験できて良かったです。北海道はデッカイドウでした...!
Terraformをバージョン管理できるtfenvを作った
名前を見てもお分かりのようにrbenvと同じような感じのterraformのバージョン管理ツールです*1。複数プロジェクトをterraformで管理しててそれぞれのバージョンが分かれてる場合を想定して作ってます。
ぜひぜひ、使ってみてください!
基本的な使い方(v0.3.x 系)
詳しい使い方は READMEを見て下さいということで
Install/Uninstall
GitHubから任意のパスにcloneしてtfenv/bin
にパスを通すだけ。
アンインストールはそのパスを消すだけです。
tfenv install
指定したバージョンをインストールしますlatest
で最新版をインストールします。
$ tfenv install 0.7.0
$ tfenv install latest # latest version
tfenv use
利用するバージョンを切り替えます。
$ tfenv use 0.7.0
tfenv list
現在インストールしているバージョンを列挙します。
% tfenv list 0.7.0 0.7.0-rc4 0.6.16 0.6.2 0.6.1
tfenv list-remote
インストール可能なバージョンをリモートから取得して列挙します。
% tfenv list-remote 0.7.0 0.7.0-rc4 0.7.0-rc3 0.7.0-rc2 0.7.0-rc1 0.6.16 0.6.15 ...
.terraform-version
rbenvの.ruby-version
と同じような機能で、プロジェクトルートに.terraform-version
というファイルを置いておくとそのファイルに書かれたバージョンを優先して利用します。また、引数なしのtfenv install
でそのバージョンをインストール出来るようになります。
Terraform 0.7.0での変更点
とりあえず、ここ に書いてあることのざっくりメモ
- 各providerのバイナリファイル(
terraform-*
)が不要になったので、消す - planで結果がmapだった場合
foo#
ではなくfoo%
になった concat()
はstringでは動かなくなった、listのみ, stringの結合は${var}-foo
みたいなシンタックスを使うこと- interpolations内で
"
をエスケープしなくて良い(したらエラーになる) - デフォルトでplanがstateファイルを更新しなくなった
- in memoryでの更新のみ、実際の更新はrefreshでやる
- これらはresourceじゃなくてdata sourceにすることを推奨
- atlas_artifact
- template_file
- template_cloudinit_config
- tls_cert_request
- list, mapが第一級オブジェクトになった
- output, moduleにstringに変換しなくても直接渡せる
${list[index]}
的な書き方が出来る- が、
element()
関数と同じようなモジュラーな挙動はしない(エラーになる)
- が、
- mapの値の上書き方法が変わった
map_name.key = value
->map_name = {key = value}
Terraformのcountでvariable以外のinterpolationを使えない
version
Terraform 0.6.16
本文
ドキュメント にも書いてあったのですが、Terraformで複数リソースを一気に定義するときに count
という項目を使うのですが、ここでは直接数字を入力するか、 variables
で定義した値に対するinterpolationしか使えないようです。
例えばこんな感じで、AWSのsubnetごとに1つEC2インスタンスを作るようなtfファイルを書いた場合
resource "aws_subnet" "foo" { count = 2 cidr_block = "${format("10.1.%d.0/24", count.index)}" vpc_id = "aaa" } resource "aws_instance" "var" { count = "${length(aws_subnet.foo.*.id)}" ami = "bbb" instance_type = "ccc" subnet_id = "${element(aws_subnet.foo.*.id, count.index)}" }
terraform plan
を実行するとエラーになります。
Error configuring: 1 error(s) occurred: * strconv.ParseInt: parsing "${length(aws_subnet.foo.*.id)}": invalid syntax
上記の場合は単純に2をaws_instanceの方のcountに入れてあげれ良いのですが、ちと難しいのが別の tfstate
から値を取ってくるような場合。
resource "terraform_remote_state" "foo" { backend = "s3" config { bucket = "kamatama41-tfstate" key = "example.tfstate" } } resource "aws_instance" "var" { count = "${length(split(",", terraform_remote_state.foo.output.subnet_ids))}" ami = "bbb" instance_type = "ccc" subnet_id = "${element(split(",", terraform_remote_state.foo.output.subnet_ids), count.index)}" }
この場合countを計算することが出来ないし、以下のように単なる数字の2をoutputとして定義してもダメなので、現状完全にお手上げ状態です。。
resource "terraform_remote_state" "foo" { backend = "s3" config { bucket = "kamatama41-tfstate" key = "example.tfstate" } } resource "aws_instance" "var" { count = "${terraform_remote_state.foo.output.subnet_cidrs_count}" ami = "bbb" instance_type = "ccc" subnet_id = "${element(split(",", terraform_remote_state.foo.output.subnet_cidrs_count), count.index)}" }
誰か解決策があったら教えて下さい!
Terraformの関連issue
GitHubのissueを擬似的に消すためのRubyスクリプト
GitHubのissueは削除することが出来ないので、タイトルと本文とコメントを全部消すことで、擬似的になかったことにします。 (これでもタイトルの変更履歴は残るので、完全に消すことは出来ないわけですが...)
require 'octokit' require 'highline/import' Octokit.auto_paginate = true client = Octokit::Client.new(:access_token => ENV['GITHUB_TOKEN']) repo = '<repository name>' # e.g. kamatama41/test title = '<issue title>' issue = client.issues(repo, state: :closed).find do |i| i.title.include? title end unless issue puts 'Issue is not found.' exit end confirm = ask("Remove the issue '##{issue.number} #{issue.title}'? [Y/N] ") { |yn| yn.limit = 1, yn.validate = /[yn]/i } unless confirm.downcase == 'y' exit end client.update_issue(repo, issue.number, '(deleted)', '') # Rename issue title and body client.issue_comments(repo, issue.number).each do |comment| client.delete_comment(repo, comment.id) end