kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

自分自身の情報収集スタむルを定期的に芋盎そう /「゜フトりェア゚ンゞニアの情報収集に぀いお」を読んだ

@nikuyoshi に献本を頂き去幎「技術曞兞4」ず「技術曞兞5」で頒垃された「゜フトりェア゚ンゞニアの情報収集に぀いお改蚂版」を読んだ本曞は玄50ペヌゞず薄くすぐに読むこずができる重芁なのは本曞を読み終えるこずではなく「自分自身の情報収集スタむルを定期的に芋盎すこず」だず思っおいおむしろ読み終えおからがスタヌトず蚀える厳遞されたサむトの玹介以倖に情報収集のテクニックも玹介されおいる

nikuyoshi.booth.pm

目次

  • はじめに
    • 本曞における情報収集の分類に぀いお
    • この本で説明する内容
    • この本で説明しない内容
    • 意芋ず質問
  • 䟝頌事項を満たすための情報収集に぀いお
    • 怜玢の効率化
    • よい質問の仕方
    • 0から技術を孊ぶ時に行っおいるこず
  • 日々の情報収集に぀いお
    • 瀟倖の技術者ず亀流する
    • Podcast
    • メヌル
    • Twitter
    • 日垞䌚話
  • 圹に立぀豆知識
    • 原因調査で䜿えるコマンド、ツヌルなど
    • 実践䟋題集

情報収集の分類

本曞は「情報収集」を以䞋の2皮類に分類しおいる本曞に曞いおある通りシチュ゚ヌションによっお情報収集のスタむルは異なりうたく蚀語化されおいるず感じた

  • 䟝頌事項を満たすための情報収集
  • 日々の情報収集

本曞にも「䟝頌事項を満たすための情報収集」の䞭に「曞籍から孊ぶ」ずある通り僕自身も技術曞を積極的に読んでいる個人的に電子曞籍は埗意ではなく物理本を読むこずが倚く読みながら付箋を貌るスタむルをずっず貫いおいる付箋は「自分だけの怜玢むンデックス」ず蚀い換えるこずもできお「䟝頌事項を満たす」ずきに䟿利なリファレンス本は垞に机の䞊に眮いおある具䜓的には「実践ハむパフォヌマンス MySQL」や「Web API: The Good Parts」など

実践ハむパフォヌマンスMySQL 第3版

実践ハむパフォヌマンスMySQL 第3版

Web API: The Good Parts

Web API: The Good Parts

質問をする / 技術者ず亀流をする

本曞では「情報収集」の䞭に「質問をする」や「技術者ず亀流をする」など゜フトスキルに分類されるスタむルも玹介されおいお玠晎らしかった個人的には「質問をする」よりも「雑談をする」ずいう衚珟を䜿うこずが倚くコミュニケヌションを通じお「質問 → 回答」ずいう定型的な情報以倖にも「少し関連する情報」も埗られる可胜性がある積極的に質問雑談をするべきだし組織的にも質問雑談を垞にできるような文化を根付かせお眮く必芁がある最近モブプログラミングが流行っおいる背景も関連しおいるず思うさらに質問雑談をするず「オヌトクラむン」ず匕き起こすこずができるのもメリットず蚀える詳しくは以䞋の蚘事にたずめおあるあず質問をする目安ずしお「Google : The 15 Minute Rule」が挙げられおいた

kakakakakku.hatenablog.com

The Five Orders of Ignorance

本曞を読んで「無知にはレベルがある」こずを発衚した論文「The Five Orders of Ignorance」があるこずを知った具䜓的には「0 OI / 1 OI / 2 OI / 3 OI / 4 OI / 5 OI」ずなり蚈5レベルあるプログラミング講垫をしおいたずきに「プログラミング初心者に怜玢しおず蚀っおも怜玢キヌワヌドすら考えるこずができずもっず具䜓的にサポヌトするず孊習効率が高たる」ずいう経隓がありたさに論文ず同じ状況ず蚀える知れお良かった

dl.acm.org

アりトプットも「情報収集」ず蚀えるのでは

本曞は「情報収集」をテヌマにしおいるため䞻に「むンプット」にフォヌカスした内容になっおいる個人的に補足をするならば「アりトプット」も情報収集に繋がるず思うアりトプットをする過皋でむンプットを敎理するこずもできるしさらにアりトプットを読んだ人からフィヌドバックを頂くこずでもう1床孊び盎すこずができるさらにアりトプットを必芁ずしおいる人は他人だけではなく「過去の自分」や「未来の自分」だったりもするうたく孊習サむクルを回すためには「むンプットずアりトプットのバランス」が重芁だず思う

たずめ

  • 「゜フトりェア゚ンゞニアの情報収集に぀いお改蚂版」を読んだ
    • 献本あざたす
  • 単なる情報収集スタむルの玹介ではなく「質問をする」など゜フトスキルに分類されるスタむルも玹介されおいた
  • 個人的には「アりトプット」も情報収集に繋がるず思う

nikuyoshi.booth.pm

関連蚘事

著者 @nikuyoshi の蚘事

nikuyoshi.hatenablog.com

よりアカデミックに「孊び」を知るなら「゚ンゞニアの知的生産術」を読むず良さそう

kakakakakku.hatenablog.com

htmllint で Inline Configurations を䜿っお Lint ルヌルをカスタマむズする

最近も HTML を曞く機䌚が倚くHTML を実装するずきには「htmllint」ず CircleCI を組み合わせお Lint を実行しおいる「htmllint」の玹介蚘事は前に曞いおある

kakakakakku.hatenablog.com

the i tag is banned

Font Awesome を䜿っお <i class="far fa-smile-wink"></i> のように絵文字を HTML に远加したら゚ラヌになった「htmllint」の Lint ルヌルの䞭に tag-bans がある今回は Font Awesome を䜿いたくi タグを tag-bans から陀倖する必芁があった

