ようへいの日々精進XP

よかろうもん

2017 年 07 月 03 日(月)

ジョギング

  • 香椎浜 x 2 周
  • 誰に煽られた訳でもないが、これまでで最速の 29 分台で周りきった
  • やりすぎた感

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

夕飯

実家から大量にジャガイモが送られてきていたので、自分がイメージしていたアンチョビポテトを作ってみたが失敗だった。

俺の EC2 〜 郷編 〜

もはや Golang

インフラエンジニアを自称するものにとって心得ておかなければならないプログラム言語では?という強い危機感と、これからどうやって Golang を勉強していけばいいんだろうと不安になっていたら、お仕事等で Bash + AWS CLI でその場限りのツールをポツポツ作ったりしているので、それを Golang で作ってみることにした。

ということで、describe instances して、テーブル形式、カンマ区切り形式、Markdown 形式、dnsmasq の hosts リスト形式で出力するコマンドラインツールを Golang で作ってみた。

作ったもの

gist.github.com

使い方

準備

#
# go のバージョンを確認
#
$ go version
go version go1.8.3 darwin/amd64

#
# 必要なパッケージを取得
#
$ go get  github.com/aws/aws-sdk-go
$ go get  github.com/olekukonko/tablewriter

ビルド

$ wget --no-check-certificate https://gist.githubusercontent.com/inokappa/12b0f484bdae8876f6917ff5b43dcfae/raw/ff44c6c6c658d8cf82d6d1a71a5f22d5942f95d2/oreno-ec2.go
$ go build oreno-ec2.go

特にビルドしなくても go run でも動く。但し、結果が出力されるまで時間を要する。

help

$ ./oreno-ec2 -help
Usage of ./oreno-ec2:
  -comma
        カンマ区切りの hosts リストを生成する
  -command string
        指定したコマンドを実行する
  -dnsmasq
        dnsmasq 用の hosts リストを生成する
  -markdown
        Markdown のテーブルフォーマットで出力する
  -path string
        ファイルのパスを指定する (default "hosts_list")
  -profile string
        AWS Shared Credential の Profile 名を指定する
  -read
        -path オプションで指定したファイルを読み取る
  -region string
        AWS Region 名を指定する (default "ap-northeast-1")

ヘルプが日本語ですいません。

EC2 一覧を出力

AWS CLI--output table オプションとほぼ同じ。

$ ./oreno-ec2
+------------------+---------------------+--------------+-----------------+---------------+----------------+---------+
|     TAG:NAME     |     INSTANCEID      | INSTANCETYPE |       AZ        |   PRIVATEIP   |    PUBLICIP    | STATUS  |
+------------------+---------------------+--------------+-----------------+---------------+----------------+---------+
| dev-aaa1         | i-xxxxxxxxxxxxxxxxx | t2.micro     | ap-northeast-1a | 172.31.x.187  | Not assignment | stopped |
| dev-bbb1         | i-xxxxxxxxx         | t2.micro     | ap-northeast-1a | 172.31.x.39   | Not assignment | stopped |
| hogehoge         | i-yyyyyyyyyyyyyyyyy | t2.micro     | ap-northeast-1a | 172.31.x.89   | Not assignment | stopped |
| dev-ccc1         | i-zzzzzzzzz         | t2.medium    | ap-northeast-1a | 172.31.x.139  | Not assignment | stopped |
| dev-ddd1         | i-pppppppppp        | t2.micro     | ap-northeast-1a | 172.31.x.117  | xx.xxx.xxx.xx  | running |
| dev-eee1         | i-qqqqqqqqqqqqqq    | t2.micro     | ap-northeast-1a | 172.31.x.28   | Not assignment | stopped |
+------------------+---------------------+--------------+-----------------+---------------+----------------+---------+

出力出来る項目数だけで比較すると AWS CLI を利用した方がいいかな…

dnsmasq の hosts リストを出力

dnsmasq の --address= で指定する /Domain/IPAddress 形式のリストを -path で指定したファイルに出力する。

