ジョギング
- 香椎浜 x 2 周
- 誰に煽られた訳でもないが、これまでで最速の 29 分台で周りきった
- やりすぎた感
日課
- (腕立て x 30 + 腹筋 x 30) x 3
夕飯
実家から大量にジャガイモが送られてきていたので、自分がイメージしていたアンチョビポテトを作ってみたが失敗だった。
インフラエンジニアを自称するものにとって心得ておかなければならないプログラム言語では?という強い危機感と、これからどうやって Golang を勉強していけばいいんだろうと不安になっていたら、お仕事等で Bash + AWS CLI でその場限りのツールをポツポツ作ったりしているので、それを Golang で作ってみることにした。
ということで、describe instances して、テーブル形式、カンマ区切り形式、Markdown 形式、dnsmasq の hosts リスト形式で出力するコマンドラインツールを Golang で作ってみた。
# # 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
でも動く。但し、結果が出力されるまで時間を要する。
$ ./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")
ヘルプが日本語ですいません。
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 の --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 として解釈してくれるので有難い。
$ ./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 記法も出力出来ると嬉しいけどもう少し研究が必要。
難しいけど、ワンバイナリに出来るのはとても魅力的でデプロイの手順削減にだいぶん貢献出来ると思う。色々と覚えなければいけないこともあったりするけど、シェルスクリプトを作るような感覚で作ることが出来そうな気がする(気がするだけ)。
このドキュメントの読み方がイマイチ解っていないのが致命的。
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 年くらいたったけど、なかなかテストを書くという行為まで至れない。
「やぷし」という名前はずーっと聞いていたけど、なかなか参加出来ずにいたら福岡で開催するってことで募集が開始されたら速攻で申し込んだ。
申し込んだ時のパスワード忘れて参加票の 2 次元バーコードを取り出せずにアタフタしたけど、無事に会場に潜入することが出来た。
会場は博多駅から徒歩一分の LINE Fukuoka さんのシャレオツオフィス。
シャレオツ過ぎて写真を撮るのすら忘れた。
Hello world レベル。
奥さんの体調が悪かったり、掃除当番をさぼったツケがあったりして途中までの参加になったけど、お土産も沢山頂いたし、刺激となるようなお話も聴けたので十分にモトは取れた。
最初の 2 セッションはそれぞれアプローチの方法等は異なるものの、古い Perl バージョンとどのように付き合ってきたか、付き合っていくかのお話だっと思う。
Azure Web apps を例にクラウドエンジニアの三大美徳(怠惰であれ、短気であれ、傲慢であれ)を説かれた。
ペパボの @udzura さん、haconiwa の udzura さん。
@udzura さんや @ten_forward の Linux コンテナ関連の資料は本当に勉強になるし、これらの資料を読むたびに Docker に踊らされていた自分が恥ずかしくなる。(決して Docker が悪いわけでは無い)
とにかく、コンテナ = Docker にあらず、cgroup や Linux Namespace や Linux Capability 等の技術の結集であるという点は忘れないようにしたい。
発表の内容とは関係ないけど、@udzura さんの発表のテンポがとても気に入っている。
細かい技術のお話は出てこなかったが、ペパボさんが Github Enterprise(以後、GHE) を利用して、エンジニアだけではなく非エンジニアの方も巻き込んで生産性の向上にどのように取り組んでいるか等のお話。
アプリケーションリリース時のタグ打ちを自動化したり、エンジニアの評価を Pull Request ベースで行っていたり、それだけでなく企画進行等非エンジニアの方も積極的に利用されているのに驚かされた。また、それらのやり取りが GHE を通して全てのメンバーが見ることが出来る風通しの良さ。ほんと面白いというか凄い。メールを書いたりするような感覚で当たり前に GHE を使っちゃっているんだろうなあ。
生まれ変わったら試用期間でもいいから一度はペパボで仕事したいと思った。
途中までの参加となった YAPC::Fukuoka だけど、暑い博多で熱い気持ちになることが出来たと思うし、全てのセッションを通じて感じたのはコードが書けるようになりたいなあと思った次第(なんでか分からないけど)
登壇された皆さん、本当にありがとうございました。会場を提供して下さった LINE Fukuoka さんも有難うございました。そして…ムーン人形の頭をベタベタ触ってしまい本当に申し訳ございませんでした(初めての LINE Fukuoka で興奮していたのと、自分の頭に似ていたのでつい…)
がお昼前に復旧した。
サポートセンターのオペレータの対応に少しイラッときた瞬間があったけど、とにかく直ってよかった。
カレーを作る。
自分はトロみが少ない方(よりスープ的な感じ)が好みだったので、好みの感じで作れたと思っていたが、奥さんには若干不評だった。
夕方からはベランダがとても涼しいので、ベランダで作業が出来るようにポータブルデスクを購入した。
自宅インターネットも復旧したので、仕事用の机をダイレックス香椎店で新調したでござる。これからの季節、夕方から夜にかけてのベランダ作業が捗りそうでござります。