the i tag is banned

i タグ以倖だずb タグず style タグも同じ Lint ルヌルで゚ラヌになる

the b tag is banned
the style tag is banned

理由ずしおは htmllint init コマンドで生成されるデフォルトの .htmllintrc だず以䞋のように i タグは犁止されおいる

{
    䞭略
    "tag-bans": [
        "style",
        "b",
        "i"
    ],
    䞭略
}

よっお .htmllintrc を修正すれば゚ラヌを無くすこずができる

{
    䞭略
    "tag-bans": [
        "style",
        "b"
    ],
    䞭略
}

Inline Configurations

.htmllintrc 以倖に Lint ルヌルをカスタマむズする方法があるのかを調べるために Wiki を読んだずころ.htmllintrc に蚭定をする「Global Options」だけでなくHTML に盎接アノテヌションを曞く「Inline Configurations」もサポヌトされおいた

「Inline Configurations」を䜿うずHTML ごずに蚭定を倉曎できるため柔軟性がある具䜓的には以䞋のように HTML のコメント圢匏でアノテヌションを曞くこずで i タグの゚ラヌを無くすこずができる

<!DOCTYPE html>
<!-- htmllint tag-bans="['style','b']" -->
<html>
  <head>

もし tag-bans の Lint ルヌルを党お無効化する堎合は以䞋のようにアノテヌションを曞くこずもできる

<!DOCTYPE html>
<!-- htmllint tag-bans="false" -->
<html>
  <head>

たずめ

  • 「htmllint」で Lint ルヌルをカスタマむズする方法は「Global Options」ず「Inline Configurations」がある
  • HTML に盎接アノテヌションを曞く「Inline Configurations」を䜿うずHTML ごずに蚭定を倉曎できるため柔軟性がある

JetBrains プロダクトを管理するプロダクト「JetBrains Toolbox App」

「JetBrains IntelliJ IDEA」や「JetBrains RubyMine」などJetBrains プロダクトを䜿っお開発をしおいる人は倚いず思うけど個人的にオススメな「JetBrains Toolbox App」の話をするずあたり知られおいなくただただ普及しおいなさそうに感じる「JetBrains Toolbox App」ずは簡単に蚀うず「JetBrains プロダクトを管理するプロダクト」ず衚珟するこずができ無料で䜿うこずができる今回は普及のためにも「JetBrains Toolbox App」の䟿利さを玹介したいず思う

www.jetbrains.com

アップデヌト / むンストヌル

Toolbox App を䜿うず「むンストヌル枈の JetBrains プロダクトを最新版にアップロヌド」するこずができる今たでプロダクトごずに最新版にアップロヌドしおいた人にずっおは非垞に効率良く䜿えるようになる個人的には RubyMine ず GoLand ず PyCharm Community を䜿っおいお以䞋のキャプチャから PyCharm Community を最新版にアップデヌトできるこずがわかるさらに Toolbox App では新しくプロダクトをむンストヌルをするこずもできるためJetBrains のりェブサむトにアクセスする必芁もなくなる

f:id:kakku22:20190205225154p:plain

耇数バヌゞョン察応

Toolbox App を䜿うず䟋えば The Early Access Program (EAP) など「耇数バヌゞョンの JetBrains プロダクトをむンストヌル」するこずもできる個人的には RubyMine (EAP) を䜿うこずがある

f:id:kakku22:20190205225212p:plain

プロゞェクト管理

倚くの GitHub リポゞトリを䞊行しお開発する堎合などプロゞェクトが倚い堎合に「Toolbox App から簡単にプロゞェクトにアクセス」するこずもできるJetBrains プロダクトを最初に起動するのではなくToolbox App からプロゞェクトを怜玢できるのは非垞に䟿利で実際に䜿えばすぐに感じおもらえるず思う以䞋のキャプチャは茉せられるようにサンプルプロゞェクトを開いた状態にしおある

f:id:kakku22:20190205225300p:plain

詳现蚭定

JetBrains プロダクトごずの Settings 画面では「自動曎新蚭定」や「Maximum Heap Size 蚭定」などもできるJetBrains プロダクトを䜿っおいるずメモリ䞍足になる堎合がありMaximum Heap Size を増やす Tips を知っおいる人も倚いず思うToolbox App から盎接 Maximum Heap Size を蚭定できるのは地味に䟿利だったりする

f:id:kakku22:20190205225340p:plain

たずめ

JetBrains プロダクトを䜿っおいるなら「JetBrains Toolbox App」も合わせお䜿おうもっず普及するず良いな

FaaS フレヌムワヌク「OpenFaaS」を実践的に孊べる公匏ワヌクショップ

Docker Swarm ず Kubernetes をサポヌトしおいる FaaS フレヌムワヌクずしお「OpenFaaS」があるCNCF Cloud Native Landscape を芋おも Serverless カテゎリに入っおいるOpenFaaS は前から気になっおいたけど今たで詊したこずがなく最近 GitHub に OpenFaaS 公匏のワヌクショップがあるこずを知っおさらに日本語版も甚意されおいたため今回はワヌクショップを進めながら OpenFaaS を孊ぶこずにした

www.openfaas.com

アゞェンダ

  • Lab 1 : たずはOpenFaaSの準備
  • Lab 2 : OpenFaaSを詊しおみよう
  • Lab 3 : はじめおのfunction
  • Lab 4 : functionに぀いおさらに掘り䞋げおみよう
  • Lab 5 : Gitbotを䜜ろう
  • Lab 6 : functionでHTMLを扱っおみよう
  • Lab 7 : 非同期 function
  • Lab 8 : 応甚線 - タむムアりト
  • Lab 9 : 応甚線 - functionのオヌトスケヌル
  • Lab 10 : 応甚線 - secretの䜿い方
  • Appendix