$ ./oreno-ec2 -dnsmasq -path dnsmasq.txt
$ ./oreno-ec2 -read -path dnsmasq.txt
address=/dev-aaa1/172.31.x.187
address=/dev-bbb1/172.31.x.39
address=/hogehoge/172.31.x.89
address=/dev-ccc1/172.31.x.139
address=/dev-ddd1/172.31.x.117
address=/dev-eee1/172.31.x.28

-read オプションはコマンドの cat と全く同じ機能。単に Golang でファイルを読み込む方法を勉強したかった為に実装した。

func read_hosts_list_file(file_path string) {
    contents, _ := ioutil.ReadFile(file_path)
    fmt.Println(string(contents))
}

ioutil.ReadFile にファイルのパスを指定するだけで読み込めるらしい。なるほど。ioutil 便利。

カンマ区切りでファイルに出力

$ ./oreno-ec2 -comma -path comma.txt
$ ./oreno-ec2 -read -path comma.txt
dev-aaa1,i-xxxxxxxxxxxxxxxxx,t2.micro,ap-northeast-1a,172.31.x.187,Not assignment,stopped
dev-bbb1,i-xxxxxxxxx,t2.micro,ap-northeast-1a,172.31.x.39,Not assignment,stopped
hogehoge,i-yyyyyyyyyyyyyyyyy,t2.micro,ap-northeast-1a,172.31.x.89,Not assignment,stopped
dev-ccc1,i-zzzzzzzzz,t2.medium,ap-northeast-1a,172.31.x.139,Not assignment,stopped
dev-ddd1,i-pppppppppp,t2.micro,ap-northeast-1a,172.31.x.117,52.198.32.108,running
dev-eee1,i-qqqqqqqqqqqqqq,t2.micro,ap-northeast-1a,172.31.x.28,Not assignment,stopped

カンマ区切り。一応、Excel でファイルを開くと CSV として解釈してくれるので有難い。

Markdown フォーマットのテーブル形式で出力

$ ./oreno-ec2 -markdown
|     TAG:NAME     |     INSTANCEID      | INSTANCETYPE |       AZ        |   PRIVATEIP   |    PUBLICIP    | STATUS  |
|------------------|---------------------|--------------|-----------------|---------------|----------------|---------|
| dev-aaa1         | i-xxxxxxxxxxxxxxxxx | t2.micro     | ap-northeast-1a | 172.31.x.187  | Not assignment | stopped |
| dev-bbb1         | i-xxxxxxxxx         | t2.micro     | ap-northeast-1a | 172.31.x.39   | Not assignment | stopped |
| hogehoge         | i-yyyyyyyyyyyyyyyyy | t2.micro     | ap-northeast-1a | 172.31.x.89   | Not assignment | stopped |
| dev-ccc1         | i-zzzzzzzzz         | t2.medium    | ap-northeast-1a | 172.31.x.139  | Not assignment | stopped |
| dev-ddd1         | i-pppppppppp        | t2.micro     | ap-northeast-1a | 172.31.x.117  | 52.198.32.108  | running |
| dev-eee1         | i-qqqqqqqqqqqqqq    | t2.micro     | ap-northeast-1a | 172.31.x.28   | Not assignment | stopped |

お仕事で Wiki 等にインスタンス一覧を資料として書くことが多々あるので便利だろうなあと思って追加した。実際に貼り付けてみると以下の通り。

TAG:NAME INSTANCEID INSTANCETYPE AZ PRIVATEIP PUBLICIP STATUS
dev-aaa1 i-xxxxxxxxxxxxxxxxx t2.micro ap-northeast-1a 172.31.x.187 Not assignment stopped
dev-bbb1 i-xxxxxxxxx t2.micro ap-northeast-1a 172.31.x.39 Not assignment stopped
hogehoge i-yyyyyyyyyyyyyyyyy t2.micro ap-northeast-1a 172.31.x.89 Not assignment stopped
dev-ccc1 i-zzzzzzzzz t2.medium ap-northeast-1a 172.31.x.139 Not assignment stopped
dev-ddd1 i-pppppppppp t2.micro ap-northeast-1a 172.31.x.117 52.198.32.108 running
dev-eee1 i-qqqqqqqqqqqqqq t2.micro ap-northeast-1a 172.31.x.28 Not assignment stopped

