Empowered by expect

希望は体力

SSVCのDecision Tableを雑に実装してみる~Twine編~

DecisionRules編からの続編です。

概要

タイトルの通りです。Twineにインポートできるhtmlファイルを置いておきます。そのまま開いて実行もできます。
https://github.com/w4yh/SSVC-decision-tree
ファイル: HarloweとSugarCubeの2種類のスタイルで作ってみました。
SSVC_Supplier_Decision_Table_Harlowe_0.0.2.html
SSVC_Supplier_Decision_Table_SugarCube_0.0.2.html

完成品

最初にデモ代わりにSugarCube版のスクリーンショットを載せておきます。
ここでは Exploitation=Active, Automatable=yes, Value Density=concentrated, Technical Impact=Total, Safety Impact=Catastrophic を選択しています。

Twineスタート画面
Twine Exploitation選択画面
Twine Automatable選択画面
Twine Value Density選択画面
Twine Technical Impact選択画面
Twine Safety Impact選択画面
Twine選択終了画面
Twine判定結果画面

経緯

前回はSSVCの判定をDecisionRulesで作成してみました。
一覧が見えるので分かりやすい、APIも備えているのでcURLなどCLIからも実行できるなどの利点がありました。一方でツールチップで説明文を表示するなどの機能を実装していないので、実際に使用するシーンでは別途リンクURLなどの情報が必要でした。

今回はTwineを使ってリンクURLや説明文も表示しながら実装してみました。

Twine

公式サイト

Twineはオープンソースのノベルゲーム作成ツールです。
私は以前からTwineで業務フローを書くという間違った使い方をしています。フローチャートやBPMNだけだと通じる相手を選んでしまうケースがあるんですよね..ドメインサーバー証明書の購入といった事務寄りの方やサービスデスクの方などが関わる業務の説明で使ってウケたので愛用しています。

GitHub上に公開した冒頭のhtmlファイルを開くとこんな感じです。

Twineサンプル(Harlowe)

え、色が見にくいですか?cssを編集してください。別のテーマ(SugarCube)ではこうなります。

Twineサンプル(SugarCube)

ちょっと見やすくなりましたかね。Twine2ではデフォルトスタイルは一つ目の方(Harlowe)です。Harloweの方がノベルゲームっぽい雰囲気は出る気がしますが、お好みで選択 && css編集で色の変更 をしてください。

設計

DecisionRules編では"行を最下部に複製"を駆使して一覧にしました。今回は質問は5問しか無いですが一覧フルメッシュで作ると樹形図のようになり、枝分かれ先に同じ質問を何度も書くことになります。
そこで今回は各質問の回答をを変数に記憶しておき、最後に回答ごとの画面に遷移して判定結果を表示するという仕組みにしました。

Twine画面遷移一覧

最後をif文にするか迷いましたが、判定結果を「ここはimmediateにしたい」といったカスタマイズを行う場合に長いif文よりは扱い易いかと思いこの方法にしました。SSVCの資料に合わせて左から右に縦長で配置する方が良かったかもしれません。

インポートと実行

Twine公式サイトからダウンロードしてTwineをPCにインストールしてください。

実行すると初期メニュー画面になります。右側メニューから [Import From File] を選択します。

Twine初期メニュー画面

ファイル選択画面になるので、GitHubからダウンロードしたhtmlファイルを指定します。

インポートファイル選択画面

ファイル編集画面になります。

Twineでファイルを開いた画面

右下の [▶Play] を押すとデフォルトブラウザで開いて実際にプレイできます。

Twineの書き方の細かい説明は省略しますが、今回のファイルの流れだけ説明します。
設計のところでも述べましたが、各質問の答えを変数 $ans1 ~ $ans5 に記録しています。最後に連結して5桁の数字を $ans として生成し、該当の番号の選択肢(11111など)へジャンプして判定結果を表示しています。
最初のページに資料へのリンクを記載しています。独自の前提質問を追加する場合にはStartページから [0.始めましょう] の間に新しい画面(TwineではPassageと呼びます)挟むといいでしょう。Passageへのリンクは [[Passageの名前]] で表します。例えば「Javaは無いので対象外」のように「該当のパッケージがCMDB内に存在するか」といった質問を最初に加えるケースが想定されます。