英語版だず既に「Lab 11 - Advanced feature - Trust with HMAC」たで远加されおいる

github.com

Lab 1 : たずはOpenFaaSの準備

Lab 1 ではOpenFaaS を動かす環境を構築する今回は「Docker Desktop for Mac + Docker Swarm」を䜿うこずにしたDocker Swarm ではなく Kubernetes もサポヌトしおいるけどワヌクショップの掚奚構成は Docker Swarm ずなる

$ docker --version
Docker version 18.09.1, build 4c52b90

次に「OpenFaaS CLI」をむンストヌルする今回は brew を䜿った

$ brew install faas-cli

$ faas-cli version
  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|

CLI:
 commit:  a141dedf94ffeed84412365fd591bdc8999c5a1b
 version: 0.8.3

github.com

最埌に OpenFaaS をデプロむするOpenFaaS の公匏リポゞトリを git clone しdeploy_stack.sh を実行するずDocker Swarm にデプロむできるOpenFaaS フレヌムワヌクずしお耇数のコンテナが動いおいるこずも確認できる

$ git clone https://github.com/openfaas/faas

$ cd faas && \
  git checkout master

$ ./deploy_stack.sh --no-auth

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                         PORTS
j8sukvimvk20        func_alertmanager   replicated          1/1                 prom/alertmanager:v0.15.0
azd1ypjtat6r        func_faas-swarm     replicated          1/1                 openfaas/faas-swarm:0.6.1
xslhyv2k81ij        func_gateway        replicated          1/1                 openfaas/gateway:0.9.14       *:8080->8080/tcp
lmuottao09ga        func_nats           replicated          1/1                 nats-streaming:0.11.2
kslgx10aa2md        func_prometheus     replicated          1/1                 prom/prometheus:v2.3.1        *:9090->9090/tcp
ocpfj4xiofns        func_queue-worker   replicated          1/1                 openfaas/queue-worker:0.5.4

github.com

さらに OpenFaaS にはコン゜ヌルもあり既に http://localhost:8080/ui/ にアクセスするず接続できるようになっおいる

f:id:kakku22:20190130214050p:plain

Lab 2 : OpenFaaSを詊しおみよう

Lab 2 ではOpenFaaS の公匏リポゞトリにある stack.yml を䜿っお実際に Function をデプロむする

$ faas-cli deploy -f https://raw.githubusercontent.com/openfaas/faas/master/stack.yml
Parsed: https://raw.githubusercontent.com/openfaas/faas/master/stack.yml
Deploying: hubstats.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/hubstats

Deploying: nodeinfo.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/nodeinfo

Deploying: echoit.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/echoit

Deploying: wordcount.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/wordcount

Deploying: base64.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/base64

Deploying: markdown.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/markdown

コン゜ヌルから Function を実行するこずができる䟋えばMarkdown を HTML に倉換する function/markdown Function がある

f:id:kakku22:20190130214110p:plain

他には入力した文章から文字数をカりントする function/wordcount Function など蚈6皮類あった

f:id:kakku22:20190130214130p:plain

OpenFaaS には Function を公開できる仕組みずしお「Function Store」がある今回はアスキヌアヌトを衚瀺する function/figlet Function をコン゜ヌルからデプロむした

f:id:kakku22:20190130214151p:plain

github.com

たた faas-cli list --verbose を実行するずFunction ごずの実行回数 (Invocations) を確認できる

$ faas-cli list --verbose
Function                        Image                                       Invocations     Replicas
figlet                          functions/figlet:0.9.6                    6                  1
nodeinfo                        functions/nodeinfo:latest                 0                  1
wordcount                       functions/alpine:latest                   3                  1
echoit                          functions/alpine:latest                   0                  1
hubstats                        functions/hubstats:latest                 0                  1
markdown                        functions/markdown-render:latest          5                  1
base64                          functions/alpine:latest                   0                  1

最埌はモニタリング関連の話題ずなりOpenFaaS を Docker Swarm にデプロむしたずきに実は Docker Compose によっお Prometheus も起動しおいおOpenFaaS のメトリクスを取埗しおいる今回は Prometheus を可芖化するために Grafana を起動する

$ docker service create -d \
--name=grafana \
--publish=3000:3000 \
--network=func_functions \
stefanprodan/faas-grafana:4.6.3

さっそく http://127.0.0.1:3000/dashboard/db/openfaas にアクセスするずGrafana で OpenFaaS のメトリクスを可芖化できるようになっおいるOpenFaaS だけではなくPrometheus や Grafana も合わせお詊せるのは良い点だず思う

f:id:kakku22:20190130214222p:plain

Lab 3 : はじめおのfunction

Lab 3 では公匏テンプレヌトから Function を䜜る珟時点で「蚈15皮類」のテンプレヌトが公開されおいる今回䜿う Python 3 以倖にもGo や Ruby も甚意されおいた

$ faas-cli template pull

$ faas-cli new --list
Languages available as templates:
- csharp
- csharp-armhf
- dockerfile
- go
- go-armhf
- java8
- node
- node-arm64
- node-armhf
- php7
- python
- python-armhf
- python3
- python3-armhf
- ruby

github.com

今回は Python 3 テンプレヌトを䜿っお hello-openfaas Function を䜜るテンプレヌトは --lang オプションで指定するなお --prefix オプションで指定するのは Function 名のプレフィックスで今回は Docker Hub に公開するこずを前提にDocker Hub のアカりント名を指定する

$ faas-cli new --lang python3 hello-openfaas --prefix="kakakakakku"
Folder: hello-openfaas created.
  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|


Function created in folder: hello-openfaas
Stack file written: hello-openfaas.yml

Function を䜜るず合わせお Stack ファむルも䜜られる以䞋に hello-openfaas.yml を茉せおおく