Backlog 記法も出力出来ると嬉しいけどもう少し研究が必要。

ということで

郷言語

難しいけど、ワンバイナリに出来るのはとても魅力的でデプロイの手順削減にだいぶん貢献出来ると思う。色々と覚えなければいけないこともあったりするけど、シェルスクリプトを作るような感覚で作ることが出来そうな気がする(気がするだけ)。

aws-sdk-go のドキュメント

このドキュメントの読み方がイマイチ解っていないのが致命的。

工夫したところ

func aws_ec2_client(profile string, region string) *ec2.EC2 {
    var config aws.Config
    if profile != "" {
        creds := credentials.NewSharedCredentials("", profile)
        config = aws.Config{Region: aws.String(region), Credentials: creds}
    } else {
        config = aws.Config{Region: aws.String(region)}
    }
    sess := session.New(&config)
    ec2_client := ec2.New(sess)
    return ec2_client
}

手元のパソコンから oreno-ec2 を叩く場合には Shared Credential の Profile 名を指定することが多いけど、EC2 上で叩く場合には大概の場合、IAM Role が付いているので Profile 名が指定されない場合を想定している。(より良い書き方があるかもしれないけど)

テスト

プログラムを書いたらテストまでしっかりと書きたいと思い続けて 100 年くらいたったけど、なかなかテストを書くという行為まで至れない。

2017 年 07 月 01 日(土)

YAPC::Fukuoka 2017

LINE Fukuoka も初めて訪れた。

途中までの参加だったけど、夏の暑さに負けないくらいの刺激を頂いたきがする。

ジョギングとか日課

は全てお休み。

YAPC::Fukuoka 2017 に途中まで参加した

YAPC::Fukuoka

「やぷし」という名前はずーっと聞いていたけど、なかなか参加出来ずにいたら福岡で開催するってことで募集が開始されたら速攻で申し込んだ。

yapcjapan.org

申し込んだ時のパスワード忘れて参加票の 2 次元バーコードを取り出せずにアタフタしたけど、無事に会場に潜入することが出来た。

初めて LINE Fukuoka

会場は博多駅から徒歩一分の LINE Fukuoka さんのシャレオツオフィス。

linefukuoka.co.jp

シャレオツ過ぎて写真を撮るのすら忘れた。

ボクと Perl の関わり

Hello world レベル。

途中までの参加だったけど

奥さんの体調が悪かったり、掃除当番をさぼったツケがあったりして途中までの参加になったけど、お土産も沢山頂いたし、刺激となるようなお話も聴けたので十分にモトは取れた。

参加したセッションとざっくりとした感想

参加したセッション

Perl は公私共に使ったことがない身分ですが

最初の 2 セッションはそれぞれアプローチの方法等は異なるものの、古い Perl バージョンとどのように付き合ってきたか、付き合っていくかのお話だっと思う。

  • 既に安定して動いてしまっているアプリケーション遺産に手を加えるのは大変そう…これって、言語に関係なく言えることなんだろうなあ
  • ユニットテスト等もメンテナンスされなくなる
  • 出来るだけ小さくシンプルにリリースを保つことで Perl のバージョンアップの手間を最小限に抑える努力をされているとのこと(これって、Perl に限らず他の言語でも言えることなんだろうなあ)
  • ペパボのインフラエンジニアの皆さんには Golang が根付いていて、テストも書いちゃうらしい…スゴイなあ

クラウドエンジニアの三大美徳

Azure Web apps を例にクラウドエンジニアの三大美徳(怠惰であれ、短気であれ、傲慢であれ)を説かれた。

  • 運用するな開発せよ…確かに、そう思う
  • OS の管理をしたくない…その通り、やりたくない
  • ネットワーク構成まで Infrastructure as a code したい…うむ、ぜひやりたい

コンテナ = Docker にあらず

ペパボの @udzura さん、haconiwa の udzura さん。

@udzura さんや @ten_forwardLinux コンテナ関連の資料は本当に勉強になるし、これらの資料を読むたびに Docker に踊らされていた自分が恥ずかしくなる。(決して Docker が悪いわけでは無い)

