かまたま日記3

プログラミングメイン、たまに日常

北海道旅行に行ってきた

8/10~13 の3泊で北海道に行ってきました。

1日目(8/10)

直前に飛行機を取ろうとしましたが、羽田発の便は全滅だったので茨城空港から出発。東京駅から500円のバス便があるのでそれを利用しました。茨城空港ガルパン推しがヤバかったです。

12時前に新千歳に着いてそのまま電車で小樽へ。澤崎水産で特選ちらし丼を注文、ウニがとろけました。

f:id:kamatama_41:20160810144409j:plain

その後は近くの店で生とうもろこしを食べ(これがものすごく甘かった..!)、小樽運河クルージングして札幌に戻りこの日は終了。

2日目(8/11)

朝から旭川に車を走らせ昼前に旭山動物園に到着。この日は北海道にしては結構暑く、いろいろな動物を見ましたが、ほぼすべての動物が日陰で寝てましたw そんな中でテナガザルの機敏な動きはかなり感心させられるもので、観客も集まってました。

その後あさひかわラーメン村にて利尻昆布ホタテを使ったラーメンを食べ、滝川市へ。

f:id:kamatama_41:20160811142913j:plain

滝川市でローカルの花火大会に参加。the 地元の花火大会という感じで規模的には小さなものでしたが、打ち上げ場所のすぐ近くで見れたので迫力はすごかったです。

3日目(8/12)

旭川から出発し、美瑛の青い池に。いい青でした。

f:id:kamatama_41:20160812095314j:plain

その後四季彩の丘富良野ファーム富田六花亭カンパーナに寄り自然を満喫。富良野のホテルへ。

夜は何もすることが無いかなと思ってたのですが、地元のお祭的なものが駅前で開催されてて小学校低学年くらいのちびっ子たちのライブを楽しめました、演奏めちゃ上手かった。

4日目(8/13)

朝に出て昼前に札幌へ戻り、回転寿しのトリトンへ。この日のオススメのボタンエビが濃厚で美味でした...!

f:id:kamatama_41:20160813131324j:plain

その後、北海道大学でクラーク博士に会ったり雪印パーラーで(ジャンボじゃない)パフェを食べたりして、新千歳空港へ戻り東京へ帰りました。

まとめ

北海道はとにかく広くて隣の観光地に行くのにも車で50kmとか走らないといけないので大変でした(3日間の運転距離約500km)。が今まで経験したことのない自然だったり食べ物だったりを経験できて良かったです。北海道はデッカイドウでした...!

シン・ゴジラを観た

かなり評判が良かったので見てきました。感想としては評判に違わぬ内容で面白かったです。

全体的に日本よりなところ(アメリカが完全悪者扱い)とかは賛否が別れるかと思いますが、庵野節ってことで僕はアリかなと思いました、ところどころでエヴァネタとかも入ってたり。

長谷川博己さんの演技が個人的にはすごく良かったと思います、カッコいい。

Terraformをバージョン管理できるtfenvを作った

github.com

名前を見てもお分かりのように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でそのバージョンをインストール出来るようになります。

*1:ソースコード的にも結構使わせてもらってます

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.com

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

Recruit Technologies Open Lab #03 Infrastructure as Code に参加してきた

atnd.org

スピーカーが興味深い方ばかりだったので、参加してきました。

多くの方が Infra as Code の本質はインフラがコード化することで、ソフトウェア領域での知見が適用できるようになって来たと言っていたのが印象的でした。

  • バージョン管理するようになった
  • テストコードが記述可能になった
  • アプリケーションの構成要素のひとつになった
  • 単なる手順化にとどまらずにデザインパターンモデリングなどを適用するなった
  • コンウェイの法則が適用されるようになった
  • 技術的負債になるようになった
  • マイクロサービス化で管理するものを少なくする方向性
  • 人工知能機械学習などの分野で応用される可能性

今まさにterraformやansibleでサーバ構成をコード化しているところなので、負債化しないように意識していきたいですね。

以下勉強会中にとったメモ書き


"Infrastructure as Code" から数年、結果どうなったか (naoyaさん)

  • Infra as code は単なる自動化では無かった。。。!
    • Software で使われてるプラクティスをインフラにも適用する
  • naoyaさんにが思うinfra as code
    • infraのモデリング..! (DDD的な)
    • 負債を無くす、減らす
    • そもそもDockerとかで小さく分割して管理するコード減らす方向性...?

Infrastructure as Code と企業文化 (ryuzeeさん)

Infrastructure as Code のこれまでとこれから (mizzyさん)

運用・監視もコード化する。開発者が監視まで考える方法論 (songmuさん)

  • メトリックを返すエンドポイントがあるとよろし
  • 監視 as Code
    • じつは既に、監視は結構コード化, Plugin化されてる
      • muninとかもそうだった記憶が
    • なのでどんどん書いていこう
    • webhookには夢がある

プロビジョニングツールはMakeで決まりだろ (katzchangさん)

  • Makeはベターshell scriptである 2012
  • Immutable Infrastructureを実際にやってみた 2014
  • Makeは補完が効く
  • エラー処理: non-zeroだったら落ちる
  • 宣言的適用と差分
    • サーバは状態をもつので、冪等性の維持がむずい
  • 手続き型への回帰: 提言
    • サーバの単純化
    • コンテナなどで、破棄可能な感じに(状態が無くなってきた)
    • サーバレス