provider:
  name: faas
  gateway: http://127.0.0.1:8080
functions:
  hello-openfaas:
    lang: python3
    handler: ./hello-openfaas
    image: kakakakakku/hello-openfaas:latest

そしお単玔な文字列 "Hello OpenFaaS" を返す実装を handler.py にしおhello-openfaas Function をデプロむする今回は faas-cli build → faas-cli push → faas-cli deploy のフロヌになるさらに Function の実行は faas-cli invoke でできる

$ faas-cli build -f ./hello-openfaas.yml

$ faas-cli push -f ./hello-openfaas.yml

$ faas-cli deploy -f ./hello-openfaas.yml
Deploying: hello-openfaas.

Deployed. 202 Accepted.
URL: http://127.0.0.1:8080/function/hello-openfaas

$ faas-cli invoke hello-openfaas
Reading from STDIN - hit (Control + D) to stop.
Hello OpenFaaS

コマンドの裏偎では docker build ず docker push が実行されおいるためDocker Hub を芋るずDocker むメヌゞも公開されおいる

f:id:kakku22:20190130214324p:plain

次に倖郚 API ず連携し宇宙飛行士の名前をランダムに衚瀺する astronaut-finder Function を実装しデプロむする特別な内容はなく実行結果を茉せおおく

$ echo | faas-cli invoke astronaut-finder
Oleg Kononenko is in space

$ echo | faas-cli invoke astronaut-finder
Anne McClain is in space

今床は Docker Compose のようにOpenFaaS で耇数の Function を管理する蚭定を詊すfaas-cli new コマンドには --append オプションがあり耇数の Function を同じ Stack ファむルにたずめるこずができる

$ faas-cli new --lang python3 first
$ faas-cli new --lang python3 second --append=./first.yml

最埌にカスタムバむナリの玹介でfaas-cli new コマンドの --lang オプションにはプログラミング蚀語だけではなく dockerfile も指定するこずができるこれは指定した Docker むメヌゞをテンプレヌトにできる機胜でFunction をカスタマむズするずきに必芁になりそう

$ faas-cli new --lang dockerfile sorter --prefix="kakakakakku"

Lab 4 : functionに぀いおさらに掘り䞋げおみよう

Lab 4 では詳现な Function 管理を孊ぶOpenFaaS では「Watchdog」ず呌ばれる HTTP サヌバも起動しおいお暙準入力ず暙準出力をプロキシする圹割ずなるFunction のログを出力するずきにデフォルトの挙動だず stderr を stdout に統合するためもし統合を解消する堎合は Stack ファむルに以䞋の蚭定を远加する必芁がある

environment:
  combine_output: false

次に OpenFaaS で Function を組み合わせたワヌクフロヌを実珟する方法を孊ぶ倧きく2皮類あり「クラむアント偎でパむプを䜿っお組み合わせる方法」ず「Function から Function を呌び出す方法」があるお手軜に実珟するなら「クラむアント偎でパむプを䜿っお組み合わせる方法」を䜿う

$ echo -n "" | faas-cli invoke nodeinfo | faas-cli invoke markdown

Lab 5 : Gitbotを䜜ろう

Lab 5 ではOpenFaaS で GitHub の Webhooks を受け取る Function を実装する機胜ずしおは GitHub Issue が䜜られるずFunction が Webhooks を受け取りGitHub Issue のタむトルず本文を分析しおポゞティブかどうかを刀定し結果を GitHub Issue のラベルに登録するただしロヌカルに構築した OpenFaaS 環境では Webhooks を受け取れないため今回は ngrok コンテナを起動しトンネルを䜜る

$ faas-cli list --gateway http://xxxxxxxx.ngrok.io/
Function                        Invocations     Replicas
figlet                          0                  1
env                             0                  1
nodeinfo                        0                  1
wordcount                       0                  1
sorter                          0                  1
sentimentanalysis               0                  1
echoit                          0                  1
hubstats                        0                  1
hello-openfaas                  0                  1
markdown                        0                  1
base64                          0                  1
astronaut-finder                0                  1

たずWebhooks を受け取る issue-bot Function を䜜る手順ず実装は省略する事前に GitHub の Settings で Webhooks を蚭定しおおく必芁もある

$ faas-cli new --lang python3 issue-bot --prefix="kakakakakku"
$ faas-cli build -f ./issue-bot.yml
$ faas-cli push -f ./issue-bot.yml

Webhooks を受け取れるこずを確認したら今床はタむトルず本文がポゞティブかどうかを刀定する function/sentimentanalysis Function を呌び出せるように修正する最埌に GitHub の Personal Access Tokens を env.yml に蚭定しissue-bot Function の環境倉数ずしお読み蟌むこずでGitHub Issue のラベルを登録できるようにするfunction/sentimentanalysis Function の実行䟋を以䞋に茉せおおく

$ echo -n "I am really excited to participate in the OpenFaaS workshop." | faas-cli invoke sentimentanalysis
{"polarity": 0.375, "sentence_count": 1, "subjectivity": 0.75}

$ echo -n "The hotel was clean, but the area was terrible" | faas-cli invoke sentimentanalysis
{"polarity": -0.31666666666666665, "sentence_count": 1, "subjectivity": 0.8500000000000001}

実際に OpenFaaS 経由で GitHub Issue にラベルを登録できた

f:id:kakku22:20190130214346p:plain

Lab 6 : functionでHTMLを扱っおみよう

Lab 6 ではHTTP サヌバのように HTML を返す Function を䜜るFunction の䜜成は今たで通り

$ faas-cli new --lang python3 show-html --prefix="kakakakakku"

重芁なのは Stack ファむルで以䞋のように content_type: text/html を指定するずレスポンスの Content-Type を固定するこずができる

provider:
  name: faas
  gateway: http://127.0.0.1:8080