振り返り

Twineで作るとディシジョンテーブル感は薄れるかもしれないですね。
しかしWiki上でパンくずリストを見ながら選択肢を大量に作るよりも扱い易いかと思います。本来ノベルゲーム用ツールなのでエンジニア向けツールというわけでもなくとっつきやすいかと思います。

5つめの質問である "Safety Impact" の判定がかなり肝な印象です。被害に関することなので、CVSSアタックベクターの中にはそのまま当てはまる項目は無いような気がします。どちらかというとISMSなどで組織毎システム毎に行ったリスク評価みたいなものがベースになるのかなと思います。リスク評価メンドクサイですが、やっぱりやらないといけませんね。。

SSVCのDecision Tableを雑に実装してみる~DecisionRules.io編~

経緯

TwitterでSSVCのことを知りました。

元となるブログ記事やその引用記事などを読んで、これはPrologで書けそうなディシジョンテーブルだなあと思いました(本投稿ではSSVC自体の説明は一切しませんので以下リンクの素晴らしいコンテンツをご参照ください)。
shinobe179.hatenablog.com
www.pwc.com
github.com

しかしPrologで書いてもProlog実行環境のインストールから説明することになるよなあ...と察したので今回はDecisionRulesというサービスを使って実装してみます。
ここではまずSSVCの"Suggested Supplier Table"を作ってみます。

DecisionRules概要

ディシジョンテーブルなどを作成&実行できる便利SaaSです。
www.decisionrules.io

Freeプランもあるのでアカウントを作成してください。ただし企業名や電話番号を求められます。

DecisionRulesアカウント作成画面

Excelからのインポートでテーブルを作成する

ログイン後、左側メニューから [Decision Tables] を選択します。

DecisionRules初期メニュー

DecisionTablesのトップ画面で [+ Decision Table] を選択して新規作成していきます。

DecisionTableトップ画面

作成方法の選択画面では右の [EMPTY DECISION TABLE] を選択し、
画像の赤枠部分でこのディシジョンテーブルを命名して下の [Continue] を選択します。

DecisionTable作成初期画面

空のディシジョンテーブルが表示されます。
左側の [Rule Settings] タブに移動します。

空のDecisionTable初期画面

テーブル設定画面で右上のメニューから [Import Version] を選択します。

Rule Settings画面

Import Decision Table の画面に進んだら
[1. Select Version!] で [Current (version 1)] を選択し、
[2. Drop or choose file!] で本投稿先頭に示したGitHubからダウンロードしたxlsxファイルを指定します。

テーブルのimport画面

ファイルに問題が無ければ下に [Save] のボタンが表示されるので選択します。

読み込んだディシジョンテーブルが表示されます。

インポートされたテーブルの初期画面

なおSSVCの項目のうちUtilityはAutomatableとValue Densityの2つから決まるので、直接AutomatableとValue Densityを入力する形にしました。さらにPublic Safety Impactは実質Safety Impactで決まるのでSafety Impactのみの入力を必要としています。

実行

テーブルを眺め終わったらさっそく実行してみましょう。
左側メニューから [Test bench] を選択します。

テストベンチメニュー画面

[1. Select Meta Data] の部分は自動で値が入っていると思います。
(API Key情報を含むのでキャプチャ略)
[2. Fill Request Body & Solve!] の欄に入力値を入れていきます。
 Exploitation (Active | PoC | none)
 Automatable (yes | no)
 Value Density (concentrated | diffuse)
 Technical Impact (Total | Partial)
 Safety Impact (Catastrophic | Hazardous | Major | Minor | None)
