AWS EC2で開発環境を作る(LAMP+laravel5.5)
はじめに
こういう便利なものが世の中にはあるそうですよ。
aws.amazon.com
アマゾンに限らず色々なとこがクラウド開発環境を提供しているので、がっつり開発に専念したい人は調べてみてはいかがでしょうか?「クラウドIDE」とかで検索するといっぱい出てくると思います。とりあえずAWSも触ってみたいなって方はお付き合いください
ところで、これから書くことはAWSの公式ガイドに詳細が記載されています。それをまとめているだけなので、細かい点は以下のリンクを確認してください。というか、むしろそっちを見ながら進めた方が早いと思います
EC2をセットアップする
1. AWSアカウントの作成
まずはここから
2. IAMユーザを作成し、管理者グループに登録
コンソールの管理権限を付与します
3. キーペアを作成
SSHで接続するときに使用します。アクセス可能な場所に秘密鍵を保存してください
4. VPCの作成
デフォルトで用意されていればスキップ可。ご自身の構成に従って作成してください
5. セキュリティグループの作成
Webserverなのでssh,http,httpsは開けてください
6. インスタンスを起動
コンソールから選択します
7. インスタンスに接続
ec2-userでログインします。好みのSSHクライアントからどうぞ。ブラウザからも可能です
8. CloudWatchアラートの設定
無料利用枠の使用状況を通知させます
Amazon Linux AMI でLAMP環境を作る
1. インスタンスに接続
2. 更新をインストール
[ec2-user ~]$ sudo yum update -y
3. Apache,MySQL,PHPとその依存関係をインストールする
[ec2-user ~]$ sudo yum install -y httpd24 php70 mysql56-server php70-mysqlnd
4. Apachを起動する
[ec2-user ~]$ sudo service httpd start Starting httpd: [ OK ]
5. システムがブートするたびにApacheが起動するように設定
[ec2-user ~]$ sudo chkconfig httpd on
6. ブラウザで確認
URLバーにパブリックDNSアドレスまたはパブリックIPアドレスを入力します。Amazon Linux AMI Test Pageが表示されればOKです
7. 所有権と許可の変更
ec2-userが/var/www以下のファイルを操作できるようにします。デフォルトの所有者はrootです。公式ガイドではapacheグループに所有権を与え、ec2-userをapacheグループに加えるという方法を採用しています
まず、ec2-userをApacheグループに追加します
[ec2-user ~]$ sudo usermod -a -G apache ec2-user
/var/www以下のユーザ所有権をec2-userに、グループ所有権をApacheグループに変更します
[ec2-user ~]$ sudo chown -R ec2-user:apache /var/www
/var/www以下のディレクトリにSGIDを設定します
[ec2-user ~]$ sudo chmod 2775 /var/www [ec2-user ~]$ find /var/www -type d -exec sudo chmod 2775 {} \;
ファイルについても同様にパーミッションを設定します
[ec2-user ~]$ find /var/www -type f -exec sudo chmod 0664 {} \;
8. SSL/TLSを有効にする
まずセキュリティグループでhttps(TCP:443)が接続可能になっているか確認してください。問題なければApachモジュールのmod_ssl をインストールし、Apacheを再起動します
[ec2-user ~]$ sudo yum install -y mod24_ssl [ec2-user ~]$ sudo systemctl restart httpd
ブラウザのURLバーにhttps://と記入してからドメインまたはIPを入力してください。普通は警告画面が表示されますが、とりあえずSSL通信はできています
自己署名でないCA署名証明書を適用する場合は、以下のガイドを参照してください。この記事ではこのまま先に進みます
LAMP環境のテスト&Mysqlの設定変更
1. ApacheのドキュメントルートにPHPファイルを作成します
[ec2-user ~]$ echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php
2. ブラウザのURLバーにパブリックDNSアドレスかIPアドレスを入力し、続けて/phpinfo.phpと入力します。PHPの情報が記載されているページが表示されればOKです
3. phpinfo.phpを削除します(セキュリティ上よろしくないようです)
[ec2-user ~]$ rm /var/www/html/phpinfo.php
4. Mysqlのrootパスを設定する。途中の質問はYで回答してください
[ec2-user ~]$ sudo mysql_secure_installation
//匿名ユーザを削除する Remove anonymous users? [Y/n] Y //リモートrootログインを無効にする Disallow root login remotely? [Y/n] Y //テストDBを削除する Remove test database and access to it? [Y/n] Y //権限テーブルをリロードし、更新を反映する Reload privilege tables now? [Y/n] Y
これで無事LAMPサーバーを構築できました。さっそくLaravelも入れたいところですが、ついでにDBをブラウザから操作できるphpMyAdminを導入したいと思います。
phpMyAdminは使わないよって人は読み飛ばしてください
phpMyAdminのインストール
Amazon LinuxではphpMyAdminの自動インストールをサポートしてないそうなので、手動で行います
1. yumコマンドで依存ファイルをインストールします
[ec2-user ~]$ sudo yum install php70-mbstring.x86_64 php70-zip.x86_64 -y
2. Apacheを再起動します
[ec2-user ~]$ sudo systemctl restart httpd
3. Apacheのドキュメントルートに移動します
[ec2-user ~]$ cd /var/www/html
4. https://www.phpmyadmin.net/downloadsから最新のパッケージのリンクをコピーし、ダウンロードします
[ec2-user html]$ wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
5. パッケージを解凍し、ディレクトリ名を管理しやすい名前に変更します
[ec2-user html]$ tar -xvzf phpMyAdmin-latest-all-languages.tar.gz [ec2-user html]$ mv phpMyAdmin-4.x.y-all-languages phpMyAdmin
6. ブラウザのURLバーにパブリックDNSかIPを入力し、続けて/phpMyAdminと入力します。ログインページが表示されればOKです。Mysqlで設定したパスを元に、rootでログインしてください
Composerの導入とLaravelのインストール
Laravelをインストールする前に、ライブラリ管理ツールのComposerをインストールします。Composerって何?という方は以下のリンク等をご参照ください
[ec2-user ~]$ curl -sS https://getcomposer.org/installer | sudo php [ec2-user ~]$ mv composer.phar /usr/local/bin/composer [ec2-user ~]$ sudo ln -s /usr/local/bin/composer /usr/bin/composer
/var/wwwの下にLaravelプロジェクトを作成します
[ec2-user ~]$ cd /var/www [ec2-user www]$ composer create-project --prefer-dist laravel/laravel
ところで、t2.microインスタンス(無料枠のデフォルトインスタンス)はメモリが1GBとかなり低いため、メモリ不足でインストールできないことがあります
Cannot allocate memory等とエラーが吐き出されますが、この場合、Swap領域を作成することで解決できる可能性があります
以下、スワップファイルの作成(swapfile1に空データを1Mブロック毎に512回出力)→パーミッション変更→スワップ領域を作成→スワップサイズの確認を行います
[ec2-user ~]$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512 [ec2-user ~]$ sudo chmod 600 /swapfile1 [ec2-user ~]$ sudo mkswap /swapfile1 [ec2-user ~]$ swapon -s
メモリ不足だった方は、再度Laravelのインストールを試みてください
無事Laravelがインストールされたら、Apacheのドキュメントルートを変更します(/var/www/laravel/publicがlaravelのホームです)
httpd.confを直接変更することも可能ですが、変更箇所を明確にし管理しやすくするために、別に*.confファイルを用意します
/etc/httpd/conf.d下に配置された*.confの設定をApacheは認識してくれます。今回は仮にcustom.confとします
[ec2-user ~]$ sudo vi /etc/httpd/conf.d/custom.conf
viはlinuxの標準のテキストエディタを起動するコマンドです。操作方法などは別途お調べください
DocumentRoot "/var/www/laravel/public"
Apacheを再起動します
[ec2-user ~]$ sudo service httpd restart
ブラウザからアクセスしてみてください。Laravelのトップ画面が表示されれば完了です
ただ、ここで一つ問題があります。ブラウザからphpMyAdminにアクセスするときはURLバーに「http://パブリックDNSまたはIP/phpMyAdmin」と入力しました
しかし、今のドキュメントルートは/var/www/laravel/publicなので、public直下にphpMyAdminがインストールされていないと上記のURLでは見れません
そこで、custom.confにAlias設定を追記して/phpMyAdminでアクセスできるようにマッピングします
[ec2-user ~]$ sudo vi /etc/httpd/conf.d/custom.conf
Alias /phpMyAdmin "/var/www/html/phpMyAdmin"
Apacheを再起動し、ブラウザから~/phpMyAdminでアクセスできればOKです
ただし、セキュリティ上/phpMyAdminでアクセス可能にしておくことは好ましくありませんので、/dbmanager等、任意の名前に変更しておきます
また、通常のhttp通信では送信フォームの内容(ユーザ名、パス)がそのまま送信されてしまいますので、phpMyAdminへのアクセスはhttps必須にします
[ec2-user ~]$ sudo vi /etc/httpd/conf.d/custom.conf
<Directory "/var/www/html/phpMyAdmin"> SSLRequireSSL </Directory>
Apacheを再起動し、まずはブラウザから普通にhttpでphpMyAdminにアクセスしてみてください。Forbidden(閲覧禁止)が表示されるはずです
次に、httpsでアクセスしてみてください。自己署名証明書の場合は警告が出ますが、警告を無視して進めばphpMyAdminのページが表示されます
データベースへの接続設定
viで/var/www/laravel/.envを開きます
[ec2-user ~]$ vi /var/www/laravel/.env
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=作成したデータベースの名前 DB_USERNAME=設定したユーザー名 DB_PASSWORD=設定したパスワード
上記の部分を設定してください。まだデータベースを作ってない方は、phpMyAdminから作成してみてください。
次に、/var/www/laravel/config/database.phpを編集します
[ec2-user ~]$ vi /var/www/laravel/config/database.php
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', '作成したデータベースの名前'), 'username' => env('DB_USERNAME', '設定したユーザー名'), 'password' => env('DB_PASSWORD', '設定したパスワード'), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null,