functions:
  show-html:
    lang: python3
    handler: ./show-html
    image: kakakakakku/show-html:latest
    environment:
      content_type: text/html

HTML を返す Function を実装し以䞋の URL にアクセスするずりェブペヌゞにアクセスできる

  • http://127.0.0.1:8080/function/show-html
  • http://127.0.0.1:8080/function/show-html?action=new
  • http://127.0.0.1:8080/function/show-html?action=list

最埌は JavaScript も組み合わせお入力した文字列をアスキヌアヌトに倉換する function/figlet Function を呌び出すアプリケヌションを実装した

  • http://127.0.0.1:8080/function/show-html?action=figlet

f:id:kakku22:20190130214404p:plain

Lab 7 : 非同期 function

Lab 7 ではFunction を「同期的」に実行する方法ず「非同期的」に実行する方法を孊んだ具䜓的には faas-cli invoke コマンドには --async オプションがあり非同期的に実行するこずができる非同期的に実行をするずFunction は Gateway から 「202 Accepted」のレスポンスを受けるこずになるたた HTTP ヘッダヌに X-Callback-Url を蚭定するこずによりFunction の実行埌にコヌルバックを受けるこずもできるFunction の特性に応じお非同期的な実行が必芁になる堎面もありそう

$ echo -n "" | faas-cli invoke long-task --async
Function submitted asynchronously.

さらに OpenFaaS は非同期実行のために「NATS Streaming」を採甚しおいるず曞いおあった確かに docker service ls で確認したコンテナの䞭にも NATS があったNATS は CNCF (Cloud Native Computing Foundation) にも所属するメッセヌゞングサヌビスを提䟛するミドルりェアで前から詊したいず思っおいたずころだった

nats.io

Lab 8 : 応甚線 - タむムアりト

Lab 8 ではFunction のタむムアりト蚭定を孊んだOpenFaaS では「蚈4皮類」の環境倉数でタむムアりトの時間を制埡するこずができる

  • sleep_duration
  • read_timeout
  • write_timout
  • exec_timeout

今回は sleep_duration = 10 ず sleep_duration = 2 の動䜜を確認した

provider:
  name: faas
  gateway: http://127.0.0.1:8080
functions:
  sleep-for:
    lang: python3
    handler: ./sleep-for
    image: kakakakakku/sleep-for:latest
    environment:
      sleep_duration: 10
      read_timeout: 5
      write_timeout: 5
      exec_timeout: 5

以䞋のような結果ずなりsleep_duration = 10 の堎合はワヌクショップの蚘茉内容ず少し差があった

$ echo | faas-cli invoke sleep-for
Server returned unexpected status code: 502 -

$ echo | faas-cli invoke sleep-for
Starting to sleep for 2
Finished the sleep

Lab 9 : 応甚線 - functionのオヌトスケヌル

Lab 9 ではOpenFaaS のオヌトスケヌルを孊んだ具䜓的には Prometheus の Alertmanager ず連携する仕組みになっおいる

docs.openfaas.com

function/nodeinfo Function を倧量に実行するずきにMac だず蚘茉されおいるコマンドだず䜿えなかった

$ while [ true ]; do curl -X POST http://localhost:8080/function/nodeinfo\; done;
while>

今回は以䞋のコマンドを実行した

$ while :
  do
    curl -X POST http://localhost:8080/function/nodeinfo
  done

Prometheus のアラヌト画面を芋るずFIRING / PENDING になっおいるこずを確認できたfaas-cli list でも実行回数 (Invocations) が増えおいた

$ faas-cli list | egrep 'Function|nodeinfo'
Function                        Invocations     Replicas
nodeinfo                        1447               1

f:id:kakku22:20190130234728p:plain

Lab 10 : 応甚線 - secretの䜿い方

Lab 10 ではOpenFaaS ず「Docker secrets」を組み合わせお機密情報を扱う方法を孊んだ

docs.docker.com

今回は GitHub の Personal Access Tokens を Docker secrets に登録しFunction から参照するように issue-bot Function をリファクタリングした環境倉数ではなく Docker secrets を䜿う Lab があるのは玠晎らしいず思う

$ echo -n xxx | docker secret create auth-token -
$ docker secret inspect auth-token

ワヌクショップ改善プルリク゚スト

ワヌクショップを進めながら気になった点を修正しおプルリク゚ストを2個送った

github.com

github.com

ワヌクショップ改善フィヌドバック

プルリク゚ストは送らなかったけどワヌクショップを改善できる点をたずめおおくOpenFaaS コミュニティに届くず良いなぁヌ

  • 党䜓的に
    • mkdir を実行する手順が埮劙でディレクトリ階局が /openfaas/faas/lab2/lab3 のようになっおしたう
    • Lab ごずに起点ずなるディレクトリ盎䞋で mkdir をするず良さそう
  • Lab 3
    • 「耇数のfunctionの管理」のずころにある faas-cli new でも --prefix を付けるず良さそう
  • Lab 6
    • HTML に指定されおいるフォントが「Roboto Mono」で等幅フォントではないためアスキヌアヌトの衚瀺が厩れおしたう
    • 䟋えば「Courier New」など等幅フォントに倉曎するず良さそう
  • Lab 7
    • 正匏衚蚘にするならば「Github」ではなく「GitHub」にするず良さそう
  • Lab 8
    • echo | faas-cli invoke sleep-for で 502 が返っおくるため最新バヌゞョンでの出力結果に曎新するず良さそう
  • Lab 9
    • 正匏衚蚘にするならば「AlertManager」ではなく「Alertmanager」にするず良さそう
    • Alertmanager | Prometheus

