Heroku meets PHP株式会社 chatboxみかかね @mkkn_info
PHPer Loves Heroku #0http://heroku-pug.connpass.com/event/20197/2015.10.15
about meみかかね @mkkn_info#PHPer, フロントエンド# 株式会社 chatbox 代表# 関西フロントエンド UG 代表
PHP やフロントエンド、コミュニティ運営に興味のあるメンバー募集中 !! 詳細は Wantedly にてhttps://www.wantedly.com/projects/30531
facebook: 後藤知宏
twitter: @mkkn_info
Heroku
PHP 対応の PaaS
PaaS
PaaS とは、インターネットを利用したコンピュータの新しい利用形態の 1 つである。PaaS では、ソフトウェアを構築および稼動させるための土台となるプラットフォームを、インターネット経由のサービスとして提供する。開発者は、プラットフォーム上で構築したサービスを自分の顧客に提供することができる。 具体的には、インフラ、 DBMS 、ユーザインタフェースなどのシステム開発手段となるツールや、開発したシステムを運用するための環境をインターネットを通じて「サービス」として提供し、月額使用料などの形で収入を得る事業モデルである。Wikipedia Platform as a Service より
/) ///) / ,.= ゙ ''" / / i f ,.r='"-‐' つ___ _ こまけぇこたぁいいんだよ!! / / _,.-‐'~ /⌒ ⌒\ / ,i , 二ニ⊃( ●) . (●)\ / ノ il ゙フ ::::::⌒ ( __ 人 __ )⌒ ::::: \ , イ「ト、 ,!,!| |r┬-| | / i トヾヽ _/ ィ " \ ` ー '´ /
つまり、インフラ構築が楽になる。
どれくらい楽になるか。
it’s demo
Herokuインフラ構築が楽になる。
Git 管理の push して即デプロイサーバの構築に係る作業はほぼゼロ
サーバの設定確認や調整は Web 画面のほか、Heroku toolbelt と呼ばれる CLI ツールで行える。
https://toolbelt.heroku.com/
Heroku おいしいところ# addon 等を使用して色々なミドルウェアを 簡単に用意できる。# サーバの調整も手軽に行える。# 無料から利用できるのでテストサーバに最適。# git 連携でデプロイがより楽になる。# 自然とスケーラブルな PHP の書き方が身につく。
Heroku AddonsHeroku 上で利用可能な
様々なミドルウェアを提供するサービス
データベースや Redis, ログ監視 ,Storage や Mail などのサービスが簡単に利用可能に
Heroku の SaaS 的な側面
https://addons.heroku.com/
Heroku Storage# MySQL ( ClearDB , JawsDB)# Postgres ( Heroku Postgres )# Redis (OpenRedis, Redis To Go, Redis Cloud)# Memcached # FileStorage (FilePicker, Cloudinary) もちろん構築はボタン一つでインフラの知識は不要バックアップもスケールもお金で解決 !!
Heroku TuningPaaS といえども多様なサーバ構成を選択可能
Addon を利用した構成から PHP の細かい調整まで。
そもそも heroku では、PHP に限らず多様な言語 & Docker をサポートする
Buildpack や Docker デプロイを利用すれば無限の可能性
Addons# cron -> Heroku Scheduler# Monitoring -> New Relic# Logging -> papertrail# Mail -> sendgrid# SSL -> SSLSSH で yum を使って…という構成は取れないが、Addon を使ってかなり多様な事はできるようになっている。
PHP の構成composer.json を利用して PHP の構成もセットアップ可能composer.json の require に記載した項目はデプロイの際に自動的にセットアップされる。# php version# php extention# dependency libraries
力技Buildpack を使用して、ビルドフェーズの構成はむりくり調整可能な模様…?PHP 環境のセットアップには公式の PHP 用 Buildpack が用いられている。https://github.com/heroku/heroku-buildpack-phpその他各種言語の公式 Buildpack や AWS CLI などの各種ライブラリをサポートする野良 Buildpack など様々なものを利用可能。
デプロイの仕組みheroku 上では composer.json を検出して PHP 用の Buildpack が自動的に採用される。同様の理由で package.json があると node 用のBuildpack が自動的に採用される。( 優先順位は PHP よりも上 !!)自動での認識がされない場合には以下のコマンドを叩くと良い。$ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-php
Multi Buildpack の利用MultiBuildpack を利用して、複数の Buildpack を利用する事が可能。
Git のルートに `.buildpacks` というファイルを置いて利用する Buildpack の URL を複数記述していく。
$ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-multi
https://github.com/heroku/heroku-buildpack-nodejshttps://github.com/heroku/heroku-buildpack-php
npm でフロントビルド系の処理をしながら PHP アプリケーションを起動したい場合など。
Heroku Pricingつい最近料金体系の変更がありました。
料金に関する古いブログ記事の内容には注意
無料プランでは、6時間のスリープが強制にそれでも月 $7 支払えば
スケール可能な PaaS クラウドが運用可能になるのは十分魅力的?
https://www.heroku.com/pricing
Heroku Pricing # 課金の基準は dyno 基準で# Worker インスタンスは Postgres ( Heroku Postgres )# Redis (OpenRedis, Redis To Go, Redis Cloud)# Memcached # FileStorage (FilePicker, Cloudinary) もちろん構築はボタン一つでインフラの知識は不要バックアップもスケールもお金で解決 !!
dyno# heroku におけるインスタンスの数え方#Web アプリケーション用に立てる Web Dyno# バックグラウンド処理などで用いる Worker Dyno#Scheduler や ssh などで使用する One Off Dyno
新料金体制で One Off Dyno については無料になったらしい ( もう SSH 接続で時間を気にしなくていい !!)
使用する Dyno の性能、数で料金が変わる。
Heroku Free Dyno# 30 分アクセスが無いと SLEEP に入る# 24 時間で 6 時間 は必ず SLEEP するようになった。#Web dyno x 1#Worker dyno も一つ無料でついてくる。
新料金体制で ssh で入る dyno や scheduler から起動される one off dyno については無料になったらしい。
Heroku with GithubGithub 連携で Heroku のデプロイはより便利に
Heroku の権限管理周りを Github で一元管理できるので便利Github と Heroku にわざわざ二回 push する手間が省ける。
指定したブランチへの push をキーに、heroku のデプロイを自動的に行なってくれる。
Heroku Deploy Hooks
# HipChat へのメッセージ送信#Email の送信#IRC へのメッセージ送信#HTTP Post へのリクエスト送信# その他 Basecamp,Campfire といったサービス連携も
Heroku の無料 addonDeploy に対応して複数の Hook 処理を指定できる。
Heroku with PHPPHP is not Legacy.
最近ではフレームワークでもスケールを意識した機能をサポートしているのが当たり前に
PHP の今風な書き方、の機能をインフラ構築に関する学習コストゼロでフル活用する。
PHP アプリケーションの今風で柔軟な構築手法を知る。クラウドを見据えたアプリケーション構築
What’s Scalable# 設定をアプリケーション外部から注入可能# 実装をアプリケーション内部で切り替え可能
ローカル環境、テスト環境、商用環境などサーバの厚生に応じて、それぞれに最適な異なる処理を一つのソースで実現する。
環境に応じて、異なる値を設定値として利用できる。設定値を利用して、ログや DB などの処理を自動的に切り替えることが可能。
実装の切り替え# Database 関連# Session , Cache 関連# Upload 系のデータ、 Dump 関連のデータ# ログデータの出力先他にも外部サービスに依存するメール送信などの処理も環境に応じて切り替え可能だとかなり便利。
ストレージ周りの切り替えはかなり重要になってくる。
dotenvPHP における「環境による設定値の切り替え」
.env という dot ファイルを利用してシステム環境変数を上書きする仕組み主にローカル開発環境で利用する。
Laravel 系列のフレームワークでは標準的に用いられている。https://github.com/vlucas/phpdotenv
dotenv の運用
ローカル開発環境での構築時に環境変数をアプリケーションに合わせて触るのは辛いので、 .env ファイルに値を書いて、 dotenv で実行時のみ `$_SERVER` 変数を上書きする。 → 本番サーバ等では .env は白紙の状態で運用。
環境ごとに異なる値を環境変数から参照するようにシステムを構築していく。 → heroku の環境変数は `heroku config:set` で設定 → 環境変数は `$_SERVER` から取得可能
実装の切り替えPHP にはインターフェイスがある。
必要な機能の振る舞いをインターフェイスで書いて、処理をサーバ毎に振り分けていくログ系の集積やメールの送信など
http://tanakahisateru.hatenablog.jp/entry/20120228/1330431278
実装の切り替え環境変数に応じて if 文で処理のブロックを切り替えていくのは、シンプルだがコードが見づらい。$env = env(“APP_ENV”);If($env === “local”){ // // ローカル環境での処理 //}elseif( $env=== “stage”){ // // テスト環境での処理 //….
実装の切り替え環境変数の値をキーに処理クラスを生成するようなサービスを定義し、インターフェイスで共通化されたメソドを呼び出す。$mailSender = MailSender::create(env(“APP_MAILSENDER”));$mailSender->send();
あとから環境を追加したり、環境ごとに異なる処理を入れたくなった時などに変更がスムーズ。
Heroku Trouble ShootingPaaS に慣れていないと色々詰みポイントは多い。
作ったファイルが消えるなどインスタンス周りのトラブルはやっぱり多い。
普通に SSH で入れる VPS 環境と違い、Heroku の Web Dyno には ssh で入ることすら不可。
あと、リージョン外からのアクセスはやはり遅い( ローカルから DB への接続など )
Let’s Begin!!# 少ない学習コストでクラウドに触れてみたい。# 煩わしいインフラ管理の手間から開放されたい。# 俺はインフラの人じゃない !! PHP エンジニアだ !!
とりあえず無料から利用可能なので、デモサイトやSlack Bot などのテストアプリに。
こんな人にオススメ。
わからないこと、困ったことは、Heroku PUG(Heroku PHP User Group)
に相談してみよう !!
新しく知ったこと、気づいたことはHeroku PUG(Heroku PHP User Group)
で発表してみよう !!
是非、よろしくお願いします。