プルダウン選択..とはいきませんが、Valueの入力欄右側のハンバーガーメニュー(?縦3dots?)から [Preset Values] を選択すると値のリスト選択ダイアログが出ます。

Preset Valuesメニュー
Preset Valuesリスト画面

5項目の値をすべて入力して中央の [▶Run] を押します。
右側のOutputの欄に結果が表示されます。この場合は Priority=immediate、すぐに対応せよとなりました。

テストベンチ結果画面

同じ画面の下の方に [Code example] という欄があります。ここに今行ったテストをcURLやプログラミングから実施する場合のコードが表示されます(ここもAPI Keyを含むのでキャプチャ省略)。便利ですね!

Code Example欄

振り返り

SSVC Supplier Decision Tableの決定木をDecionRulesで実装することができました。
一覧で見通せる上Excel形式でのインポート&エクスポートもできお手軽だったと思います。

しかし、入力値のそれぞれの値についてツールチップなどで説明を表示といった機能を持たせていないので「別途資料を見ながら値の判定を行った後で最後に決定木を辿る部分だけの実装」となっています。Code Exampleの欄にPython等のコードも表示されるので周辺機能を作りこめばいいんですけどね。。でもそれならPrologでも苦労変わらないし。。

次回、「Decision TableをTwineでノベルゲームっぽく長い説明付きで実装する編」モノはできたので書けたら書きます。

エクスカーション

DecisionRules良かったです

今回たまたま見つけて使ってみましたが分かりやすかったです。コードを書けない人とビジネスルールの意識合わせをする場合にも使えそうな気がします。
また今回はインポートするので空白テーブルから作成しましたが、サンプルテーブルの内容はディシジョンテーブル界のHello Worldこと"複数の条件からなる割引率の決定"です。

テーブルが力業

今回作ったExcelテーブルは凝ったことはせずに、愚直にすべてのケースを羅列しています。
将来判定基準が変わったり、それぞれの組織やシステムの事情で「ここはout-of-cycleにしたい」といった時にも改変しやすいようにこの形式としました。
なので今回の主な作業は「この行を一番下に複製」の連打でした :P

decisionのカタカナ表記

ディシジョンで統一しましたがデシジョンだったでしょうか?
どちらが良いか判断つかないので機会あれば詳しそうな松井玲奈さんに質問しておきます。

IPアドレスのリストアップと集約(prips, aggregate)ついでにgrepcidr

きっかけ

@m4g さんのツイートでいろんなツールを思い出したのでまとめておきます

prips (print IP address)

私も以前同様のツールを探して、blacknonさんのブログでpripsを知りました。

orebibou.com

ここではRPMLinuxでのインストールと動作確認を記します。

pripsのインストール

$ git clone https://gitlab.com/prips/prips.git
$ cd prips
$ make

$ make test
prove t
t/01-cidr.t ...... ok
t/02-range.t ..... ok
t/03-skip.t ...... ok
t/04-format.t .... ok
t/05-except.t .... ok
t/06-cidrize.t ... ok
t/07-features.t .. skipped: The feature-check tool does not seem to be present
All tests successful.
Files=7, Tests=74,  1 wallclock secs ( 0.06 usr  0.02 sys +  0.34 cusr  0.12 csys =  0.54 CPU)
Result: PASS
$ sudo make install
$ hash -r

pripsの使用例

まずはヘルプを見てみます。

$ prips -h
usage: prips [options] <start end | CIDR block>
        -c              print range in CIDR notation
        -d <x>          set the delimiter to the character with ASCII code 'x'
                        where 0 <= x <= 255
        -h              display this help message and exit
        -f <x>          set the format of addresses (hex, dec, or dot)
        -i <x>          set the increment to 'x'
        -e <x.x.x,x.x>  exclude a range from the output, e.g. -e ..4. will
                        not print 192.168.4.[0-255]

        prips --help | --version | --features

Report bugs to Peter Pentchev <roam@ringlet.net>

元々のお題をであるCIDRを入れたらレンジ内のIPアドレスを列挙する、をやってみます。