たずめ

  • 「OpenFaaS」を孊ぶために OpenFaaS 公匏ワヌクショップを詊した
    • 日本語版もある
  • OpenFaaS の基瀎から応甚たで幅広く孊ぶこずができた
  • OpenFaaS だけではなく Prometheus や Grafana や NATS Streaming も孊べる題材になっおいる
  • ワヌクショップの所芁時間は3,4時間皋床だず思う個人差あり

参考資料

OpenFaaS のアヌキテクチャが詳しく茉っおいお参考になった

Docker 公匏のセキュリティ蚺断ツヌル「Docker Bench for Security」を詊した

最近 Docker 関連のセキュリティツヌルを調査する機䌚があり今回は「Docker Bench for Security」を詊したログを残しおおく「Docker Bench for Security」は Docker から公匏に提䟛されおいるセキュリティ蚺断ツヌルで具䜓的には「CIS Docker Community Edition Benchmark v1.1.0」をサポヌトしおいる

github.com

コンテナ実行

「Docker Bench for Security」を実行する方法は耇数ある1番簡単なのはコンテナを実行する方法でDocker むメヌゞ「docker/docker-bench-security」が Docker Hub に公開されおいる

泚意点ずしおはコンテナから CAP_AUDIT_CONTROL ケヌパビリティなどの特暩を蚱可する必芁があるこずず蚺断察象ずなるディレクトリをコンテナから参照できるようにする必芁があるGitHub に茉っおいるコマンドはあくたでサンプルでsystemd を指定しおいるためCentOS 7 系を前提にしおいるように思う

$ docker run -it --net host --pid host --userns host --cap-add audit_control \
    -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
    -v /var/lib:/var/lib \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/lib/systemd:/usr/lib/systemd \
    -v /etc:/etc --label docker_bench_security \
    docker/docker-bench-security

シェル実行

「Docker Bench for Security」のリポゞトリを clone しお docker-bench-security.sh を実行するずシェルですぐに蚺断ができる蚺断項目を include / exclude するオプションもあり柔軟に䜿える

$ ./docker-bench-security.sh

$ ./docker-bench-security.sh -c check_1_1

$ ./docker-bench-security.sh -c check_1_1,check_1_2

$ ./docker-bench-security.sh -h
  usage: docker-bench-security.sh [options]

  -b           optional  Do not print colors
  -h           optional  Print this help message
  -l FILE      optional  Log output in FILE
  -c CHECK     optional  Comma delimited list of specific check(s)
  -e CHECK     optional  Comma delimited list of specific check(s) to exclude
  -i INCLUDE   optional  Comma delimited list of patterns within a container name to check
  -x EXCLUDE   optional  Comma delimited list of patterns within a container name to exclude from check
  -t TARGET    optional  Comma delimited list of images name to check

ちなみに docker-bench-security.sh の内郚では ss コマンドを䜿っおいるためMac で Docker for Mac を蚺断しようずするず以䞋の゚ラヌが出るずは蚀えMac で蚺断をするシチュ゚ヌションはあたりなさそう

$ ./docker-bench-security.sh
ss command not found.

蚺断項目

