Slide 1

Slide 1 text

で 減らしていこうという話

Slide 2

Slide 2 text

Pivotal Japan - Solutions Architect Kazuto Kusama @jacopen

Slide 3

Slide 3 text

Slide 4

Slide 4 text

第 回からサポーターとして参加

Slide 5

Slide 5 text

きっかけ にサポーターとして 参加してみません? お、いいですよー で、 って何?

Slide 6

Slide 6 text

運用が無い? 必要無いってこと?

Slide 7

Slide 7 text

じゃん

Slide 8

Slide 8 text

ぐぐってみた

Slide 9

Slide 9 text

https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00263/041900001/

Slide 10

Slide 10 text

じゃん

Slide 11

Slide 11 text

参加してみた

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

じゃん

Slide 14

Slide 14 text

なら任せろ • 勉強会 年から開催 • 現時点で 回開催

Slide 15

Slide 15 text

ぼくの昔の話

Slide 16

Slide 16 text

年くらい前 受託開発ばっかりだとあれだし、 うちもウェブサービスやることにした いいけど誰が運用するんすか キミができるやろ、よろしく! ちょっとまって

Slide 17

Slide 17 text

で、そのとき選んだのが

Slide 18

Slide 18 text

結果 • 運用担当たった 人で、 サービスの構築・運用まで 全部出来てしまった • 自分が退職した後、つい最近までサービス提供出来ていたらしい すげえ

Slide 19

Slide 19 text

その後 に強い興味を抱くようになったところで、 である が登場 個人的な趣味として を触り始めた が、某通信会社がそれをベースにした を提 供する計画だと聞く ⇒ やりたいです! の一心で転職 年

Slide 20

Slide 20 text

その後 某通信会社で 年間 の開発に携わったの ち、 の本家本元である に 転職 で衝撃を受けて以降、 年にわたって を本業で追い続けることに

Slide 21

Slide 21 text

ってなにがすごい?

Slide 22

Slide 22 text

もちろん満たしています https://www.slideshare.net/hiromasaoka/15-noops

Slide 23

Slide 23 text

や 使っている人?

Slide 24

Slide 24 text

書くなんて 造作もないっていう人?

Slide 25

Slide 25 text

の モデル $ docker build $ docker push $ docker run 書いて イメージ作って どこかのレジストリに上げて 実行する

Slide 26

Slide 26 text

の モデル $ docker build $ docker push $ docker run 書いて イメージ作って どこかのレジストリに上げて 実行する 特にこのへんが大変

Slide 27

Slide 27 text

ここ特化の があるレベル https://build.connpass.com/event/98947/

Slide 28

Slide 28 text

『コンテナ疲れ』と戦う、 ・ ・ の活用法 考えることが増えて面倒くさい・・・

Slide 29

Slide 29 text

これまでの のワークフロー の作成 の作成

Slide 30

Slide 30 text

これまでの のワークフロー の作成 の作成 どの にするか の書き方の知識 イメージビルドの環境 プライベートレジストリへの

Slide 31

Slide 31 text

これまでの のワークフロー の作成 の作成 どの にするか の書き方の知識 イメージビルドの環境 プライベートレジストリへの 詳しい人

Slide 32

Slide 32 text

これまでの のワークフロー の作成 の作成 どの にするか の書き方の知識 イメージビルドの環境 プライベートレジストリへの この 酷いですね 笑 イメージサイズでかいですよ 笑 詳しい人

Slide 33

Slide 33 text

これまでの のワークフロー の作成 の作成 この 酷いですね 笑 イメージサイズでかいですよ 笑 詳しい人 クソが

Slide 34

Slide 34 text

これまでの のワークフロー の作成 の作成 この 酷いですね 笑 イメージサイズでかいですよ 笑 詳しい人 クソが じゃん

Slide 35

Slide 35 text

誰もが同じようなことをやる の作成 の作成 の作成 の作成 の作成 の作成

Slide 36

Slide 36 text

誰もが同じようなことをやる の作成 の作成 の作成 の作成 の作成 の作成 この 酷いですね 笑 イメージサイズでかいですよ 笑 詳しい人

Slide 37

Slide 37 text

誰もが同じようなことをやる の作成 の作成 の作成 の作成 の作成 の作成 この 酷いですね 笑 イメージサイズでかいですよ 笑 詳しい人 クソが クソが クソが

Slide 38

Slide 38 text

誰もが同じようなことをやる の作成 の作成 の作成 の作成 の作成 の作成 この 酷いですね 笑 イメージサイズでかいですよ 笑 詳しい人 クソが クソが クソが じゃん

Slide 39

Slide 39 text

一方 ならこうなる

Slide 40

Slide 40 text

HerokuとCFにアプリをデプロイしてみるデモをしました。動画はこちら

Slide 41

Slide 41 text

$ cf push の例 コマンド一発 あとは全部おまかせ

Slide 42

Slide 42 text

コンテナイメージ コンテナレジストリ マニフェスト $ cf push

Slide 43

Slide 43 text

なぜこんなことが出来るのか

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

