氷河を目指してたのに、気づいたらCLIで毛刈りを始めてた話

## 自己紹介
- 夏目祐樹 (ナツメユウタ)
- Twitter, GitHub: @sinofseven
- 株式会社クリック
- 好きなもの: 
  - 物語、音楽、AWS、Ruby、サーバーレス
- 最近やってるゲーム
  - .hack G.U. Last Record


---
## アジェンダ
1. ヤクの毛刈り
1. そして氷河を目指すことにした
1. 氷河を目指して
1. CLIでヤクの毛刈り

---
## ヤクの毛刈り
---
### yak shaving
> Yak shaving is the art of doing something that you have to do before you can do something that you have to do before you can do something that you have to do before you can do something important.

---
### yak shaving
- 2000年にMITメディアラボのJeremy H. Brownという人が送ったメールで最初に使われたらしい
-  やりたいこととは別の何かをしていること
  -  (極論)

---
### 例
車のワックスがけをしようとして、
動物園でヤクの毛刈りをしている状態

---
### 例 (正確には)
- 車のワックスがけをしよう
- ホースが壊れてるからホームセンターに行こう
- 途中に橋があって交通料がいるからEZパスなしで行くの面倒だし、お隣さんに借りよう
- その前に息子が借りたクッションを返さないと
- クッションの詰め物がとれちゃったから、ヤクの毛がいるな
- 動物園でヤクの毛刈りをしてる