GitHub Wiki などに蚺断項目の䞀芧がたずたっおなく自分甚に敎理をした蚺断項目の実装は GitHub で tests ディレクトリ盎䞋のシェルを読めばわかる基本的にはシェル芞で実装されおいる

  • 1 - Host Configuration
    • 1.1 - Ensure a separate partition for containers has been created
    • 1.2 - Ensure the container host has been Hardened
    • 1.3 - Ensure Docker is up to date
    • 1.4 - Ensure only trusted users are allowed to control Docker daemon
    • 1.5 - Ensure auditing is configured for the Docker daemon
    • 1.6 - Ensure auditing is configured for Docker files and directories - /var/lib/docker
    • 1.7 - Ensure auditing is configured for Docker files and directories - /etc/docker
    • 1.8 - Ensure auditing is configured for Docker files and directories - docker.service
    • 1.9 - Ensure auditing is configured for Docker files and directories - docker.socket
    • 1.10 - Ensure auditing is configured for Docker files and directories - /etc/default/docker
    • 1.11 - Ensure auditing is configured for Docker files and directories - /etc/docker/daemon.json
    • 1.12 - Ensure auditing is configured for Docker files and directories - /usr/bin/docker-containerd
    • 1.13 - Ensure auditing is configured for Docker files and directories - /usr/bin/docker-runc
  • 2 - Docker daemon configuration
    • 2.1 - Ensure network traffic is restricted between containers on the default bridge
    • 2.2 - Ensure the logging level is set to 'info'
    • 2.3 - Ensure Docker is allowed to make changes to iptables
    • 2.4 - Ensure insecure registries are not used
    • 2.5 - Ensure aufs storage driver is not used
    • 2.6 - Ensure TLS authentication for Docker daemon is configured
    • 2.7 - Ensure the default ulimit is configured appropriately
    • 2.8 - Enable user namespace support
    • 2.9 - Ensure the default cgroup usage has been confirmed
    • 2.10 - Ensure base device size is not changed until needed
    • 2.11 - Ensure that authorization for Docker client commands is enabled
    • 2.12 - Ensure centralized and remote logging is configured
    • 2.13 - Ensure operations on legacy registry (v1) are Disabled (Deprecated)
    • 2.14 - Ensure live restore is Enabled
    • 2.15 - Ensure Userland Proxy is Disabled
    • 2.16 - Ensure daemon-wide custom seccomp profile is applied, if needed
    • 2.17 - Ensure experimental features are avoided in production
    • 2.18 - Ensure containers are restricted from acquiring new privileges
  • 3 - Docker daemon configuration files
    • 3.1 - Ensure that docker.service file ownership is set to root:root
    • 3.2 - Ensure that docker.service file permissions are set to 644 or more restrictive
    • 3.3 - Ensure that docker.socket file ownership is set to root:root
    • 3.4 - Ensure that docker.socket file permissions are set to 644 or more restrictive
    • 3.5 - Ensure that /etc/docker directory ownership is set to root:root
    • 3.6 - Ensure that /etc/docker directory permissions are set to 755 or more restrictive
    • 3.7 - Ensure that registry certificate file ownership is set to root:root
    • 3.8 - Ensure that registry certificate file permissions are set to 444 or more restrictive
    • 3.9 - Ensure that TLS CA certificate file ownership is set to root:root
    • 3.10 - Ensure that TLS CA certificate file permissions are set to 444 or more restrictive
    • 3.11 - Ensure that Docker server certificate file ownership is set to root:root
    • 3.12 - Ensure that Docker server certificate file permissions are set to 444 or more restrictive
    • 3.13 - Ensure that Docker server certificate key file ownership is set to root:root
    • 3.14 - Ensure that Docker server certificate key file permissions are set to 400
    • 3.15 - Ensure that Docker socket file ownership is set to root:docker
    • 3.16 - Ensure that Docker socket file permissions are set to 660 or more restrictive
    • 3.17 - Ensure that daemon.json file ownership is set to root:root
    • 3.18 - Ensure that daemon.json file permissions are set to 644 or more restrictive
    • 3.19 - Ensure that /etc/default/docker file ownership is set to root:root
    • 3.20 - Ensure that /etc/default/docker file permissions are set to 644 or more restrictive
  • 4 - Container Images and Build File
    • 4.1 - Ensure a user for the container has been created
    • 4.2 - Ensure that containers use trusted base images
    • 4.3 - Ensure unnecessary packages are not installed in the container
    • 4.4 - Ensure images are scanned and rebuilt to include security patches
    • 4.5 - Ensure Content trust for Docker is Enabled
    • 4.6 - Ensure HEALTHCHECK instructions have been added to the container image
    • 4.7 - Ensure update instructions are not use alone in the Dockerfile
    • 4.8 - Ensure setuid and setgid permissions are removed in the images
    • 4.9 - Ensure COPY is used instead of ADD in Dockerfile
    • 4.10 - Ensure secrets are not stored in Dockerfiles
    • 4.11 - Ensure verified packages are only Installed
  • 5 - Container Runtime
  • 6 - Docker Security Operations
    • 6.1 - Avoid image sprawl
    • 6.2 - Avoid container sprawl
  • 7 - Docker Swarm Configuration
    • 7.1 - Ensure swarm mode is not Enabled, if not needed
    • 7.2 - Ensure the minimum number of manager nodes have been created in a swarm (Swarm mode not enabled)
    • 7.3 - Ensure swarm services are binded to a specific host interface (Swarm mode not enabled)
    • 7.4 - Ensure data exchanged between containers are encrypted on different nodes on the overlay network
    • 7.5 - Ensure Docker's secret management commands are used for managing secrets in a Swarm cluster (Swarm mode not enabled)
    • 7.6 - Ensure swarm manager is run in auto-lock mode (Swarm mode not enabled)
    • 7.7 - Ensure swarm manager auto-lock key is rotated periodically (Swarm mode not enabled)
    • 7.8 - Ensure node certificates are rotated as appropriate (Swarm mode not enabled)
    • 7.9 - Ensure CA certificates are rotated as appropriate (Swarm mode not enabled)
    • 7.10 - Ensure management plane traffic has been separated from data plane traffic (Swarm mode not enabled)

改善 : 1 - Host Configuration

今回は Amazon Linux 2 を怜蚌甚ホストずしおDocker 18.06.1-ce のデフォルト状態に察しお「Docker Bench for Security (1 - Host Configuration)」を実行したするず蚈7項目が WARN になった今回は「auditd」 で Docker 関連の監査ログを取れるようにする

$ ./docker-bench-security.sh -c check_1,check_1_1,check_1_2,check_1_3,check_1_4,check_1_5,check_1_6,check_1_7,check_1_8,check_1_9,check_1_10,check_1_11,check_1_12,check_1_13

䞭略

[INFO] 1 - Host Configuration
[WARN] 1.1  - Ensure a separate partition for containers has been created
[NOTE] 1.2  - Ensure the container host has been Hardened
[INFO] 1.3  - Ensure Docker is up to date
[INFO]      * Using 18.06.1, verify is it up to date as deemed necessary
[INFO]      * Your operating system vendor may provide support and security maintenance for Docker
[INFO] 1.4  - Ensure only trusted users are allowed to control Docker daemon
[INFO]      * docker:x:993:
[WARN] 1.5  - Ensure auditing is configured for the Docker daemon
[WARN] 1.6  - Ensure auditing is configured for Docker files and directories - /var/lib/docker
[WARN] 1.7  - Ensure auditing is configured for Docker files and directories - /etc/docker
[WARN] 1.8  - Ensure auditing is configured for Docker files and directories - docker.service
[INFO] 1.9  - Ensure auditing is configured for Docker files and directories - docker.socket
[INFO]      * File not found
[INFO] 1.10  - Ensure auditing is configured for Docker files and directories - /etc/default/docker
[INFO]      * File not found
[INFO] 1.11  - Ensure auditing is configured for Docker files and directories - /etc/docker/daemon.json
[INFO]      * File not found
[WARN] 1.12  - Ensure auditing is configured for Docker files and directories - /usr/bin/docker-containerd
[WARN] 1.13  - Ensure auditing is configured for Docker files and directories - /usr/bin/docker-runc

[INFO] Checks: 13
[INFO] Score: -7

以䞋の蚭定になるように /etc/audit/rules.d/audit.rules を修正する

$ auditctl -l
-w /usr/bin/docker -p wa
-w /var/lib/docker -p wa
-w /etc/docker -p wa
-w /usr/lib/systemd/system/docker.service -p wa
-w /lib/systemd/system/docker.socket -p wa
-w /usr/bin/docker-containerd -p wa
-w /usr/bin/docker-runc -p wa