がうまいことやってくれる Buildpack 実行 $ cf push

Slide 46

Slide 46 text

とは によって作られた、 上で任意の言語や フレームワークを利用できるようにする仕組み や 、 などでも利用可能

Slide 47

Slide 47 text

のしくみ

Slide 48

Slide 48 text

デプロイされた アプリは何か? (detect) アプリ向けの 準備 (compile) コンテナイメージ Buildpack deploy

Slide 49

Slide 49 text

デプロイされた アプリは何か? (detect) アプリ向けの 準備 (compile) コンテナイメージ Buildpack deploy

Slide 50

Slide 50 text

デプロイされた アプリは何か? (detect) アプリ向けの 準備 (compile) コンテナイメージ Buildpack deploy

Slide 51

Slide 51 text

デプロイされた アプリは何か? (detect) アプリ向けの 準備 (compile) コンテナイメージ Buildpack deploy

Slide 52

Slide 52 text

必須スクリプト で使える の場合、 以下にな らず以下のスクリプトが存在します • • •

Slide 53

Slide 53 text

言語を検出するためのスクリプト

Slide 54

Slide 54 text

#!/usr/bin/env bash BUILD_DIR=$1 # Exit early if app is clearly not Python. if [ ! -f "$BUILD_DIR/requirements.txt" ] && [ ! -f "$BUILD_DIR/setup.py" ] && [ ! -f "$BUILD_DIR/Pipfile" ]; then exit 1 fi echo Python か か が無かったら 見つかった場合、 と文字を出して終わる

Slide 55

Slide 55 text

$ cf push のコード ① を実行 ではないので が返る ② を実行 ではないので が返る ③ を実行 ではないので が返る ④ を実行 のファイルがあるので が返る ⇒ を使った次の処理へ

Slide 56

Slide 56 text

か が返せればいいので、 でなくともよい。 例 で を実行している 例 の中で を実行している

Slide 57

Slide 57 text

実行可能なイメージを作成するフェーズ 言語の実行環境の設定 • たとえば 自体、 自体の実行環境 ライブラリ類の解決 • なら 、 なら など ここでその名の通り環境のコンパイルを行うことができるが、実際のとこ ろは処理時間の都合上、コンパイル済みのバイナリを持ってくることが 多い

Slide 58

Slide 58 text

このフェーズの処理は複雑なことが多いため、外部のスクリプトを呼ん で実行しているケースが多い 例

Slide 59

Slide 59 text

$ cf push のコード compile script

Slide 60

Slide 60 text

実行時に必要なメタデータを生成するスクリプト

Slide 61

Slide 61 text

適用後 デプロイされた アプリは何か? (detect) アプリ向けの 準備 (compile) コンテナイメージ Buildpack deploy

Slide 62

Slide 62 text

内部ではコンテナを活用 を使って を作 成し、 で実行 開発者はコンテナについて 意識する必要なし の場合

Slide 63

Slide 63 text

ここまでの話で 重要なポイント

Slide 64

Slide 64 text

• や は、開発者が楽になるような仕組みを によって実現している • の で、アプリがどんな 言語・フレームワークかを自動検出している • などを通じ、最終的にはアプリやランタイムがセットになっ たコンテナイメージが生成される

Slide 65

Slide 65 text

あれ

Slide 66

Slide 66 text

これでコンテナイメージ作れば いいんでは・・・

Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

と により、 年の 月から開始されたプロジェクト と の の仕様を統一。 ソースコードから イメージを作成できる仕組みに

Slide 69

Slide 69 text

プロジェクト入り

Slide 70

Slide 70 text

$ ls README.md app manifest.yml node_modules package.json public server.js views $ pack build jacopen/testapp 2018/11/19 17:14:31 Pulling builder image 'packs/samples' (use --no-pull flag to skip this step) 2018/11/19 17:14:33 Selected run image 'packs/run' from stack 'io.buildpacks.stacks.bionic' 2018/11/19 17:14:33 Pulling run image 'packs/run' (use --no-pull flag to skip this step) *** DETECTING: 2018/11/19 08:14:43 Group: Sample Node.js Buildpack: pass *** ANALYZING: Reading information from previous image for possible re-use 2018/11/19 17:14:44 WARNING: skipping analyze, image not found 中略 ---> 170c76d2c366 Successfully built 170c76d2c366 Successfully tagged jacopen/testapp:latest Dockerfileすら無いnode.jsアプリのディレクトリで pack buildコマンドを一発打つだけで、 自動的にイメージのビルドやってくれて超らくちん というデモをしました

Slide 71

Slide 71 text

従来の との違い

Slide 72

Slide 72 text

仕様がみっちり決められた https://github.com/buildpack/spec

Slide 73

Slide 73 text

内部的には 扱い

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

アプリケーションのソースコードを実行 可能なアーティファクトに変換するソフト ウェア

Slide 76

Slide 76 text

• 考え方はこれまでの とあまり変わらない • と の コマンドが必須 • は無くなった

Slide 77

Slide 77 text

を利用し、アーティファクトを イメージに変換するソフトウェア