---
### 例について
- アメリカで一般向けに説明された例文
- これで一般にも浸透したらしい
- あと詳しいことはBlogosの記事を見て欲しい
  - [IT業界の人々はどうして「ヤクの毛を刈る」ことが多いのか？](http://blogos.com/article/65001/)

---
## そして氷河を目指すことにした

---
### 外付けHDDの容量が少なくなってきた

---
買い換える?
でも、前に二度故障を経験したしなぁ

- 落としてから動きが悪くなった
- Linux動かしてたら、一部データを破損した

---
### Amazon Glacier
![Untitled(1) (1).png](https://qiita-image-store.s3.amazonaws.com/0/31478/4dd18286-0f7f-6de8-bd46-95d54a2b7889.png)


---
### Amazon Glacier
- データのアーカイブおよび長期バックアップを行うためのストレージ
- Glacierは日本語で、"***氷河***"
- $0.004 : GB あたり/月

---
### Glacier was 破産メーカー
[Amazon Glacierでクラウド破産しないために](http://blog.hde.co.jp/entry/2015/01/30/154101)![](http://cdn-ak.f.st-hatena.com/images/fotolife/m/masatobito/20150130/20150130145051.png)

---
### Glacier is not 破産メーカー
2016年12月に料金体系が変更に
![Screenshot 2018-02-10 at 13.14.06.png](https://qiita-image-store.s3.amazonaws.com/0/31478/6006f90d-efdd-8595-bbd4-1696fdad0462.png)
[Amazon Glacierで高額料金請求は「過去の話」になりました【2017年最新情報】](https://digital-chiebukuro.com/aws/amazon-glacier-kaizen/)  

---
### Glacierの使い方 (アップロード、リスト)
若干S3と似てる

- S3: 
  - 箱(バケット)を作って、もの(オブジェクト)を入れる
  - 箱の中身のリストは随時更新される
- Glacier:
  - 箱(バケット)を作って、もの(アーカイブ)を入れる
  - 箱の中身のリスト(インベントリー)は毎晩(?)更新される

---
### Glacierの使い方(ダウンロード)
1. 取得Jobを発行する
1. 取得Jobの完了を待つ
1. 完了Jobからアーカイブをダウンロード

---
### これ手動でやるの面倒じゃね?

---
- 設定していれば、取得Jobの完了はSNS Topicにメッセージが来る
  - Amazon SNS: AWSのPub/Subメッセージサービス。
  - SNS Topic: メッセージが飛んでくる先
- LambdaのトリガーイベントとしてSNS Topicを指定できる

---
### サーバーレスのクライアント作れるかもしれない

---
### Glacier Serverless Client

---
### Glacier ServerLess client

---
### Glacier SL

---
### Glacier Express

---
### Glacier Expressの構成
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/31478/2a66d181-8b12-8e06-7383-a09d38dcb480.png)

---
### Fargate
- re:Invent 2017で発表された新サービス
- Dockerコンテナーのマネージド・サービス
  - 仮想マシン? いえ、知らない子ですね
  - 今まではEC2上で動いていて、課金もEC2ベース

---

## 氷河を目指して

---
### 基本方針
- サービス関して検証を行う
- 上手く行ったら、CloudFormationからやってみる


---
### まずはFargate by CLI
- 新サービスで情報が少ないし、難易度高そう
- 実際、某ブログ(oo.IO)を見てCLI (tool)で動かしてみようとすると、CLI Toolのバージョンが変わっててできなかった

---
### Fargate by Web Console
- Web Consoleからやってみる
- CLIで作った環境をベースにやってみる
  - やっぱり失敗: docker pullができてない
- すべてWeb Consoleからやってみる
  - 成功: どうも仮想ネットワークの設定が原因
     - ECRを使っていれば外につながってなくてもできるかも


---
### CloudFormationでFargateを
- Fargateの環境をCloudFormationで構築してみよう
- CloudFormationで構築するのはちょっと面倒なので楽をするために Serverless Frameworkを使うことにする
  - Serverless Framework: Lambdaなどのデプロイなどができるツール。CloudFormationだけを動かすこともできる
- Serverless FrameworkだとCloudFormationのYAMLを書くのに注意が必要
- じゃあ、CloudFormation用のCLI Toolを作るか
  - これよりヤクの毛刈りを開始する!!

---
## CLI でヤクの毛刈り

---
### AWS CLIでCloudFormationをやるときに困ること
- (create|update|delete)-stackした時に、そのコマンドが正常に発行されたかしか取得できない
  - 実際にリソースの作成や削除が進んでいるかは別のコマンドで取得することになる
  - waiterを使えば終了の監視はできるかもしれない
- スタック名とか毎回コマンドのオプションとして書かないといけない

---
### Serverless Frameworkで好きだったこと
- (deploy|remove)でverboseオプションを付けると、CloudFormationで作成/削除してるリソースを見ることができる
- スタック名とかを設定ファイルの中身から自動的に生成してくれる

---
### 何をできるようにするか
- スタックの作成/削除が終了するまでコマンドの実行が止まらない
- verboseオプションでリソースの作成/削除イベントを表示するようにする
- スタック名などの設定をファイルからも取得できるようにする
  - 優先順位
    1. コマンド引数
    2. 設定ファイル
    3. 環境変数

---
### 言語選定
- Rubyを選択
- 普段使いのNode.jsでもいいんだけど
  - イベント取得部分でループを回すことになるから面倒
    - v7.6のasync/awaitを使えば楽だけど、Lambdaがv6.10までだからそもそも勉強すらしてない
- そして何よりも
  - ***Rubyが好き***

---
### 作成/削除イベントの取得 (1)
```(create|update|delete)_stack && describe_stack_events```

- そのスタックのイベントを時系列降順で取得できる
- 一度に取得できるのは合計サイズが1MBまで
  - 超えるとnext_tokenなるものが発行され、それを使って取得する
  - 今回は直前で実行したxxx-stackのイベントのみ取得できればいいから考えない

---
### 作成/削除イベントの取得 (2)
- xxx_stackのオプションでclient_request_tokenを指定すると、eventの情報の中に同名で表示される
  - これを使って今回の作成/削除のイベントかを判断する


---
### 作成/削除イベントの取得 (3)
- イベント取得ループの終了条件
  - リソースの論理名がスタック名と同じ名前のもので、ステータスの末尾が```COMPLETE```になっているものを取得できたら終了する
  - ただし、delete_stackの場合は注意が必要
     - 論理名がスタック名のイベントがそもそも発行されない
     - そのタイミングでスタックの完全削除がされてるらしく、describe_stack_eventsで例外が発生する


---
### RubyでCLI Toolを作る
- ***Thor***というgemが便利そうなのは調べた
- オプションだとか、例外処理とかは未検証
  - 今週Fukuoka.rbがあるはずだったからそこで聞く予定だった

---
### さらなる問題: 名前

--- 
## まとめ
- yak shavingという言葉があるよ
- Glacierはバックアップ用のストレージとして便利そうだよ
- こうやってヤクの毛刈りをして、目的と別のことするっていうのはどうなんだろうね? やっぱりやめた方がいいのかな?
- CloudFormationのCLI Toolを知っている方がいれば教えてください