とにかく、コンテナ = Docker にあらず、cgroup や Linux Namespace や Linux Capability 等の技術の結集であるという点は忘れないようにしたい。

発表の内容とは関係ないけど、@udzura さんの発表のテンポがとても気に入っている。

ペパボさん x Github Enterprise x OpenStack

細かい技術のお話は出てこなかったが、ペパボさんが Github Enterprise(以後、GHE) を利用して、エンジニアだけではなく非エンジニアの方も巻き込んで生産性の向上にどのように取り組んでいるか等のお話。

アプリケーションリリース時のタグ打ちを自動化したり、エンジニアの評価を Pull Request ベースで行っていたり、それだけでなく企画進行等非エンジニアの方も積極的に利用されているのに驚かされた。また、それらのやり取りが GHE を通して全てのメンバーが見ることが出来る風通しの良さ。ほんと面白いというか凄い。メールを書いたりするような感覚で当たり前に GHE を使っちゃっているんだろうなあ。

生まれ変わったら試用期間でもいいから一度はペパボで仕事したいと思った。

ということで

途中までの参加となった YAPC::Fukuoka だけど、暑い博多で熱い気持ちになることが出来たと思うし、全てのセッションを通じて感じたのはコードが書けるようになりたいなあと思った次第(なんでか分からないけど)

登壇された皆さん、本当にありがとうございました。会場を提供して下さった LINE Fukuoka さんも有難うございました。そして…ムーン人形の頭をベタベタ触ってしまい本当に申し訳ございませんでした(初めての LINE Fukuoka で興奮していたのと、自分の頭に似ていたのでつい…)

2017 年 06 月 30 日(金)

今日は

5 回目の結婚式記念日。

ジョギング

  • 香椎浜 x 2 周
  • 右かかとの痛みがあるのでペースはゆるりと

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

夕飯

JAYA で料理長特製のピザとパスタ。どちらもクオリティ高い。

JAYA から帰ってきたら、奥さんがアイスを爆食いしてて、気付いたら気持ち悪いと言って横になっていた。 こういうところも奥さんらしくて好きなところである。

2017 年 06 月 29 日(木)

ジョギング

  • 香椎浜 x 2 周
  • 右足かかとの痛みは少し和らいだ

日課

  • (腕立て x 30 + 腹筋 x 30 ) x 3

昼夜通して

食事はカレー。

美味しかったからいいんだけど。

2017 年 06 月 28 日(水)

ジョギング

  • 引き続き、お休み
  • 右足かかとの痛み

日課

  • (腕立て x 30 + 腹筋 x 30 ) x 3

自宅インターネット

がお昼前に復旧した。

サポートセンターのオペレータの対応に少しイラッときた瞬間があったけど、とにかく直ってよかった。

夕飯

カレーを作る。

自分はトロみが少ない方(よりスープ的な感じ)が好みだったので、好みの感じで作れたと思っていたが、奥さんには若干不評だった。

仕事用デスク

夕方からはベランダがとても涼しいので、ベランダで作業が出来るようにポータブルデスクを購入した。

自宅インターネットも復旧したので、仕事用の机をダイレックス香椎店で新調したでござる。これからの季節、夕方から夜にかけてのベランダ作業が捗りそうでござります。

2017 年 06 月 27 日(火)

ジョギング

  • お休み
  • 右足かかとの痛み

日課

  • も無し

自宅インターネット

が使えなくなる。

仕方ないので博多でコワーキング借りようと思ってブラブラしていたら、結局、いつもの筑紫口二階のプロント。但し、今日はビール無し。

ずーっとテザリングでデータ使用量心配だし、zoom とかで打ち合わせ出来ないので辛い。

夕飯

奥さんと待ち合わせて「ひかり」で食べる。

穴子の天ぷらはとても美味しかったけど、他のお刺身等は割高感があった。普通にゴマサバとか頼んでおけば良かったと後悔。

2017 年 06 月 26 日(月)

ジョギング

  • 右足のかかと付近が痛いので散歩

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

夕飯

奥さんがササッと作ったゴーヤと豚肉の炒め物が美味しかった。ちなみに、ゴーヤは実家の庭で採れたやつ。