EC2 User DataでLAMP環境を作成する

# やること

[Amazon Linux AMI 2015.03でLAMP環境を作成する](http://qiita.com/shojimotio/items/035ad7b598cd14f118e2)と同じ環境をUser Dataを使用して作成しようと思います。

起動後の確認は確認ログ/var/log/cloud-init-output.log
```
$ vim /var/log/cloud-init-output.log
```

# 基本LAMPサーバ

## yum でインストールする物

|  種類 | モジュール |
|:-----------|:------------|
|	mysql	|	mysql55 mysql55-server	|
|	httpd	|	httpd24 mod24_ssl mod24_proxy_html	|
|	php	|	php56 php56-pdo php56-mysqlnd php56-mbstring php56-opcache php56-dbg	|
|	日本語化	|	man-pages-ja	|
|	障害対応	|	dstat sysstat 	|
|	ツールその他	|	git svn multitail vim screen ag 	|

## 構築される設定

*    日本時間（JST）
*    man OS 日本語化
*    /var/www/ 2775 root:www
*    spaw作成
*    my.cnfでutf8の設定にする。
*    httpd mysqld 自動起動
*    iptables と ip6tablesを off
*    /home/ec2-user/.screenrcを作成
*    vim プラグイン管理ツール導入。初期起動時にyでプラグインインストール
*    .vimrcも自分流設定

# User Data
Amazon Linux AMI 2015.03バージョン

```bash:userdata
#!/bin/bash

yum update -y
yum install -y mysql55 mysql55-server
yum install -y httpd24 mod24_ssl mod24_proxy_html
yum install -y php56 php56-pdo php56-mysqlnd php56-mbstring php56-opcache php56-dbg
yum install -y git svn multitail tree  dstat sysstat vim screen
yum install -y man-pages-ja
rpm -ivh http://swiftsignal.com/packages/centos/6/x86_64/the-silver-searcher-0.13.1-1.el6.x86_64.rpm

# Japan setting
# for JST setting
cat <<\_EOT_ > /etc/sysconfig/clock
ZONE="Asia/Tokyo" 
UTC=false
_EOT_

cp /usr/share/zoneinfo/Japan /etc/localtime
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n

# User
groupadd www
usermod -a -G www ec2-user
chown -R root:www /var/www
chmod 2775 /var/www
find /var/www -type d -exec chmod 2775 {} +
find /var/www -type f -exec chmod 0664 {} +
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

# make swap
echo "/mnt/swapfile none swap sw 0 0" >> /etc/fstab
dd if=/dev/zero of=/mnt/swapfile bs=1M count=1280
mkswap /mnt/swapfile
swapon /mnt/swapfile

cat <<\_EOT_ > /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

[client]
default-character-set = utf8
_EOT_

# service start
service httpd start
service mysqld start
chkconfig httpd on
chkconfig mysqld on
chkconfig ip6tables off
chkconfig iptables off

cat <<\_EOT_ > /home/ec2-user/.screenrc && cat /home/ec2-user/.screenrc > ~/.screenrc
escape ^Tt
shelltitle "$ |bash" 
hardstatus alwayslastline "[%c]%`%-w%{=b bw}%n %t%{-}%+w" 
bind s
startup_message off
autodetach on
defscrollback 1024

screen
screen
screen
screen
screen
_EOT_

mkdir -p /home/ec2-user/.vim/bundle
git clone git://github.com/Shougo/neobundle.vim /home/ec2-user/.vim/bundle/neobundle.vim

mkdir -p ~/.vim/bundle
git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

chown ec2-user:ec2-user /home/ec2-user/.screenrc
chown -R ec2-user:ec2-user /home/ec2-user/.vim/


```

.vimrcはuserdataでは設定せずに、起動してからコピペする。（エラーでて変になったから）

```file:.vimrc
" 最初に記述しておいたほうが良いもの============
" 文字コードの指定
scriptencoding utf-8

" ミュートにする。
set t_vb=
set visualbell
set noerrorbells

" プラグイン管理 NeoBundle ==============================================

" ファイルタイプの自動検出をしないようになる。
" neobundleなどのプラグインを読み込むときは一度filetypeをoffにしておく必要がある
filetype off

if has('vim_starting')
      set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

call neobundle#begin(expand('~/.vim/bundle/'))

" Let NeoBundle manage NeoBundle
NeoBundleFetch 'Shougo/neobundle.vim'

" Recommended to install
" After install, turn shell ~/.vim/bundle/vimproc, (n,g)make -f
" your_machines_makefile

" ここから使いたいプラグインを書く =========================

" Dirのtree表示
NeoBundle 'scrooloose/nerdtree'
" ソースをVim上で実行
NeoBundle 'thinca/vim-quickrun'
" Markdown記法をHTMLに変換
NeoBundle 'Markdown'
" クオートや括弧の対を自動入力
NeoBundle 'Townk/vim-autoclose'
" シンタックスチェックをする
NeoBundle 'scrooloose/syntastic'

" ファイルタイプの自動検出、ファイルタイプ用の プラグインとインデント設定を自動読み込みするようになる。
filetype plugin indent on

" Installation check.
NeoBundleCheck

call neobundle#end( )

" シンタックスチェック scrooloose/syntasticの設定============================

let g:syntastic_check_on_open = 0
let g:syntastic_enable_signs = 1
let g:syntastic_echo_current_error = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_enable_highlighting = 1
let g:syntastic_php_checkers = ['php', 'phpcs', 'phpmd']
" なんでか分からないけど php コマンドのオプションを上書かないと動かなかった
let g:syntastic_php_php_args = '-l'
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

" 自分のセッティング===========================================================

" ハイライト
syntax on

" スワップファイルはいらない
set noswapfile
" バックアップファイルもいらない
set nobackup

" タブ文字を半角スペースが挿入" 
set expandtab

" 対応する括弧やブレースを表示する
set showmatch

" 行を超えてもバックスペースキーによる編集が可能
set backspace=2

" 行番号表示
set number

" ステータス行に表示させる情報の指定
set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P

" ショートカットキー マッピング ====================================================

" プラグインコマンドショートカット
map ,n <ESC>:NERDTreeToggle<CR>
map ,r <ESC>::QuickRun<CR>
map ,m <ESC>::QuickRun markdown<CR>

" 開いているPHPファイルを自動整形する
map ,f <ESC>:! php-cs-fixer fix %<CR>

" 貼り付け用
map ,a <ESC>::set paste<CR>

" Ctrl-jにESCの役割を担ってもらう。
imap <c-j> <esc>

" for php
map ,p <ESC>:!php -l %<CR>

" for perl
map ,t <ESC>:%! perltidy -q -pbp<CR>
map ,w <ESC>:!perl -wc %<CR>

" 全角スペースの表示================================================================

function! ZenkakuSpace()
    highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=darkgray
endfunction

if has('syntax')
    augroup ZenkakuSpace
        autocmd!
        autocmd ColorScheme * call ZenkakuSpace()
        autocmd VimEnter,WinEnter,BufRead * let w:m1=matchadd('ZenkakuSpace', '　')
    augroup END
    call ZenkakuSpace()
endif

" インデント Indent ==============================================================

set autoindent   " 自動でインデント
"set paste        " ペースト時にautoindentを無効に(onにするとautocomplpop.vimが動かない)
set smartindent  " 新しい行を開始したときに、新しい行のインデントを現在行と同じ量にする。
set cindent      " Cプログラムファイルの自動インデントを始める

" softtabstopはTabキー押し下げ時の挿入される空白の量，0の場合はtabstopと同じ，BSにも影響する
set tabstop=2 shiftwidth=2 softtabstop=0

" 連続インデント
vnoremap < <gv
vnoremap > >gv

if has("autocmd")
  "ファイルタイプの検索を有効にする
  filetype plugin on
  "そのファイルタイプにあわせたインデントを利用する
  filetype indent on
  " これらのftではインデントを無効に
  "autocmd FileType php filetype indent off

  autocmd FileType apache     setlocal sw=4 sts=4 ts=4 et
  autocmd FileType aspvbs     setlocal sw=4 sts=4 ts=4 et
  autocmd FileType c          setlocal sw=4 sts=4 ts=4 et
  autocmd FileType cpp        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType cs         setlocal sw=4 sts=4 ts=4 et
  autocmd FileType css        setlocal sw=2 sts=2 ts=2 et
  autocmd FileType diff       setlocal sw=4 sts=4 ts=4 et
  autocmd FileType eruby      setlocal sw=4 sts=4 ts=4 et
  autocmd FileType html       setlocal sw=2 sts=2 ts=2 et
  autocmd FileType java       setlocal sw=4 sts=4 ts=4 et
  autocmd FileType javascript setlocal sw=2 sts=2 ts=2 et
  autocmd FileType perl       setlocal sw=4 sts=4 ts=4 et
  autocmd FileType php        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType python     setlocal sw=4 sts=4 ts=4 et
  autocmd FileType ruby       setlocal sw=2 sts=2 ts=2 et
  autocmd FileType haml       setlocal sw=2 sts=2 ts=2 et
  autocmd FileType sh         setlocal sw=4 sts=4 ts=4 et
  autocmd FileType sql        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType vb         setlocal sw=4 sts=4 ts=4 et
  autocmd FileType vim        setlocal sw=2 sts=2 ts=2 et
  autocmd FileType wsh        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType xhtml      setlocal sw=4 sts=4 ts=4 et
  autocmd FileType xml        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType yaml       setlocal sw=2 sts=2 ts=2 et
  autocmd FileType zsh        setlocal sw=4 sts=4 ts=4 et
  autocmd FileType scala      setlocal sw=2 sts=2 ts=2 et
endif
```