prips 203.0.113.0/29
203.0.113.0
203.0.113.1
203.0.113.2
203.0.113.3
203.0.113.4
203.0.113.5
203.0.113.6
203.0.113.7

残念ながらCIDR表記指定などのオプションは無いので、末尾に/32を付けたい場合はsedします。

$ prips 203.0.113.0/29 | sed -e 's/$/\/32/g'
203.0.113.0/32
203.0.113.1/32
203.0.113.2/32
203.0.113.3/32
203.0.113.4/32
203.0.113.5/32
203.0.113.6/32
203.0.113.7/32

aggregate

ついでに関連ツールも書いていきます。
aggregateはその名の通りCIDR表記のアドレスリストを集約するツールです。

aggregateのインストール

epelにパッケージがあるのでyumで導入できます。

yum install aggregate

そっち系の方は
yum install aggregate-ios
も便利かもしれません。

ソースコードからコンパイルしたい方はこちらから。
みんな大好きBIND DNSサーバーのISCさんのサーバーから入手できます。
https://ftp.isc.org/isc/aggregate/

aggregate使用例

簡単な例として、先ほどのpripsコマンドで作ったIPアドレス一覧(/32表記)を/29に戻します。

$ prips 203.0.113.0/29 | sed -e 's/$/\/32/g'  | aggregate
aggregate: maximum prefix length permitted will be 32
203.0.113.0/29


/32も含め入力データはCIDR表記でなければいけませんが、サブネットマスク計算などメンドクサイことをパッとやってくれます。

grepcidr

grepcidrはCIDR表記のレンジやIPアドレスについて包含関係を判定するコマンドです。

当時yunazunoさんのブログで知りました。
yunazuno.hatenablog.com

grepcidrのインストール

atomic repoを用いてyumでインストールできます。

# curl -s https://updates.atomicorp.com/installers/atomic | sh
# yum --enablerepo=atomic install grepcidr
===================================================================================================================================
 Package                       アーキテクチャー            バージョン                            リポジトリー                 容量
===================================================================================================================================
インストール中:
 grepcidr                      x86_64                      2.0-1.el7.art                         atomic                       21 k

トランザクションの要約
===================================================================================================================================
インストール  1 パッケージ

grepcidrの使用例

man grepcidrに様々な例が載っています。

somescript | grepcidr -vf whitelist > blacklist
  • v はgrep同様 "含まない"条件指定になるので、この例はスクリプトが出力するIPアドレス(レンジ)リストから許可リストを除外して拒否リストを作っています。
grepcidr "192.168.0.1-192.168.10.13" iplog

このようにCIDR表記ではなく範囲指定で抽出することもできます。

(難点: grep cidrとタイプしてしまいがち)

sort

IPアドレスのソートは以下のsortコマンドオプションが使えます。

sort -n -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4
$ cat sampleIPaddress.list
203.0.113.64
192.0.2.12
198.51.100.230
192.0.2.1
$ cat sampleIPaddress.list | sort -n -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4
192.0.2.1
192.0.2.12
198.51.100.230
203.0.113.64

/32表記でも同じ結果が得られます。

$ cat sampleIPaddress.list
203.0.113.64/32
192.0.2.12/32
198.51.100.230/32
192.0.2.1/32
$ sort -n -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4 sampleIPaddress.list
192.0.2.1/32
192.0.2.12/32
198.51.100.230/32
203.0.113.64/32

まとめ

IPアドレスやCIDRは小数でもない直接扱いにくい形式ですが、先人のみなさまが便利ツールを提供してくださっているので便利にシュッと使っていきたいですね。

Docusaurus v2のコンテンツをCloudflare Pagesで公開する

タイトルの通りです。

参考にしたのはこちら。ほぼこの手順のままですがアップデートされた点もあったので残しておきます。
dev.to

重要なアップデート

一番書きたかったのはここです。

Cloudflare Pagesのフレームワーク選択画面でDocusaurusを認識するようになっているっ...