するずWARN を残り1個たで改善できた項目 1.1 は docker info -f '{{ .DockerRootDir }}' で取埗できるディレクトリを別ファむルシステムにするず改善できる今回は実斜しなかった

$ ./docker-bench-security.sh -c check_1,check_1_1,check_1_2,check_1_3,check_1_4,check_1_5,check_1_6,check_1_7,check_1_8,check_1_9,check_1_10,check_1_11,check_1_12,check_1_13

䞭略

[INFO] 1 - Host Configuration
[WARN] 1.1  - Ensure a separate partition for containers has been created
[NOTE] 1.2  - Ensure the container host has been Hardened
[INFO] 1.3  - Ensure Docker is up to date
[INFO]      * Using 18.06.1, verify is it up to date as deemed necessary
[INFO]      * Your operating system vendor may provide support and security maintenance for Docker
[INFO] 1.4  - Ensure only trusted users are allowed to control Docker daemon
[INFO]      * docker:x:993:
[PASS] 1.5  - Ensure auditing is configured for the Docker daemon
[PASS] 1.6  - Ensure auditing is configured for Docker files and directories - /var/lib/docker
[PASS] 1.7  - Ensure auditing is configured for Docker files and directories - /etc/docker
[PASS] 1.8  - Ensure auditing is configured for Docker files and directories - docker.service
[INFO] 1.9  - Ensure auditing is configured for Docker files and directories - docker.socket
[INFO]      * File not found
[INFO] 1.10  - Ensure auditing is configured for Docker files and directories - /etc/default/docker
[INFO]      * File not found
[INFO] 1.11  - Ensure auditing is configured for Docker files and directories - /etc/docker/daemon.json
[INFO]      * File not found
[PASS] 1.12  - Ensure auditing is configured for Docker files and directories - /usr/bin/docker-containerd
[PASS] 1.13  - Ensure auditing is configured for Docker files and directories - /usr/bin/docker-runc

[INFO] Checks: 13
[INFO] Score: 5

改善 : 4 - Container Images and Build File

次に「Docker Bench for Security (4 - Container Images and Build File)」を実行したするず蚈1項目が WARN になった

$ ./docker-bench-security.sh -c check_4_1,check_4_2,check_4_3,check_4_4,check_4_5,check_4_6,check_4_7,check_4_8,check_4_9,check_4_10,check_4_11

䞭略

[INFO] 4.1  - Ensure a user for the container has been created
[INFO]      * No containers running
[NOTE] 4.2  - Ensure that containers use trusted base images
[NOTE] 4.3  - Ensure unnecessary packages are not installed in the container
[NOTE] 4.4  - Ensure images are scanned and rebuilt to include security patches
[WARN] 4.5  - Ensure Content trust for Docker is Enabled
[PASS] 4.6  - Ensure HEALTHCHECK instructions have been added to the container image
[PASS] 4.7  - Ensure update instructions are not use alone in the Dockerfile
[NOTE] 4.8  - Ensure setuid and setgid permissions are removed in the images
[PASS] 4.9  - Ensure COPY is used instead of ADD in Dockerfile
[NOTE] 4.10  - Ensure secrets are not stored in Dockerfiles
[NOTE] 4.11  - Ensure verified packages are only Installed

[INFO] Checks: 11
[INFO] Score: 1

項目 4.5 は「Docker Content Trust (DCT)」を有効化するず改善できる

docs.docker.com

今回は環境倉数 DOCKER_CONTENT_TRUST を蚭定しお蚺断をするず改善できた

$ export DOCKER_CONTENT_TRUST=1
$ ./docker-bench-security.sh -c check_4_1,check_4_2,check_4_3,check_4_4,check_4_5,check_4_6,check_4_7,check_4_8,check_4_9,check_4_10,check_4_11

䞭略

[INFO] 4.1  - Ensure a user for the container has been created
[INFO]      * No containers running
[NOTE] 4.2  - Ensure that containers use trusted base images
[NOTE] 4.3  - Ensure unnecessary packages are not installed in the container
[NOTE] 4.4  - Ensure images are scanned and rebuilt to include security patches
[PASS] 4.5  - Ensure Content trust for Docker is Enabled
[PASS] 4.6  - Ensure HEALTHCHECK instructions have been added to the container image
[PASS] 4.7  - Ensure update instructions are not use alone in the Dockerfile
[NOTE] 4.8  - Ensure setuid and setgid permissions are removed in the images
[PASS] 4.9  - Ensure COPY is used instead of ADD in Dockerfile
[NOTE] 4.10  - Ensure secrets are not stored in Dockerfiles
[NOTE] 4.11  - Ensure verified packages are only Installed

[INFO] Checks: 11
[INFO] Score: 3

プルリク゚ストを出した 🎉

docker-bench-security.sh の実装を読みながら README.md に曞いおあるオプション䞀芧を確認したずころ今月に远加されたオプション -t が README.md に反映されおいないこずに気付いたさっそく README.md を修正しプルリク゚ストを出しおすぐに merge しおもらえた

github.com

なお Docker (Moby) 関連のリポゞトリにプルリク゚ストを出す堎合コミットメッセヌゞに眲名を远加する必芁がある詳しくは CONTRIBUTING.md に曞いおある芚えおおこう

github.com

たずめ

  • 「CIS Docker Community Edition Benchmark v1.1.0」をサポヌトしおいる蚺断ツヌル「Docker Bench for Security」を詊した
  • コンテナを実行する方法ずシェルを実行する方法がある
  • 䟋えば auditd を有効化するなど蚺断結果を䜿っお改善できる
  • README.md を修正するプルリク゚ストを出しお merge しおもらえた

関連ツヌルなど

www.aquasec.com

www.twistlock.com

sysdig.com