JETWAREでラクラクLAMP環境構築(AWS&ローカルPC)


![jetware_www.png](https://qiita-image-store.s3.amazonaws.com/0/143591/efdcbd82-65c7-0165-bc5a-b87d87851af7.png "jetware_www.png")

ローカルPC(MacやWindows)にLAMP環境を構築するのに、MAMPやScotch Boxを使っているという方は多いかと思います。 また、AWSに商用環境/ローカルPCに開発環境を作る場合などは、BitnamiのLAMP環境を使うという方もいらっしゃると思います。

上記の方法は色々と紹介されているようですので、今回はそれ以外の方法、ということで「JETWARE」アプライアンスを利用した環境構築方法をご紹介しようと思います。これを使うことで、本番環境と同様の構成で素早くローカルの開発環境を立ち上げることができます。こちらは最近仕事でまとめた手順を公開用に一部手直ししたものです。

# 症状と効能

特にこのような方によく効きます。

- 環境構築よりコーディングに集中したい人
- AWSと同じ環境をローカルPCに作るのが面倒と感じている人
- 開発チームで仮想コンテナ等を導入したいが、メンバーのスキルレベルと温度差で導入が進まず苦労している人
- DockerやECS(EC2 Container Service)の商用利用に不安を感じている人

仮想コンテナを個人の興味でお試し程度に触る分には、手間も学習コストもあまり関係ありませんが、会社の開発チームで導入となるとすんなりとはいかないことが多いと思います。案件の性質や、システム管理・運用の都合、メンバーの温度差など、色々な諸事情が絡んでしまい、導入が難しいこともままあるかと思います。

今回構築する環境は

- AWS商用環境は、普通のEC2＋AMI
- ローカルPC開発環境はVirtualBox+Vagrantで構築（Vagrantが面倒なら、それも不要）
- 開発環境はVMイメージまたはVagrantFileで共有

ということで、構築も簡単で、複雑な手順や学習も不要であるため、チーム内でも拒絶反応は少ないのではないかと思います（少なくとも、Dockerでのデプロイよりは）。

# 注意事項

AWSは使わない、ということなら別にMAMPでもScotch Boxで十分だと思いますし、BitnamiのUbuntuベースのLAMP環境に満足されているのであれば、今回の方法を知る必要もないかと思いますので悪しからずご了承ください。

それでは早速環境構築手順に移りたいと思います。

# EC2の環境構築

## AMI「Optimized LAMP Stack PHP 5.6」を使ったインスタンス作成

今回は[Jetware](http://jetware.org/)が提供するアプライアンスを使います。 [awsmarketplace](https://aws.amazon.com/marketplace/pp/B01LXDV315)で選択します(０円です).

今回選んだ「lamp_php56_optimized」の構成はこのような感じです。

![jetware_lamp_php56.png](https://qiita-image-store.s3.amazonaws.com/0/143591/2291b932-eeca-c907-14ce-9c956c2511bd.png "jetware_lamp_php56.png")

その他、インストールディレクトリなど詳細情報は[こちら](http://jetware.org/appliances/aws/lamp_php56_optimized#appliancerelease_profile)を参照ください。

EC2上にも開発環境や動作確認環境を構築するのであれば、このAMIを選んでEC2のインスタンスを作成するだけで完了です（EC2インスタンスの起動方法は、AMIを選択するところ以外は通常の手順とまったく同じですので、割愛します）。必要なものは全て/jet以下に配置してあります。

バックエンドはRDSなんだけど、という場合には、mariadbのデーモンを停止して、そのままフロントエンドのWebサーバとして使うのが手間なく簡単です。

ミドルウェアの構成を変えたい方は、構成違いのアプライアンスを[こちら](http://jetware.org/appliances/aws/)から選ぶというのでも良いかと思います。今回は他社製組込モジュールの制約上、PHP5.6を選択しましたが、PHP7.xのアプライアンスも用意されてます。お好みでどうぞ。

以上で、EC2の環境構築は完了です（はや）。

# ローカルPCの環境構築

まずは事前準備としてVirtualBoxを用意します。 

VirtualBox本体のダウンロード：[macOS版dmg(ver. 5.1.6)](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp)

![virtualbox_download.png](https://qiita-image-store.s3.amazonaws.com/0/143591/154bcc43-7f6b-f5b2-9ffd-89406104d9c9.png "virtualbox_download.png")

ダウンロードしたdmgファイルをダブルクリックしてインストール完了です。

さて、上記のAWSと同じJETWAREのアプライアンス環境をローカルに構築するには、以下の3つの方法があります。

1. VirtualBoxイメージをダウンロードして設定
2. VagrantFileを用いて環境設定
3. Linux環境から環境設定用のシェルスクリプトを実行。

お手軽なのは１です。違いはチームメンバー間で共有・配布する手段です。 １ならVMイメージを、２ならVagrantFileを共有すればOKです。各自の事情にあわせてお選びください。３の方法は、お好きなLinux OS上にJETWAREアプライアンスを再現する方法です。オンプレに開発サーバ等を別途立てる場合にはこの方法でも良いでしょう(今回はローカルPCに環境を構築するという主旨ですので、３の説明は割愛します)。 以下に、それぞれの手順を記します。

## １．VirtualBoxイメージをダウンロードして設定

イメージファイル(ova)のダウンロード：[centos7版ダウンロード](http://jetware.org/appliances/aws/lamp_php56_optimized/assembly/image:vm:virtualbox?os=centos_7)

![jetware_vmdownload.png](https://qiita-image-store.s3.amazonaws.com/0/143591/9cfe87af-4aea-8400-de99-5aa961ebc337.png "jetware_vmdownload.png")

Virtual MachineのOSは、CentOS7,Debian8/Ubuntu14.04からお好きなものを選べます。AWS側がAmazon Linux(CentOSベース)であることを鑑み、今回はCentOS7を選びました(Cent6.5があれば尚良かったんですが)。

VirtualBoxを起動して、Finderメニュー＞ファイル＞「仮想アプライアンスのインポート」を選択。

![virtualbox_menu.png](https://qiita-image-store.s3.amazonaws.com/0/143591/77dbf8c6-4d12-1f27-87d0-f8d8c1fe2f0d.png "virtualbox_menu.png")

画面の指示に従ってインストール完了したら、起動。これで完了です。/jet以下に、同じ構成でアプリケーションがインストールされています。ログインIDとパスワードは以下の通りです。

User | Password
---- | --------
jet  | jet

その他デフォルトのセッティングに関する詳細は[こちら](http://jetware.org/appliances/aws/lamp_php56_optimized#appliancerelease_profile_config_show)を参照してください。

デーモン(サービス)の起動・停止は、Upstart(start/stopコマンド)で制御できます。

```bash:サービスの開始・停止
$ start apache
$ stop memcached
$ restart mysqld
```

以上。とても簡単ですね。

--------------------------------------------------------------------------------

## ２．VagrantFileを用いて環境設定

Vagrantで制御したい場合は、こちらの方法で環境を構築します。こちらも簡単です。

### 2-1. Vagrantインストール

[vagrantのダウンロードページ](https://www.vagrantup.com/downloads.html)

![vagrant_download.png](https://qiita-image-store.s3.amazonaws.com/0/143591/e7a0331f-2f55-c0bf-519c-24300817d898.png "vagrant_download.png")

dmgファイルをダブルクリックしてインストール完了。

Terminalを起動して、以下のコマンドが正常実行できればOKです。

```bash:バージョン表示
$ vagrant -v
Vagrant 1.8.6
```

### 2-2\. Boxファイルを登録

![jetware_vagrant_add.png](https://qiita-image-store.s3.amazonaws.com/0/143591/80de1fdc-4d48-71f5-f035-e860e179dc8c.png "jetware_vagrant_add.png")

記載のとおり、Terminalから以下のコマンドを実行して、Boxファイルのイメージをダウンロードしてaddします。

```bash:boxファイル追加
$ vagrant box add "http://jetware.org/appliances/aws/lamp_php56_optimized/download/image:base_image:vagrant?os=centos_7" --name "jetware/aws-lamp_php56_optimized-centos_7"
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'jetware/aws-lamp_php56_optimized-centos_7' (v0) for provider:
    box: Downloading: http://jetware.org/appliances/aws/lamp_php56_optimized/download/image:base_image:vagrant?os=centos_7
==> box: Successfully added box 'jetware/aws-lamp_php56_optimized-centos_7' (v0) for 'virtualbox'!
```

ダウンロードしたBoxファイルが利用可能かを確認して起動します。

```bash:一覧表示
$ vagrant box list
jetware/aws-lamp_php56_optimized-centos_7 (virtualbox, 0)
```

仮想サーバ初期化 (Vagrantfileが生成されます)

```bash:初期化
$ vagrant init jetware/aws-lamp_php56_optimized-centos_7
```

仮想サーバ起動

```bash:起動
$ vagrant up
```

以上で、Vagrantを使った環境構築は完了です。
こちらも手順どおりやるだけで、とても簡単に構築できました。

Vagrantの詳しい使い方に関しては、別の参考文献を当たってください。以下に基本的な使い方だけ抜粋して紹介しておきます。

### 2-3\. 仮想サーバ初期化、起動、停止

仮想サーバ初期化 (Vagrantfileが生成されます)

```bash:初期化
$ vagrant init jetware/aws-lamp_php56_optimized-centos_7

A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

仮想サーバ起動 (以下の起動メッセージでは、SSHのポートは2200にマッピングされているのがわかります)

```bash:起動
$ vagrant up

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'jetware/aws-lamp_php56_optimized-centos_7'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: sample_default_1475743729445_85292
==> default: Fixed port collision for 22 => 2222\. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2200
    default: SSH username: vagrant
    default: SSH auth method: private key
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 5.0.16
    default: VirtualBox Version: 5.1
==> default: Mounting shared folders...
    default: /vagrant => /Users/tkikuchi/Documents/VirtualBox/sample
```

起動状態の確認

```bash:状態表示
$ vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
```

仮想サーバの再起動

```bash:再起動
$ vagrant reload

==> default: Attempting graceful shutdown of VM...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2200
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 5.0.16
    default: VirtualBox Version: 5.1
==> default: Mounting shared folders...
    default: /vagrant => /Users/tkikuchi/Documents/VirtualBox/sample
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.
```

### 2-4\. 仮想サーバの設定変更

前述の`$ vagrant init box名`を実行すると、カレントディレクトリに設定ファイル「Vagrantfile」が生成されています。

```bash:設定ファイル「vagrantfile」の作成
$ ls -la
total 8
drwxr-xr-x  4 tkikuchi  staff   136 10  6 17:48 .
drwxr-xr-x  4 tkikuchi  staff   136 10  6 17:16 ..
drwxr-xr-x  3 tkikuchi  staff   102 10  6 17:48 .vagrant
-rw-r--r--  1 tkikuchi  staff  3045 10  6 17:47 Vagrantfile
```

「Vagrantfile」の編集

```bash:viで編集
$ vi ./Vagrantfile
```

例） IPアドレスをスタティックに設定

```bash:
# IPアドレス設定 サンプル
config.vm.network "private_network", ip: "192.168.33.10"
```

例）ローカルPCのカレントディレクトリを、仮想サーバの /var/www/html に同期。

```bash:
# フォルダ同期 サンプル
config.vm.synced_folder ".", "/var/www/html",
     :owner => "vagrant",
     :group => "vagrant",
     :mount_options => ["dmode=775,fmode=775"]
```

例）yumでpostfixの追加インストール

```bash:
config.vm.provision "shell", inline: <<-SHELL

# Git
yum install -y postfix

SHELL
```

その他記法の詳細は、[こちら](https://www.vagrantup.com/docs/vagrantfile/)を参照してください。

手動プロビジョニング

```bash:
$ vagrant provision
```

### 2-5\. 仮想サーバ基本操作コマンド

仮想サーバログイン

```bash:
$ vagrant up  ... 起動
$ vagrant ssh  ... sshでログイン
```

IPアドレスとポートを指定してSSH接続も可能

```bash:loopbackアドレスに接続
$ ssh jet@127.0.0.1 -p 2200
```

### その他 主要操作コマンド(詳細はvagrant -h)

box追加

`$ vagrant box add {VM名} {boxファイルダウンロードURL}`

利用可能box一覧

`$ vagrant box list`

boxの削除

`$ vagrant box remove {box名}`

初期化(Vagrantfile作成)

`$ vagrant init`

起動

`$ vagrant up`

SSH設定確認

`$ vagrant ssh-config`

仮想サーバにSSHログイン

`$ vagrant ssh`

シャットダウン

`$ vagrant halt`

再起動

`$ vagrant reload`

サスペンド

`$ vagrant suspend`

レジューム

`$ vagrant resume`

破棄

`$ vagrant destroy`

以上です。Vagrantを使っても、とても簡単に環境構築ができました。手順どおり行えば誰でもできますので、ぜひ皆さんの環境でもお試し頂ければと思います。

# 最後に

S3を介さず、EC2とローカルPC環境とのファイル同期をしたいとき、皆さんどうされているんでしょうか。今のところlsyncd、rsyncdやownCloudくらいしか思いつきません。他にベスト・プラクティスをご存知の方がいらっしゃいましたらぜひご教授ください。