大まかな流れ

(1)GitHubに空リポジトリを作っておく

(2)手元にDocusaurusをセットアップ

(3)DocusaurusのコンテンツをGitHubにpush

(4)CloudflareでPagesのプロジェクトを作成

(5)build!

(6)サイトのできあがり

成果物はこちらです。
docusaurus-cfpages.pages.dev

(テストとしてDocusaurus初期状態でデプロイしてるのでそのうち消します)

今回の作業ではlocalの作業用ディレクトリ、GitHubリポジトリ名、Cloudflare PagesのURLをすべて docusaurus-cfpages で作成しました。

(1)GitHubに空リポジトリを作っておく

GitHubでPublicリポジトリを作成しておきます。
READMEも無くてよいでしょう。

(2)手元にDocusaurusをセットアップ

以下はLinux環境での手順です。
DocusaurusはNode.jsのLTS版を動作確認対象としています。今回は16.15.0をpyenv(anyenv)環境で使用しました。

nodejsのインストール

anyenv install nodenv
~/.anyenv/bin/anyenv install --init
eval "$(anyenv init -)"
anyenv install nodenv
exec #SHELL -l
nodenv init
eval "$(nodenv init -)"
nodenv install 16.15.0
nodenv global 16.15.0

Docusaurusのインストール

npx create-docusaurus@latest docusaurus-cfpages classic
cd docusaurus-cfpages

vi docusaurus.config.js (urlを設定します)
  url: 'https://docusaurus-cfpages.pages.dev',

(3)DocusaurusのコンテンツをGitHbにpush

git init
git remote add origin git@github.com:w4yh/docusaurus-cfpages.git
git add .
git commit -m "Initial commit"
git branch -M main
git push -u origin main

(4)CloudflareでPagesのプロジェクトを作成

Cloudflare管理画面にログインします。
Pagesはドメイン選択前のトップ階層のサイドバーメニューにあります。

[プロジェクトを作成] をクリックしてウィザードを開始します

リポジトリの選択 の画面でGitHubまたはGitLabのアカウントとリポジトリを指定します
[セットアップの開始] をクリックします

②ビルドとデプロイのセットアップ 画面で以下を指定します。

フレームワークプリセット: Docusaurus
 プルダウンの選択肢の中にDocusaurusがあります。素晴らしい
・ビルドコマンド: npm runbuild
・ビルド出力ディレクトリ: build
環境変数: NODE_VERSION = 16.15.0

[保存してデプロイする] をクリックします

(5)build!

③サイトをデプロイ 画面に進行状況が表示されます。