Slide 78

Slide 78 text

• つのフェーズを経て イメージを作成 • 最後に実行 https://github.com/buildpack/spec/blob/master/buildpack.md#launch

Slide 79

Slide 79 text

https://github.com/buildpack/spec/blob/master/buildpack.md#launch の を 実行して

Slide 80

Slide 80 text

https://github.com/buildpack/spec/blob/master/buildpack.md#launch 既存イメージを解析して、変 更点を検出

Slide 81

Slide 81 text

https://github.com/buildpack/spec/blob/master/buildpack.md#launch 変更点があった部分に対し、 の を実行

Slide 82

Slide 82 text

https://github.com/buildpack/spec/blob/master/buildpack.md#launch 変更されたレイヤーを イメージに反映

Slide 83

Slide 83 text

には、 のリファレンス実装がある

Slide 84

Slide 84 text

コマンドラインから を利用したイメージ作成ができるツール。 今回のデモで利用 リファレンス実装を利用している

Slide 85

Slide 85 text

アプリ開発者 エンドユーザー に を利用した機能を提供するソ フトウェア

Slide 86

Slide 86 text

対応

Slide 87

Slide 87 text

対応

Slide 88

Slide 88 text

No content

Slide 89

Slide 89 text

によってもたらされるもの ● 開発者の生産性向上 ○ アプリケーション開発に注力できる ■ どうやって 書くかとか気にしなくていい ○ 一貫した操作でデプロイできる ■ ■ コマンド叩けば様々な言語で同様にイメージ作成できる ● 持続可能な運用 ○ のガードレールの元で開発者の生産性を高める ○ スケーラブルなセキュリティ

Slide 90

Slide 90 text

によってもたらされるもの ● 開発者の生産性向上 ○ アプリケーション開発に注力できる ■ どうやって 書くかとか気にしなくていい ○ 一貫した操作でデプロイできる ■ ■ コマンド叩けば様々な言語で同様にイメージ作成できる ● 持続可能な運用 ○ のガードレールの元で開発者の生産性を高める ○ スケーラブルなセキュリティ

Slide 91

Slide 91 text

これまでの のワークフロー の作成 の作成 手動、もしくはこれに相当する作業を CIツールで実施

Slide 92

Slide 92 text

これまでの のワークフロー の作成 の作成 手動、もしくはこれに相当する作業を CIツールで実施 FROM python:3.5.2 RUN apt-get update &&\ apt-get install xxxxxxxxx COPY xxxx xxxx CMD [xxxx] ベースイメージに 脆弱性が含まれていたら? パッケージに 脆弱性が含まれていたら?

Slide 93

Slide 93 text

これまでの のワークフロー の作成 の作成 手動、もしくはこれに相当する作業を CIツールで実施 FROM python:3.5.2 RUN apt-get update &&\ apt-get install xxxxxxxxx COPY xxxx xxxx CMD [xxxx] ベースイメージに 脆弱性が含まれていたら? パッケージに 脆弱性が含まれていたら? 脆弱性が発見される度に Dockerfileを書き換え、イメージを作り直 す作業を開発者がしなくてはいけない それどころか、対応が後回しになって放置されるかもしれない

Slide 94

Slide 94 text

これまでの のワークフロー の作成 の作成 FROM python:3.5.2 RUN apt-get update &&\ apt-get install xxxxxxxxx COPY xxxx xxxx CMD [xxxx] を が管理?

Slide 95

Slide 95 text

これまでの のワークフロー の作成 の作成 FROM python:3.5.2 RUN apt-get update &&\ apt-get install xxxxxxxxx COPY xxxx xxxx CMD [xxxx] を が管理? 開発チームが増え、運用対象が増えると管理が回らない (スケーラビリティの問題 ) コミュニケーションコストの問題で開発効率が落ちる

Slide 96

Slide 96 text

のときのワークフロー の管理と の提供 の作成

Slide 97

Slide 97 text

のときのワークフロー の管理と の提供 の作成 脆弱性が見つかったら、 自体をアッ プデート 再適用してイメージ再作成

Slide 98

Slide 98 text

のときのワークフロー

Slide 99

Slide 99 text

のときのワークフロー

Slide 100

Slide 100 text

今ある ● の は、順次 対応が行われる ○ 現時点では が利用可能 ○ https://github.com/cloudfoundry/nodejs-cnb.git ● Herokuからは、JavaのBuildpackがリリース ○ https://github.com/heroku/java-buildpack ● Knativeの上でFaaSを実現するriff向けのbuildpack ○ https://github.com/projectriff/riff-buildpack

Slide 101

Slide 101 text

まとめ のノウハウが凝縮されているのが は、コンテナイメージの作成と 運用に関わる面倒なところを楽にしてくれる 単にイメージを作るだけでなく、ライフサイクルまで意識 して技術選択すると良いかも

Slide 102

Slide 102 text

その他詳しい情報 まずは試そう 仕様を詳しく知るなら Buildpackのサンプルを 見るなら

Slide 103

Slide 103 text

No content