Amazon EC2にAmazon Linux AMIを使ってサイトを公開するメモ

完全私的メモ。

# やりたいこと

* VALUE DOMAINで管理しているドメインを、サブドメインだけEC2で管理したい。
* メインのドメインはXserverに残しておきたい。
* 今回はサブドメインだけのテストだけど、いずれはドメイン丸ごとEC2で動かしたい。
* 複数のWordpressを動かすかもしれないので網元とかBitnamiではなく、Amazon Linux AMIで構築したい。
* サーバーへのアップロードはSFTPを使う。

# Amazon AWSのアカウント取得

特に難しくないので、このへんを読むといいと思う。

[≫一般ブロガーやWebデザイナーがAmazon Web Service(AWS)で独自ドメインのWordpressサイトを10分で作る方法](http://brian.hatenablog.jp/entry/build-wordpress-blog-on-aws)

# リージョンを選択

画面右上で地域を選択する。国内向けに何かやるなら「東京」で問題ない。

# 作業用アカウントを作る

最初に作成したAWSアカウントは全権持った管理者そのものなので、作業用にアカウントを作成する。個人なら管理者のままでも問題ないが、複数人で作業するなら必須。

[≫グループ・ユーザー管理ページ](https://console.aws.amazon.com/iam/)
[≫最初の IAM ユーザーと管理者グループの作成](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/getting-started_create-admin-group.html)

## グループの作成

1. 左側のメニューから`グループ`
1. `新しいグループの作成`。最初のグループなので「admin」とかにするといいかも。
1. ポリシーは`AdministratorAccess`を選択。この辺は用途に応じて。
2. `グループの作成`で完了。

## ユーザーの作成

1. 左側のメニューから`ユーザー`
1. `新規ユーザーの作成`。名前は適当に。`ユーザーごとにアクセスキーを生成`はON。
1. `作成`で完了。
1. 認証情報がダウンロードできるが、現時点では何に使うのか不明。
2. `閉じる`で管理画面に戻る。
1. 作成したユーザーを選択し、右側の`グループ`タブを選択。
2. `グループにユーザーを追加`
3. 先ほど作成した「admin」を追加。

# キーペアの作成（Macの場合）

sshに必要な鍵を作成する。
Mac以外では試していないのでWindowsは不明。

1. ヘッダメニューの`サービス`から`EC2`を選択。
2. 左側のナビゲーションで`ネットワーク＆セキュリティ`＞`キーペア`。
3. `キーペアの作成`を選択。名前はこの後作るインスタンス名と同一にしておくとわかりやすいかも。
4. ダウンロードされたファイルは大切に保管する。
5. ~/.ssh/ にも鍵ファイルをコピー。さらにパーミッションを`600`に変更。

# インスタンスの作成

1. 左側のナビゲーションで`インスタンス`＞`インスタンス`。
2. 右側で`インスタンスの作成`。
3. `Amazon Linux AMI 20**.**.** (HVM), SSD Volume Type`を選択。
4. インスタンスタイプは用途に合わせてだが、無料枠なら`t2.micro`。
5. `次の手順：インスタンスの詳細の設定`を選択。デフォルトのままで`次の手順：〜`を選択。
6. `セキュリティグループの設定`では`新しいセキュリティグループを作成する`を選択。グループ名は任意で。
7. `ルールの追加`を選択し、`HTTP`を追加。必要であれば`HTTPS`も。
8. `確認と作成`
9. 確認画面になるので`作成`で完了。
10. キーペアの選択になるので、先ほど作成したキーペアを選択する。
11. `選択したプライベートキーファイル〜認識しています。`にチェックして`インスタンスの作成`。

# sshログイン（Macでターミナルを使う方法）

インスタンスの一覧から先ほど作成したインスタンスを確認する。`runnning`になったらサーバーの起動が完了している。

ついでにインスタンスに名前をつけて置くと分かりやすい。

1. 作成したインスタンスを選択して、右クリックから`接続`を選択。
2. `スタンドアロンSSHクライアント`を選択。接続方法が親切に表示される。
3. ターミナルを起動。下記コマンドを実行。「ホニャララ」の部分は適宜変更。

```
ssh -i ~/.ssh/ホニャララ.pem ec2-user@ホニャララ.ap-northeast-1.compute.amazonaws.com
```

下記のような文章が表示されるので`yes`と入力。EC2というロゴが表示されたらログイン成功。

```
Are you sure you want to continue connecting (yes/no)? yes
〜中略〜
       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|
```

# webサーバーの設定

下記を参考に。ただし、installで指定する各アプリのバージョンは2016年6月のものとなっている。

[≫チュートリアル: Amazon Linux への LAMP ウェブサーバーのインストール](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html)

```
[ec2-user ~]$ sudo yum update -y
[ec2-user ~]$ sudo yum install -y httpd24 php56 mysql55-server php56-mysqlnd
[ec2-user ~]$ sudo service httpd start
[ec2-user ~]$ sudo chkconfig httpd on
[ec2-user ~]$ chkconfig --list httpd
```

# webサーバーの接続確認

インスタンス一覧でインスタンスを選択すると、画面右下に`パブリックIP`が表示されている。それをブラウザに入力すれば表示される。

あとは下記ページの通りユーザー設定したり。
[≫チュートリアル: Amazon Linux への LAMP ウェブサーバーのインストール](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html)

## Elastic IPを設定

1. 左側ナビゲーション`ネットワーク＆セキュリティ`＞`Elastic IP`を選択。
2. `新しいアドレスの割り当て`を選択。
3. 作成されたIPアドレスを選択し、右クリックから`アドレスの関連付け`を選択。
4. `インスタンス`をクリックするとすでに作成されているインスタンスが選択できる。
4. `関連付ける`で完了。
5. 試しに関連づけられたIPアドレスでアクセスできるか、ブラウザに入力して確認。


# Route 53 でネームサーバー設定

VALUE DOMAINで管理しているドメインに、AWSのDNSを割り当てる。

## Route 53を作成

1. ヘッダメニューの`サービス`＞`Route 53`。
2. 右側の`DNS management`を選択。
3. `Create Hosted Zone`を選択。
4. 右側に`Create Hosted Zone`という枠が表示される。`Domain Name`に管理したいドメインを記載。`Type`は`Public Hosted Zone`。
5. `Create`を選択すると中断に設定項目が表示される。

最初はこんな感じになっているはず。

```
ドメイン名 NS ns-1427.awsdns-50.org.
           ns-251.awsdns-31.com.
           ns-1021.awsdns-63.net.
ドメイン名 SOA ns-1427.awsdns-50.org. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
```

## VALUE DOMAINの設定を変更

https://www.value-domain.com/modall.php

1. 上記ドメイン管理画面に行く。
2. 変更したいドメインの`ネームサーバー`を選択。
3. 登録されているネームサーバーをRoute 53で指定されたものに変更する。ns-1427.awsdns-50.org.など。
4. 全て書き換えたら`保存`。
5. ドメイン管理画面に戻り、今度は`DNS/URL`を選択。
6. 現在のIPアドレスほか、設定をメモしておく。

## 再びRoute 53の設定

現在のIPアドレスが`123.456.78.9`、ドメイン名が`hogehoge.hoge`だと仮定して書きます。
レコードの追加は`Create Record Set`から。
保存は右下の`Save Record Set`から。

### Aレコードの追加

Name : hogehoge.hoge.（最後にピリオド忘れずに）
Type : A
Value: 123.456.78.9

### MXレコードの追加

Name : hogehoge.hoge.（最後にピリオド忘れずに）
Type : MX
Value: 10 hogehoge.hoge.（最後にピリオド忘れずに）

### TXTレコードの追加

Name : hogehoge.hoge.（最後にピリオド忘れずに）
Type : TXT
Value: "v=spf1 ip4:123.456.78.9 ~all"

### サブドメインのAレコード

Name : foo.hogehoge.hoge.（最後にピリオド忘れずに）
Type : A
Value: Elastic IPで作成されたアドレス

# SFTPの設定

初期設定された`ec2-user`はrootアカウントなので、実際に使うには専用のSFTP用アカウントを使うほうが安全でしょう。さらに言えば、アクセスできるディレクトリを限定したいところです。

sshログインします。Elastic IPを設定した後はログインホスト名が変わるので気をつけてください。

## 専用ユーザーを作る

```
[ec2-user ~]$ sudo useradd sftp-www
[ec2-user ~]$ sudo passwd sftp-www
[ec2-user ~]$ sudo usermod -a -G www sftp-www
```

## RSA鍵を作る

```
[ec2-user ~]$ su sftp-www
[sftp-www ~]$ cd ~ ; mkdir .ssh ; chmod 0700 .ssh ; cd .ssh
[sftp-www ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/sftp-www/.ssh/id_rsa):  ←そのままEnter
Enter passphrase (empty for no passphrase):   ←パスフレーズ入力
Enter same passphrase again:    ←パスフレーズ再入力
```

`id_rsa`という秘密鍵と、`id_rsa.pub`という公開鍵が作られる。
パーミッションを変更してファイル名を変更する。

```
[sftp-www ~]$ chmod 0600 id_rsa.pub
[sftp-www ~]$ mv id_rsa.pub authorized_keys
```

秘密鍵をローカルPCに保存する必要があるので、`cat`コマンドで表示させ、ローカルのテキストファイルにコピー・ペーストする。

```
[sftp-www ~]$ cat id_rsa
```



## SFTPしたらサイト用ディレクトリ以外を見せない

sftpログインするとルートが`/var/log/www`になるようにしたいのですが、chrootするには対象ディレクトリのパーミッションが`root:root`である必要があります。あとchrootした上の階層のシンボリックリンクは見れないとか、とにかく色々制限があります。

色々考えた結果chroot専用ディレクトリを作ることにして、そこにサイト毎のディレクトリを作ることにしました。

```
[ec2-user ~]$ sudo mkdir -p /chroot/website1/htdocs
[ec2-user ~]$ sudo chown sftp-www:www /chroot/website1/htdocs
```

今後作られるファイルやディレクトリにグループIDが付くようにします。

```
[ec2-user ~]$ sudo chmod 2775 /chroot/website1/htdocs
[ec2-user ~]$ find /chroot/website1/htdocs -type d -exec sudo chmod 2775 {} \;
```

sshd_configを編集します。

```
[ec2-user ~]$ sudo vi /etc/ssh/sshd_config
```

```:/var/etc/ssh/sshd_config
# Subsystem sftp /usr/libexec/openssh/sftp-server 書き換え
Subsystem sftp internal-sftp

Match user sftp-www
ChrootDirectory /chroot/website1
```

sshdの再起動
```
[ec2-user ~]$ sudo service sshd reload
```

# httpd.confを書き換えてホストを割り当てる

```:/etc/httpd/conf/httpd.conf
User apache
Group www ←書き換える
```

バーチャルホスト用設定ファイルを作る。

```
[ec2-user ~]$ sudo touch /etc/httpd/conf.d/virtualhost.conf
[ec2-user ~]$ sudo vi /etc/httpd/conf.d/virtualhost.conf
```
```:/etc/httpd/conf.d/virtualhost.conf
<VirtualHost *:80>
    ServerName foo.bar.com
    DocumentRoot "/chroot/website1/htdocs"
</VirtualHost>

<Directory "/chroot/website1/htdocs">
    Require all granted
</Directory>
```


httpdの再起動
```
[ec2-user ~]$ sudo service httpd restart
```


# ひとまず完了

上記手順でひとまず完了！
SFTPのchrootでハマりまくった……。