成功すると"成功しました!"のメッセージとともにデプロイ先のURLが表示されます。
(今回はhttps://docusaurus-cfpages.pages.dev)

(6)サイトのできあがり

デプロイ先URLをクリックして出来栄えを確認します。

一度デプロイに成功すれば、次回以降のpush(merge)の際は自動的に再デプロイされます。


感想

自前サーバーのGitLab Pagesは使ってきましたが、Cloudflare Pagesもとてもお手軽で良いです。
Docusaurus以外にも多様なプリセットが指定可能なので一部のスクショを載せておきます。


GLPI Agent 1.2をAmazon Linux2にインストール

資産管理というか運用管理ツールというか機能豊富なツールであるGLPIがバージョン10に到達しました。
(途中0.9xから9.xへの変更で飛び番しています)

glpi-project.org

これまでもOCS-Inventory NGなどと連携するディスカバリ機能がありましたが10ではNative inventoryが追加されました。
FusionInventoryをforkしたそうで、GLPI10本体のfinal releaseに先駆けてAgentはバージョン1.2まで公開されています。

glpi-project.org

このGLPI Agent 1.2をAmazon Linux 2のインスタンスに導入してみたので手順を残しておきます。

標準インストーラーではNG

perlスクリプトインストーラーが用意されています。まずはこちらを試してみます。

# wget https://github.com/glpi-project/glpi-agent/releases/download/1.2/glpi-agent-1.2-linux-installer.pl

# perl glpi-agent-1.2-linux-installer.pl --install
Not supported linux distribution

...ディストリビューション判定でひっかかりますね...Alma Linuxは行けたのですが。
次の手としてRPMパッケージからのインストールを試みます。

RPMパッケージからインストール

まずは準備として、Perl modulesの依存が多いのでEPELを有効にしてyumからインストール出来るようにしておきます。

# amazon-linux-extras install epel
# yum repolist
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
209 packages excluded due to repository priority protections
repo id                                              repo name                                                           status
amzn2-core/2/x86_64                                  Amazon Linux 2 core repository                                          27,693
amzn2extra-docker/2/x86_64                           Amazon Extras repo for docker                                               56
amzn2extra-epel/2/x86_64                             Amazon Extras repo for epel                                                  1
amzn2extra-kernel-5.10/2/x86_64                      Amazon Extras repo for kernel-5.10                                         143
epel/x86_64                                          Extra Packages for Enterprise Linux 7 - x86_64                      13,542+209
repolist: 41,435

ではRPMをダウンロードしてインストールしていきましょう。

# wget https://github.com/glpi-project/glpi-agent/releases/download/1.2/glpi-agent-1.2-1.noarch.rpm
# yum install glpi-agent-1.2-1.noarch.rpm

Perl modulesが大量にインストールされますが正常にインストールできました。
他のパッケージも同様にインストールしていきます。

# yum install glpi-agent-task-collect-1.2-1.noarch.rpm
# yum install glpi-agent-task-deploy-1.2-1.noarch.rpm
# yum install glpi-agent-cron-1.2-1.noarch.rpm
# yum install glpi-agent-task-network-1.2-1.noarch.rpm

設定

通信先サーバーなどの設定を行います。
tagのところにagentをインストールした機器自身のFQDNを設定します。
ここで設定しているuser, passwordはGLPIサーバー側でbasic認証を設定している場合に必要です。GLPIのログインアカウントではありません。

# diff /etc/glpi-agent/agent.cfg /etc/glpi-agent/agent.cfg.20220422
12c12
< server = http://glpi-server.example.com/
---
> #server = http://server.domain.com/front/inventory.php
16c16
< local = /tmp
---
> #local = /tmp
72c72
< user = glpi
---
> user =
74c74
< password = foobar
---
> password =
95c95
< httpd-trust = 127.0.0.1/32,GLPIサーバーのIPアドレス/32
---
> httpd-trust =
117c117
< tag = amzn2.example.com
---
> tag =

ではAgentを起動してします。

# systemctl enable glpi-agent
# systemctl start glpi-agent
# systemctl status glpi-agent
● glpi-agent.service - GLPI agent
   Loaded: loaded (/usr/lib/systemd/system/glpi-agent.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2022-04-22 07:05:17 UTC; 45min ago
     Docs: man:glpi-agent
 Main PID: 4184 (glpi-agent (tag)
   CGroup: /system.slice/glpi-agent.service
           └─4184 glpi-agent (tag amzn2.example.com): waiting

Apr 22 07:17:15 amzn2.example.com glpi-agent[4207]: running task Inventory
Apr 22 07:17:15 amzn2.example.com glpi-agent[4207]: New inventory from amzn2.example.com-2022-04-22-05-38-59 ....com)
Apr 22 07:17:16 amzn2.example.com glpi-agent[4207]: Inventory saved in /tmp/amzn2.example.com-2022-04-22-05-38-59.xml
Apr 22 07:17:17 amzn2.example.com glpi-agent[4252]: running task RemoteInventory
Apr 22 07:17:17 amzn2.example.com glpi-agent[4184]: target local0: next run: Fri Apr 22 08:11:07 2022 - /tmp
Apr 22 07:35:55 amzn2.example.com glpi-agent[4184]: target server0: server http://glpi-server.example.com/glpi/
Apr 22 07:35:55 amzn2.example.com glpi-agent[4184]: sending contact request to server0
Apr 22 07:35:55 amzn2.example.com glpi-agent[4336]: running task Inventory
Apr 22 07:35:55 amzn2.example.com glpi-agent[4336]: New inventory from amzn2.example.com-2022-04-22-05-38-59 ....com)
Apr 22 07:35:58 amzn2.example.com glpi-agent[4184]: target server0: next run: Sat Apr 23 07:23:46 2022 - http://mgmt...glpi/
Hint: Some lines were ellipsized, use -l to show in full.

動作確認

しばらくするとtarget local0の処理が行われ、インベントリ情報が/tmp以下のファイルに出力されます。

# ls -l /tmp
total 276
-rw-r--r-- 1 root     root     264870 Apr 22 10:01 amzn2.example.com-2022-04-22-05-38-59.xml

さらにtarget server0の処理が行われ、GLPIサーバーに登録が行われます。
GLPIサーバーの画面はこのような内容になります。

GLPI10-Inventory

ソフトウェアとしてRPMパッケージも登録されます。
今回のAmazon Linux 2インスタンスは起動直後のVanilla状態ですが、DBサービスを起動した場合は作成したデータベースの情報も登録されます。

Next


今後はリモートコマンドの活用や登録情報のメンテナンスをやってみようと思います。

2021年振り返り

アドベントカレンダーも書き終えたので今年の振り返りエントリーです。

転職

初めての転職を実績解除しました。
オンプレベースなデータセンター運用事業からAWSを中心としたクラウドCIerになりました。AWSの知識が何年何周も遅れているので今年はインプットに注力した1年でした。それでもまだまだ学ぶことが多くて大変です。
大きめのSIerからベンチャーな会社に移ったのでいろいろと違いもあり面白楽しいです。

帯状疱疹

夏の終わりから長いことのど風邪をひいてました。体力落ちた状態で流れが良くなかったのか秋に帯状疱疹を発症してしまいました。
皮膚の発疹はほとんどなかったのですが、胸痛がひどく寝付けない感じで一ヶ月くらい足をバタバタさせる生活でした。ほぼ2ヶ月棒に振ってしまいもったいなかったです。50歳以上になるとワクチン受けられるらしいですが、心身の調子を落としすぎずに過ごすことの大事さをあらためて感じました。

今年読んで良かった本

転職してAWSを学び直しているのでいろいろと読み直していますが即戦力で役に立ったものを挙げておきます。

AWSではじめるインフラ構築入門 安全で堅牢な本番環境のつくり方

www.shoeisha.co.jp

まずはこの本に沿って手を動かすのが分かりやすかったです。
自分の感覚で作業してしまうと「先にセキュリティグループ作っておかないとここで選択肢に出てこないのかー」といったちょっとしたことで引っかかってしまうので、全体の流れを見通した手順をなぞるのは理解がスムーズでとても良く何度も見返している一冊です。
自分の場合はこの本でやった内容をCloudShell上のaws cliでの手順に落とし込むことでかなり理解が深まりました。

Amazon Web Servicesインフラサービス活用大全 システム構築/自動化、データストア、高信頼化

book.impress.co.jp

自動化しないとやる気がしない病なので読みました。オンプレの時代に使っていたitamaeやStackStormとはまた異なるAWSで使える自動化手段をいろいろと学ぶのにとても良いと思います。CloudFormationはもちろんカバーする範囲がとても広いので、自分が使っているサービスの部分から読んでいくと良いかと思います。目の前のちっさい作業を自動化するのではなく最終的に目指す設計を示してゴールを目指すという各章の流れも分かりやすくて良いと思います。

AWSの薄い本 IAMのマニアックな話

AWSの薄い本Ⅱ アカウントセキュリティのベーシックセオリー

takuros.booth.pm
takuros.booth.pm

IAM自体は知っていましたがイマドキの機能範囲やベストプラクティスのようなものは全く分かっていなかったので2冊続けて読みました。このテーマでここまで詳しくたっぷりとまとまった本として読めるのはとてもありがたかったです。長くAWSを遣い続けている方は何年もかけて差分更新で知識を得て貯めてこられたと思いますが、一気に追いつきたいという時にまとまっている情報って意外と無いんですよ。

Infrastructure Monitoring with Amazon CloudWatch: Effectively monitor your AWS infrastructure to optimize resource allocation, detect anomalies, and set automated actions

www.kinokuniya.co.jp

上で挙げたのIAMもですがこうした縁の下の力持ち的サービスはなかなかまとまった情報を得るのが難しい気がします。こちらはCloudWatchの本ですがAWSの他のサービスを監視対象とする場合や連携させる場合についてマネジメントコンソールのスクショを豊富に挟みながら丁寧に解説してくれます。コンソールは頻繁にデザイン変わりますしスクショは英語なのでそのまま使えるわけでもないですが、CloudWatchでどこまでできるのか、を知ることのできるかなり良い本だと思います。

あとはSSMの本が欲しいです。公式の1578ページある英語PDFを読む気がするかと言うとちょっと私の力では...

直近の学びのテーマ

レジリエンスエンジニアリングについては引き続き調べ学びを続けています。そこから派生して、直近ではポストモーテムの実施方法について学んでいます。

今になって Tugboat.GTD のMeeting機能がよかったんじゃないかと思ったり。Etsyさんの morgue (https://github.com/etsy/morgue) はめっちゃ良さそうですがアーカイブされてて開発終了のようだったり....

やはり Jeli\.io に注目ですかね。予算欲しいです..
www.jeli.io

Jeliさんは先日Post Incidentの振り返り実施ガイドとして61ページの資料"Howie"を公開されました。"気構え"のような事にも多々触れていて、憂鬱になりがちなインシデント対応~振り返りを的確に行うための留意事項がまとまっています。こうしてまとまった形にしていただけるとチームでの共有もしやすくてありがたいですね。
www.jeli.io

結び

リモート登壇が苦手、というか設備的に弱めなのもありついに今年は登壇無しでおわってしまいました。インプット重視の一年だったからとも言えますが。
来年は発信していけるように頑張ります。まずはo11ycon2022のCFPに出そうかな...40分は無理ですが...

あと帯状疱疹に懲りたので運動と食事に留意した状態を継続的に維持していくことも頑張ります。

Talisman

gitで機微情報をアップしてしまって大変、という話は数多ありますがそういった事故を防いでくれるツールがTalismanです。
githookとして動作し、認証情報などが含まれる場合に警告を表示して中断します。開発元はあのThoughtworksです。

https://thoughtworks.github.io/talisman/

2019/10/02にバージョン 1.0.0に到達しました。
自分は個別のローカルレポジトリごとに導入しています。

curl https://thoughtworks.github.io/talisman/install.sh > ~/install-talisman.sh
chmod +x ~/install-talisman.sh
cd my-git-project
~/install-talisman.sh

以上でgit hookとしてTalismanが導入されます。グローバルに共通して導入する場合はGitHubのREADMEを参照してください。
検知ルールをカスタマイズする場合は、 https://github.com/thoughtworks/talisman/blob/master/detector/ 以下を編集してください。例えばファイル名や拡張子に関するルールは filename_detector.go に記述があります。

動作を見てみましょう。
ここでは拡張子 .pem の(空)ファイルを追加してpushを行ってみます。

$ git commit -m "add hoge.pem"
[master d1e81ab] add hoge.pem
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hoge.pem
$ git push -u foo
The following errors were detected in hoge.pem
         The file name "hoge.pem" failed checks against the pattern ^.+\.pem$

error: failed to push some refs to 'git@some:where/far.git'

検知されてpushはfailしました。
拡張子だけでなく、鍵ファイルの内容など様々なdetectorが用意されています。
githookで手前で防ぐことができ便利ですので、興味のある方はお試しください。