Dive into the Cloud with our buddy, lovely PHP!

9,772 views

Published on

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

Published in: Technology, Business
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,772
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
4
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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 ありがとうございました

×