Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Dive into the Cloud with our buddy, lovely PHP!

9,816 views

Published on

PHP と一緒にクラウドの世界へ飛び込もう。
JAWS FESTA Kansai 2013 でのスライドです。

Published in: Technology, Business
  • Be the first to comment

Dive into the Cloud with our buddy, lovely PHP!

  1. 1. Dive into the Cloud with our buddy, lovely PHP! 関西PHP勉強会 #9 in JAWS FESTA Kansai 2013 September 26th, 2013 Sotaro OMURA @omoon
  2. 2. #jawsfesta About Me
  3. 3. #jawsfesta About Me •Sotaro OMURA
  4. 4. #jawsfesta About Me •Sotaro OMURA •株式会社タップ
  5. 5. #jawsfesta About Me •Sotaro OMURA •株式会社タップ •PHP歴は12年ほど(最近はFuelPHPとか)
  6. 6. #jawsfesta About Me •Sotaro OMURA •株式会社タップ •PHP歴は12年ほど(最近はFuelPHPとか) •love noodles
  7. 7. #jawsfesta About Me •Sotaro OMURA •株式会社タップ •PHP歴は12年ほど(最近はFuelPHPとか) •love noodles •omoon.org
  8. 8. #jawsfesta About Me •Sotaro OMURA •株式会社タップ •PHP歴は12年ほど(最近はFuelPHPとか) •love noodles •omoon.org •@omoon
  9. 9. #jawsfesta About Me •Sotaro OMURA •株式会社タップ •PHP歴は12年ほど(最近はFuelPHPとか) •love noodles •omoon.org •@omoon
  10. 10. #jawsfesta 京セラドームと聞いて
  11. 11. #jawsfesta
  12. 12. #jawsfesta 安心しました
  13. 13. #jawsfesta 今日話すこと
  14. 14. #jawsfesta 今日話すこと •クラウドにまつわる言葉の整理
  15. 15. #jawsfesta 今日話すこと •クラウドにまつわる言葉の整理 •代表的クラウド紹介
  16. 16. #jawsfesta 今日話すこと •クラウドにまつわる言葉の整理 •代表的クラウド紹介 •実際にクラウドでPHPアプリケーションを公開する場合の具体的手順
  17. 17. #jawsfesta ところで
  18. 18. #jawsfesta About Me
  19. 19. #jawsfesta About Me
  20. 20. #jawsfesta
  21. 21. #jawsfesta
  22. 22. #jawsfesta About Me
  23. 23. #jawsfesta About Me
  24. 24. #jawsfesta
  25. 25. #jawsfesta クラウドとは
  26. 26. #jawsfesta クラウド3つの分類
  27. 27. #jawsfesta クラウド3つの分類 •IaaS (Infrastructure as a Service)
  28. 28. #jawsfesta クラウド3つの分類 •IaaS (Infrastructure as a Service) •PaaS (Platform as a Service)
  29. 29. #jawsfesta クラウド3つの分類 •IaaS (Infrastructure as a Service) •PaaS (Platform as a Service) •SaaS (Software as a Service)
  30. 30. #jawsfesta IaaS
  31. 31. #jawsfesta IaaS(あいあーす)
  32. 32. #jawsfesta IaaS(いあーす)
  33. 33. #jawsfesta IaaS
  34. 34. #jawsfesta IaaS •Amazon Web Services(http://aws.amazon.com/jp/)
  35. 35. #jawsfesta IaaS •Amazon Web Services(http://aws.amazon.com/jp/) •さくらのクラウド(http://cloud.sakura.ad.jp/)
  36. 36. #jawsfesta IaaS •Amazon Web Services(http://aws.amazon.com/jp/) •さくらのクラウド(http://cloud.sakura.ad.jp/) •NIFTY Cloud(http://cloud.nifty.com/)
  37. 37. #jawsfesta IaaS •Amazon Web Services(http://aws.amazon.com/jp/) •さくらのクラウド(http://cloud.sakura.ad.jp/) •NIFTY Cloud(http://cloud.nifty.com/) •Windows Azure(http://www.windowsazure.com/ja-jp/)
  38. 38. #jawsfesta PaaS
  39. 39. #jawsfesta PaaS(ぱあす)
  40. 40. #jawsfesta PaaS
  41. 41. #jawsfesta PaaS • AppFog(https://www.appfog.com)
  42. 42. #jawsfesta PaaS • AppFog(https://www.appfog.com) • AWS Elastic Beanstalk(http://aws.amazon.com/jp/elasticbeanstalk/)
  43. 43. #jawsfesta PaaS • AppFog(https://www.appfog.com) • AWS Elastic Beanstalk(http://aws.amazon.com/jp/elasticbeanstalk/) • cloudControl(https://www.cloudcontrol.com)
  44. 44. #jawsfesta PaaS • AppFog(https://www.appfog.com) • AWS Elastic Beanstalk(http://aws.amazon.com/jp/elasticbeanstalk/) • cloudControl(https://www.cloudcontrol.com) • DotCloud(https://www.dotcloud.com)
  45. 45. #jawsfesta PaaS • AppFog(https://www.appfog.com) • AWS Elastic Beanstalk(http://aws.amazon.com/jp/elasticbeanstalk/) • cloudControl(https://www.cloudcontrol.com) • DotCloud(https://www.dotcloud.com) • Engine Yard(http://www.engineyard.co.jp)
  46. 46. #jawsfesta PaaS • AppFog(https://www.appfog.com) • AWS Elastic Beanstalk(http://aws.amazon.com/jp/elasticbeanstalk/) • cloudControl(https://www.cloudcontrol.com) • DotCloud(https://www.dotcloud.com) • Engine Yard(http://www.engineyard.co.jp) • Google App Engine(https://developers.google.com/appengine/)
  47. 47. #jawsfesta PaaS • AppFog(https://www.appfog.com) • AWS Elastic Beanstalk(http://aws.amazon.com/jp/elasticbeanstalk/) • cloudControl(https://www.cloudcontrol.com) • DotCloud(https://www.dotcloud.com) • Engine Yard(http://www.engineyard.co.jp) • Google App Engine(https://developers.google.com/appengine/) • Pagoda Box(http://pagodabox.com)
  48. 48. #jawsfesta SaaS(さあす)
  49. 49. #jawsfesta SaaS
  50. 50. #jawsfesta SaaS •Gmail
  51. 51. #jawsfesta SaaS •Gmail •GitHub / Bitbucket
  52. 52. #jawsfesta SaaS •Gmail •GitHub / Bitbucket •サイボウズLive (https://live.cybozu.co.jp)
  53. 53. #jawsfesta SaaS •Gmail •GitHub / Bitbucket •サイボウズLive (https://live.cybozu.co.jp) •SendGrid (http://sendgrid.com)
  54. 54. #jawsfesta SaaS •Gmail •GitHub / Bitbucket •サイボウズLive (https://live.cybozu.co.jp) •SendGrid (http://sendgrid.com) •New Relic (http://newrelic.com)
  55. 55. #jawsfesta 本には書けなかったはなし
  56. 56. #jawsfesta SaaS
  57. 57. #jawsfesta SaaS •API経由で利用
  58. 58. #jawsfesta SaaS •API経由で利用 •SDKが用意されている場合が結構ある
  59. 59. #jawsfesta
  60. 60. #jawsfesta
  61. 61. #jawsfesta
  62. 62. #jawsfesta
  63. 63. #jawsfesta
  64. 64. #jawsfesta クラウド3つの分類のはなしでした
  65. 65. #jawsfesta クラウド3つの分類のはなしでした •IaaS (Infrastructure as a Service)
  66. 66. #jawsfesta クラウド3つの分類のはなしでした •IaaS (Infrastructure as a Service) •PaaS (Platform as a Service)
  67. 67. #jawsfesta クラウド3つの分類のはなしでした •IaaS (Infrastructure as a Service) •PaaS (Platform as a Service) •SaaS (Software as a Service)
  68. 68. #jawsfesta ええの?わるいの?
  69. 69. #jawsfesta 時と場合による
  70. 70. #jawsfesta 考えられるメリット(かなり大雑把)
  71. 71. #jawsfesta 考えられるメリット(かなり大雑把) •すぐできる
  72. 72. #jawsfesta 考えられるメリット(かなり大雑把) •すぐできる •なかったことにできる
  73. 73. #jawsfesta 考えられるメリット(かなり大雑把) •すぐできる •なかったことにできる •コスト
  74. 74. #jawsfesta 考えられるデメリット(かなり大雑把)
  75. 75. #jawsfesta 考えられるデメリット(かなり大雑把) •最後のところで融通がきかない
  76. 76. #jawsfesta 考えられるデメリット(かなり大雑把) •最後のところで融通がきかない •英語!
  77. 77. #jawsfesta 考えられるデメリット(かなり大雑把) •最後のところで融通がきかない •英語! •コスト
  78. 78. #jawsfesta 時と場合による
  79. 79. #jawsfesta まずはためしてみましょう
  80. 80. #jawsfesta
  81. 81. #jawsfesta
  82. 82. #jawsfesta About Me
  83. 83. #jawsfesta About Me
  84. 84. #jawsfesta ためしてみるにあたって
  85. 85. #jawsfesta 知っておくべき周辺技術
  86. 86. #jawsfesta ssh
  87. 87. #jawsfesta %  ssh  root@xxx.xxx.xxx.xxx       root@xxx.xxx.xxx.xxx's   password:
  88. 88. #jawsfesta %  ssh  root@xxx.xxx.xxx.xxx       root@xxx.xxx.xxx.xxx's   password:
  89. 89. #jawsfesta ssh
  90. 90. #jawsfesta ssh •パスワードは使わずに
  91. 91. #jawsfesta ssh •パスワードは使わずに •鍵のペアをつくり
  92. 92. #jawsfesta ssh •パスワードは使わずに •鍵のペアをつくり •ひとつは秘密
  93. 93. #jawsfesta ssh •パスワードは使わずに •鍵のペアをつくり •ひとつは秘密 •ひとつは相手に渡す
  94. 94. #jawsfesta ssh •パスワードは使わずに •鍵のペアをつくり •ひとつは秘密 •ひとつは相手に渡す •やりとりするときに照合して
  95. 95. #jawsfesta ssh •パスワードは使わずに •鍵のペアをつくり •ひとつは秘密 •ひとつは相手に渡す •やりとりするときに照合して •アクセスしていいよ∼
  96. 96. #jawsfesta
  97. 97. #jawsfesta
  98. 98. #jawsfesta
  99. 99. #jawsfesta
  100. 100. #jawsfesta コードのデプロイの1案(AWS)
  101. 101. #jawsfesta コードのデプロイの1案(AWS) •Git のリモートリポジトリを作る
  102. 102. #jawsfesta コードのデプロイの1案(AWS) •Git のリモートリポジトリを作る •サーバとの通信はキーペアを使ったssh
  103. 103. #jawsfesta コードのデプロイの1案(AWS) •Git のリモートリポジトリを作る •サーバとの通信はキーペアを使ったssh •サーバ側で git pull
  104. 104. #jawsfesta コードのデプロイの1案(AWS) •Git のリモートリポジトリを作る •サーバとの通信はキーペアを使ったssh •サーバ側で git pull •composer install など
  105. 105. #jawsfesta コードのデプロイの1案(Pagoda Box)
  106. 106. #jawsfesta コードのデプロイの1案(Pagoda Box) •Git のリモートリポジトリを作る
  107. 107. #jawsfesta コードのデプロイの1案(Pagoda Box) •Git のリモートリポジトリを作る •手元に git clone
  108. 108. #jawsfesta コードのデプロイの1案(Pagoda Box) •Git のリモートリポジトリを作る •手元に git clone •Pagoda Boxのリポジトリを git remote add
  109. 109. #jawsfesta コードのデプロイの1案(Pagoda Box) •Git のリモートリポジトリを作る •手元に git clone •Pagoda Boxのリポジトリを git remote add •サーバとの通信はキーペアを使ったssh
  110. 110. #jawsfesta コードのデプロイの1案(Pagoda Box) •Git のリモートリポジトリを作る •手元に git clone •Pagoda Boxのリポジトリを git remote add •サーバとの通信はキーペアを使ったssh •サーバ側に git push
  111. 111. #jawsfesta コードのデプロイの1案(Pagoda Box) •Git のリモートリポジトリを作る •手元に git clone •Pagoda Boxのリポジトリを git remote add •サーバとの通信はキーペアを使ったssh •サーバ側に git push •composer install など
  112. 112. #jawsfesta サンプルコード
  113. 113. #jawsfesta サンプルコード •https://github.com/PHP-Engineers-Training-Book/ php_mook_sample
  114. 114. #jawsfesta サンプルコード •https://github.com/PHP-Engineers-Training-Book/ php_mook_sample •デモします
  115. 115. #jawsfesta git clone %  git  clone  git@github.com:PHP-­‐Engineers-­‐Training-­‐Book/php_mook_sample.git Cloning  into  'php_mook_sample'... remote:  Counting  objects:  37,  done. remote:  Compressing  objects:  100%  (33/33),  done. remote:  Total  37  (delta  0),  reused  37  (delta  0) Receiving  objects:  100%  (37/37),  1.02  MiB  |  491  KiB/s,  done.
  116. 116. #jawsfesta
  117. 117. #jawsfesta ▾  php_mook_sample/    ▾  bin/            phpmig*  -­‐>  /Users/omoon/Documents/php_mook_sample/vendor/davedevelopment/phpmig/bin/phpmig    ▾  config/            development.php            pagoda.php    ▸  logs/    ▾  migrations/            20130711105053_CreateInitialTables.php*    ▾  public/        ▸  assets/            index.php    ▾  vendor/        ▸  composer/        ▸  davedevelopment/        ▸  doctrine/        ▸  pimple/        ▸  psr/        ▸  silex/        ▸  symfony/        ▸  twig/            autoload.php    ▾  views/            index.twig        Boxfile        composer.json        composer.lock        composer.phar*        phpmig.php
  118. 118. #jawsfesta  1  {  2          "require":  {  3                  "silex/silex":  "1.*",  4                  "doctrine/dbal":  "2.2.*",  5                  "twig/twig":  "~1.8",  6                  "davedevelopment/phpmig":  "*"  7          },  8          "config":  {  9                  "bin-­‐dir":  "bin/" 10          } 11  }
  119. 119. #jawsfesta composer install (1) $  curl  -­‐s  http://getcomposer.org/installer  |  php #!/usr/bin/env  php All  settings  correct  for  using  Composer Downloading... Composer  successfully  installed  to:  /Users/omoon/Documents/php_mook_sample/ composer.phar Use  it:  php  composer.phar
  120. 120. #jawsfesta composer install (2) %  php  composer.phar  install Loading  composer  repositories  with  package  information ... (略) ... symfony/event-­‐dispatcher  suggests  installing  symfony/dependency-­‐injection  () symfony/http-­‐kernel  suggests  installing  symfony/browser-­‐kit  () symfony/http-­‐kernel  suggests  installing  symfony/dependency-­‐injection  () symfony/http-­‐kernel  suggests  installing  symfony/finder  () silex/silex  suggests  installing  symfony/browser-­‐kit  (>=2.3,<2.4-­‐dev) silex/silex  suggests  installing  symfony/css-­‐selector  (>=2.3,<2.4-­‐dev) silex/silex  suggests  installing  symfony/dom-­‐crawler  (>=2.3,<2.4-­‐dev) silex/silex  suggests  installing  symfony/form  (>=2.3,<2.4-­‐dev) Generating  autoload  files
  121. 121. #jawsfesta  1  <?php  2  require  __DIR__  .  '/../vendor/autoload.php';  3    4  $app  =  new  SilexApplication();  5    6  $app-­‐>register(new  SilexProviderTwigServiceProvider(),  array(  7          'twig.path'  =>  __DIR__.'/../views',  8  ));  9   10  //  データベース接続情報の読込 11  $env  =  getenv('APP_ENV')  ?:  'development'; 12  $config  =  require  __DIR__  .  "/../config/$env.php"; 13  $app-­‐>register(new  SilexProviderDoctrineServiceProvider(),  array( 14          'db.options'  =>  $config['db'], 15  )); 16   17  //  トップ画面 18  $app-­‐>get('/',  function(SilexApplication  $app)  { 19          $posts  =  $app['db']-­‐>fetchAll(' 20                  SELECT  name,  message,  unix_timestamp(created)  as  created 21                  FROM  posts  ORDER  BY  created  DESC  LIMIT  5 22          '); 23          return  $app['twig']-­‐>render('index.twig',  array( 24                  'posts'  =>  $posts, 25          )); 26  }); 27   28  //  投稿処理 29  $app-­‐>post('/speak',  function(SilexApplication  $app)  { 30          $name  =  $app['request']-­‐>get('name'); 31          $message  =  $app['request']-­‐>get('message'); 32          if  ($name  &&  $message)  { 33                  $app['db']-­‐>insert('posts',  array('name'  =>  $name,  'message'  =>  $message)); 34          } 35          return  $app-­‐>redirect('/'); 36  }); 37   38  $app-­‐>run();
  122. 122. #jawsfesta  1  <?php  2  require  __DIR__  .  '/../vendor/autoload.php';  3    4  $app  =  new  SilexApplication();  5    6  $app-­‐>register(new  SilexProviderTwigServiceProvider(),  array(  7          'twig.path'  =>  __DIR__.'/../views',  8  ));  9   10  //  データベース接続情報の読込 11  $env  =  getenv('APP_ENV')  ?:  'development'; 12  $config  =  require  __DIR__  .  "/../config/$env.php"; 13  $app-­‐>register(new  SilexProviderDoctrineServiceProvider(),  array( 14          'db.options'  =>  $config['db'], 15  )); 16   17  //  トップ画面 18  $app-­‐>get('/',  function(SilexApplication  $app)  { 19          $posts  =  $app['db']-­‐>fetchAll(' 20                  SELECT  name,  message,  unix_timestamp(created)  as  created 21                  FROM  posts  ORDER  BY  created  DESC  LIMIT  5 22          '); 23          return  $app['twig']-­‐>render('index.twig',  array( 24                  'posts'  =>  $posts, 25          )); 26  }); 27   28  //  投稿処理 29  $app-­‐>post('/speak',  function(SilexApplication  $app)  { 30          $name  =  $app['request']-­‐>get('name'); 31          $message  =  $app['request']-­‐>get('message'); 32          if  ($name  &&  $message)  { 33                  $app['db']-­‐>insert('posts',  array('name'  =>  $name,  'message'  =>  $message)); 34          } 35          return  $app-­‐>redirect('/'); 36  }); 37   38  $app-­‐>run();
  123. 123. #jawsfesta  1  <?php  2  require  __DIR__  .  '/../vendor/autoload.php';  3    4  $app  =  new  SilexApplication();  5    6  $app-­‐>register(new  SilexProviderTwigServiceProvider(),  array(  7          'twig.path'  =>  __DIR__.'/../views',  8  ));
  124. 124. #jawsfesta 10  //  データベース接続情報の読込 11  $env  =  getenv('APP_ENV')  ?:  'development'; 12  $config  =  require  __DIR__  .  "/../config/$env.php"; 13  $app-­‐>register(new  SilexProviderDoctrineServiceProvider(),  array( 14          'db.options'  =>  $config['db'], 15  ));
  125. 125. #jawsfesta 17  //  トップ画面 18  $app-­‐>get('/',  function(SilexApplication  $app)  { 19          $posts  =  $app['db']-­‐>fetchAll(' 20                  SELECT  name,  message,  unix_timestamp(created)  as  created 21                  FROM  posts  ORDER  BY  created  DESC  LIMIT  5 22          '); 23          return  $app['twig']-­‐>render('index.twig',  array( 24                  'posts'  =>  $posts, 25          )); 26  });
  126. 126. #jawsfesta  1  {  2          "require":  {  3                  "silex/silex":  "1.*",  4                  "doctrine/dbal":  "2.2.*",  5                  "twig/twig":  "~1.8",  6                  "davedevelopment/phpmig":  "*"  7          },  8          "config":  {  9                  "bin-­‐dir":  "bin/" 10          } 11  }
  127. 127. #jawsfesta 28  //  投稿処理 29  $app-­‐>post('/speak',  function(SilexApplication  $app)  { 30          $name  =  $app['request']-­‐>get('name'); 31          $message  =  $app['request']-­‐>get('message'); 32          if  ($name  &&  $message)  { 33                  $app['db']-­‐>insert('posts',  array('name'  =>  $name,  'message'  =>  $message)); 34          } 35          return  $app-­‐>redirect('/'); 36  });
  128. 128. #jawsfesta 38  $app-­‐>run();
  129. 129. #jawsfesta とにかくためしてみましょう
  130. 130. #jawsfesta ありがとうございました

×