Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
俺のBuildpackで幸せになる。(IBM Cloud loves Laravel)
Search
Yosuke Enomoto
December 08, 2018
Programming
0
1.2k
俺のBuildpackで幸せになる。(IBM Cloud loves Laravel)
php-buildpackを使ってLaravelプロジェクトを簡単にIBM Cloud(PaaS)上で使えるようにしました。
Yosuke Enomoto
December 08, 2018
Tweet
Share
More Decks by Yosuke Enomoto
See All by Yosuke Enomoto
ドクターメイトエンジニアカルチャーブック
motuo1201
0
75
もう話すことに困らない! カジュアル面談の “型” 全部見せ
motuo1201
0
350
CROSS Party online 2022 ~自重トレ~
motuo1201
0
380
IoT LT Vol7 LT
motuo1201
0
220
IBM Cloud Fest Online 2020
motuo1201
0
750
IBM Championが考えるアプリケーション基盤の勘所
motuo1201
0
200
社内定例LT1回目の資料
motuo1201
0
110
codewindで実現!簡単コンテナ開発
motuo1201
0
580
Watson Assistant×Slack Botがリモートで働く社員を繋ぐ
motuo1201
0
570
Other Decks in Programming
See All in Programming
flutterkaigi_2024.pdf
kyoheig3
0
130
CSC509 Lecture 09
javiergs
PRO
0
140
ペアーズにおけるAmazon Bedrockを⽤いた障害対応⽀援 ⽣成AIツールの導⼊事例 @ 20241115配信AWSウェビナー登壇
fukubaka0825
6
1.9k
OnlineTestConf: Test Automation Friend or Foe
maaretp
0
110
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
3
690
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
620
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
250
どうして僕の作ったクラスが手続き型と言われなきゃいけないんですか
akikogoto
1
120
RubyLSPのマルチバイト文字対応
notfounds
0
120
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
880
Flutterを言い訳にしない!アプリの使い心地改善テクニック5選🔥
kno3a87
1
190
リアーキテクチャxDDD 1年間の取り組みと進化
hsawaji
1
220
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
20
1.1k
A Philosophy of Restraint
colly
203
16k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
Raft: Consensus for Rubyists
vanstee
136
6.6k
Speed Design
sergeychernyshev
25
620
The Art of Programming - Codeland 2020
erikaheidi
52
13k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Imperfection Machines: The Place of Print at Facebook
scottboms
265
13k
Done Done
chrislema
181
16k
BBQ
matthewcrist
85
9.3k
Transcript
bmxug.tokyo 俺のLaravel Buildpackで幸せになる IBM Cloud for Laravel User bmxug.tokyo -
PaaS相談会チーム @motuo @tokida
bmxug.tokyo Speaker mutuo 千葉県某所の物流系企業で社内 SEしています。汎用機開発・ PHP果ては Windowsのキッティングまでも全部やる雑食系。 PaaSを行き当たりばったりに使い過ぎて行き詰っていた所を、 BMXUGの皆 様に拾って頂きました。
↓はじまりはここから
bmxug.tokyo bmxug.tokyo - IBM Cloud PaaSをもっと使いこなしたい、分からないことを解決したいという目 的で始まったコミュニティ - 主要メンバがLaravel使いだったのでLaravelの話題多め -
自分の課題を発表してみんなでワイワイ話している PaaS相談会として発足(大体毎月第一水曜日付近で開催) - 7/4 これから始めるPaaS開発相談会 - 8/1 PaaS相談会#2 : Laravel On IBM Cloud - 9/5 PaaS相談会#3 : IBM Cloud What's New! - 10/3 開発相談会#4 : IBM CloudFunction/Laravel - 11/7 開発相談会#5 : DevOps(CI/CD,Test)
bmxug.tokyo IBM Cloud PaaS コンピュートリソース CPUとかメモリとかディスクとかの物理か ら仮想的なものまで。抽象化したレイヤと してはみんなが好きな Kubernetesとか 下位のリソースの管理、マルチテナント、パーミッ
ション、監視、ログ管理、ミドルウェアの利用の管理 などが抽象化されスケーラビリティ・セキュリティ・ア プリケーションデプロイメントを管理される On-demandで利用できる機能やアプリ ケーション。カタログやマーケットプレイスを 経由して利用。多くは「サーバレス」なサー ビス API API
bmxug.tokyo IBM Cloud PaaSでは、PaaSとSaaSでアプリを作る ロジック部分をPaaSですばやく 開発 PaaSで実装できない機能は用 意されているSaaSを徹底的に 利用 どうしても使えなければ
IaaS上 で実装することも API IBM Cloud以外の外部の SaaSも使えるよ
bmxug.tokyo 今時はKubernetesじゃないの? Management Monitoring Logging Security Load Barancer Tools CI/CD
IaaS k8sでは出来ない部分はエコシステ ムから必要なものを選択して構築 + k8sとか、全部コードでできる とか言ってもまだまだ開発者 に取っては難しい インフラのことは最小限にし て開発に集中したい YAML地獄からの脱出 やりたいことを最小の学習コ ストで実現したい
bmxug.tokyo IBM Cloud の PaaS “ Cloud Foundry” • もっともメジャーなOpenSource
PaaS • CFの最大の特徴は、ディベロッパーが細かいことは何も 知らなくても cf push のワン・アクションでアプリケー ションが起動することが出来ること • 実行環境にはコンテナを利用 • 従来のApplication RuntimeだけでなくKubernets ベースのContainer Runtimeも利用可能 • またCF自体をKubernets上で動かす試みもIBM, SUSE主導で始まっている
bmxug.tokyo PaaSでは様々な言語を利用して開発が出来る
bmxug.tokyo Runtimeで様々な言語が利用出来るわけ 最低限のアプリケーションライブラリ (Dockerでいうところのベース) 言語実行環境セットアップ済みファイルセット (nodejsやPython自体) ユーザの作成したプログラムやライブラリ (xxx.jsやxxx.py自体)
bmxug.tokyo Runtimeで様々な言語が利用出来るわけ 最低限のアプリケーションライブラリ (Dockerでいうところのベース) 言語実行環境セットアップ済みファイルセット (nodejsやPython自体) ユーザの作成したプログラムやライブラリ (xxx.jsやxxx.py自体) BuildPack
bmxug.tokyo 導入済み BuildPack buildpack 位置 有効 ロック済み ファイル名 liberty-for-java 1
true false buildpack_liberty-for-java_v3.23-20180628-1052.zip sdk-for-nodejs 2 true false buildpack_sdk-for-nodejs_v3.20.2-20180524-2057.zip dotnet-core 3 true false buildpack_dotnet-core_v1.0.26-20170913-1346.zip swift_buildpack 4 true false buildpack_swift_v2.0.12-20180510-1828.zip noop-buildpack 5 true false noop-buildpack-20140311-1519.zip java_buildpack 6 true false java-buildpack-v3.19.zip ruby_buildpack 7 true false ruby-buildpack-v1.6.46.zip nodejs_buildpack 8 true false nodejs-buildpack-v1.6.4.zip go_buildpack 9 true false go-buildpack-v1.8.6.zip python_buildpack 10 true false python-buildpack-v1.5.22.zip xpages_buildpack 11 true false xpages_buildpack_v1.2.2-20170112-1328.zip php_buildpack 12 true false php-buildpack-v4.3.39.zip staticfile_buildpack 13 true false staticfile-buildpack-v1.4.12.zip binary_buildpack 14 true false binary-buildpack-v1.0.14.zip dotnet-core_v1_0_22-20170724-0813 15 false false buildpack_dotnet-core_v1.0.22-20170724-0813.zip liberty-for-java_v3_17_1-20180131-1532 16 true false buildpack_liberty-for-java_v3.17.1-20180131-1532.zip liberty_v3_14-20171013-1023 17 true false buildpack_liberty_v3.14-20171013-1023.zip swift_buildpack_v2_0_11-20180402-2018 18 true false buildpack_swift_v2.0.11-20180402-2018.zip sdk-for-nodejs_v3_20_1-20180509-1706 19 true false buildpack_sdk-for-nodejs_v3.20.1-20180509-1706.zip liberty-for-java_v3_22-20180601-1200 20 true false buildpack_liberty-for-java_v3.22-20180601-1200.zip
bmxug.tokyo BuildPackはどのように活用されているか Detect - PHP Buildpackの選択 PHP Code PHP Code
Compile - 環境構築 Composerなど実行 Release - Dropletの実行 Droplet Process Cell Blob Store
bmxug.tokyo BuildPackをベースとした開発 • ユーザの「コード」としてアプリケーションのフレームワークな どをコードも合わせて用意して push する。 ただしこのとき に言語毎にパッケージマネージャなどは利用可能である ケースがある。
• Nodejsなどは npm 、 PHPは Composerなどがそれぞ れ必要なファイルが存在しているときには Compile フェー ズで実行される。(つまりそれ以外はすべて手元に用意して おく) BuildPack Package Module Code
bmxug.tokyo おれのBuildPack BuildPack Package Module BuildPack
bmxug.tokyo Custom BuildPackの利点 • 実行環境のバージョンを固定 ( IBM Cloudの場合最新版から2個前までバージョ ンが利用可能) •
ミドルウェアの設定を好きに設定可能 (PHPのモジュールなど) • cf push の際のデプロイまでの時間の短縮(多くはパケージマネージャが最新の 状態を構築する作業で時間がかかっている) • 開発時における環境構築の手間の削減、開発チーム内での差異を小さくする • 機能の拡張(例えばIBM製の Nodejs Buildpackなどではデバックなどが行え るオプションが追加されている)
bmxug.tokyo ここからは実際にBuildPackを触ってみる BuildPack
bmxug.tokyo 今回のテーマ LaravelのソースをGithubから読込んで、PaaSに自動デプロイしてみましょう! 無料で使えるCI/CD ツールを通じて… 自分のLaravel リポジトリから… 簡単Deploy! 標準 PHP
Buildpack
bmxug.tokyo この構成を実現するにあたって(CI/CD) PaaSには「継続的デリバリー」という機能が含 まれています。 CI/CDを実現するための様々なツールを組合せて繋ぐことができます。(ToolChain) 例えば、、、 • Githubがコミットされたら自動的にテスト • テストをパスしたらPaaSへ自動的にデプロイ
• デプロイ結果をSlackへ通知 なんてことも、PaaS上で簡単に実現できます。 とっても、便利。
bmxug.tokyo 今回のToolChainはこんな感じです Githubとの連携だけですが、数分でこれが出来るPaaSはやっぱりすごい!
bmxug.tokyo さぁ、早速デプロイしてみよう!
bmxug.tokyo いきなりコケる file_get_contents(/tmp/app/htdocs/.env): failed to open stream: No such file
or directory .envファイルが無いって・・・ でも、Githubに.envファイル(DBへの接続情報とか)なんて置けない・・・ でも、key:generateはしたい composer.jsonにスクリプトを書くしかないのかな …
bmxug.tokyo composer.jsonいじるなら、こんな感じでもいける "post-update-cmd": [ "echo post-update-cmd", "@php -r \"file_exists('.env') ||
copy('.env.example','.env');\"", "mkdir -p /tmp/app/bootstrap/cache", "mkdir -p /tmp/app/storage/framework/sessions", "mkdir -p /tmp/app/storage/framework/views", "mkdir -p /tmp/app/storage/framework/cache", "Illuminate\\Foundation\\ComposerScripts::postUpdate", "php artisan key:generate" ],
bmxug.tokyo composer.jsonいじるなら、こんな感じでもいける "post-update-cmd": [ "echo post-update-cmd", "@php -r \"file_exists('.env') ||
copy('.env.example','.env');\"", "mkdir -p /tmp/app/bootstrap/cache", "mkdir -p /tmp/app/storage/framework/sessions", "mkdir -p /tmp/app/storage/framework/views", "mkdir -p /tmp/app/storage/framework/cache", "Illuminate\\Foundation\\ComposerScripts::postUpdate", "php artisan key:generate" ], これだけの為に、 毎回、composer.jsonを変更するの?
bmxug.tokyo というわけで、俺のBuildPackを作ろう!
bmxug.tokyo 材料はGithubにある! URL: https://github.com/cloudfoundry?
bmxug.tokyo Forkして修正しましょう。 PaaSのBuildPackはこのソースを直接、動かしてくれます。
bmxug.tokyo ちなみに、Detectの中身 Detect - PHP Buildpackの選択 php_buildpack は、以下のいずれかの条件下で 使用されます。 ・アプリケーションに
composer.json ファイルが 含まれている。 ・アプリケーションに *.php ファイルが 含まれている。 ・アプリケーションの options.json ファイルで ${WEBDIR} 変数が定義され、その変数が アプリケーション内の既存ディレクトリー に設定されている。
bmxug.tokyo 正直、あんまりいじるところは無い。
bmxug.tokyo 俺のBuildPackはCompileで唸りをあげる! と言いながらも、やる事は単純で ソースコード内にある (.env) が存在すればそのまま採用。 無ければプロジェクト内の(.env.sample)をコピー これだけ。
bmxug.tokyo 実際に修正したところ extensions/composer/extension.py
bmxug.tokyo 実際に修正したところ
bmxug.tokyo Github上にCommitしたら俺のBuildPackは準備OK PaaSで使うだけであれば、ソースが Github上にあればOK create-buildpack(BuildPackのBuildすること)すら不要。
bmxug.tokyo 俺のBuildPack、どうやって使うの? まずは、Github上にPaaS用のLaravelプロジェクトを作成します。 PaaSの環境変数/コンテナ名/BulildPackを指定するファイル indexの場所や拡張機能の定義 Laravelアプリケーションはこの下に入れる
bmxug.tokyo (中身の紹介1) .bp-configの内容 { "PHP_VERSION": "{PHP_70_LATEST}", "COMPOSER_VENDOR_DIR": "htdocs/vendor", "WEBDIR": "htdocs/public",
"PHP_EXTENSIONS": ["bz2", "pdo", "zlib", "curl", "mcrypt", "mbstring", "mysqli", "gd", "zip", "pdo_mysql", "pdo_sqlite" ] }
bmxug.tokyo (中身の紹介2) htdocs配下の内容 .envが無かった時に採用する環境変数ファイル
bmxug.tokyo ちなみに、.env.exampleはこんな感じ(一部) APP_NAME=Laravel APP_ENV=local APP_KEY= APP_DEBUG=true APP_LOG_LEVEL=debug APP_URL=http://localhost DB_CONNECTION=mysql DB_HOST=127.0.0.1
DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret
bmxug.tokyo 俺のBuildPackを使うする時は… Manifest.ymlを修正しましょう。 さきほど、作成したPHP-BuildPackのURLを指定します。
bmxug.tokyo ついに・・・ BuildPackが俺のBuildPackに変更されました! 無料で使えるCI/CD ツールを通じて… 自分のLaravel リポジトリから… 簡単Deploy! 俺の PHP
Buildpack
bmxug.tokyo 実機で確認 無事にDeployに成功しました。
bmxug.tokyo でも、環境変数はどこに持たせるの? PaaSに持たせましょう。LaravelはPaaS上の環境変数を優先してくれます。
bmxug.tokyo 実に簡単。 ソースはPhysonで書かれていますが、PHPerの私でも修正出来ました
bmxug.tokyo 最後に 相談会に参加する前は機能の言葉の意味すら分からずに、 ただのアプリケーションサーバとしてしか使えていませんでしたが、 色々な方からの情報提供やアドバイスで、IBM Cloudならではの便利さを 享受できるようになってきました! ぜひぜひ、開発相談会に遊びに来てください。
bmxug.tokyo 次回の予告 * 2019年1月16日(水) - 19:00 - 19:40 DockerイメージをPaaSで利用してみる (@tokida)
- 19:40 - 20:10 TBD(募集中) - 20:10 - 20:40 PaaS 相談会 (相談会ネタ募集中) - https://bmxug.connpass.com/event/112451/ ×
bmxug.tokyo bmxug.tokyo push
bmxug.tokyo bmxug.tokyo push