AWS

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

More than 1 year has passed since last update.

完全私的メモ。


やりたいこと


  • VALUE DOMAINで管理しているドメインを、サブドメインだけEC2で管理したい。

  • メインのドメインはXserverに残しておきたい。

  • 今回はサブドメインだけのテストだけど、いずれはドメイン丸ごとEC2で動かしたい。

  • 複数のWordpressを動かすかもしれないので網元とかBitnamiではなく、Amazon Linux AMIで構築したい。

  • サーバーへのアップロードはSFTPを使う。


Amazon AWSのアカウント取得

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

≫一般ブロガーやWebデザイナーがAmazon Web Service(AWS)で独自ドメインのWordpressサイトを10分で作る方法


リージョンを選択

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


作業用アカウントを作る

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

≫グループ・ユーザー管理ページ

≫最初の IAM ユーザーと管理者グループの作成


グループの作成


  1. 左側のメニューからグループ


  2. 新しいグループの作成。最初のグループなので「admin」とかにするといいかも。

  3. ポリシーはAdministratorAccessを選択。この辺は用途に応じて。


  4. グループの作成で完了。


ユーザーの作成


  1. 左側のメニューからユーザー


  2. 新規ユーザーの作成。名前は適当に。ユーザーごとにアクセスキーを生成はON。


  3. 作成で完了。

  4. 認証情報がダウンロードできるが、現時点では何に使うのか不明。


  5. 閉じるで管理画面に戻る。

  6. 作成したユーザーを選択し、右側のグループタブを選択。

  7. グループにユーザーを追加

  8. 先ほど作成した「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 ウェブサーバーのインストール

[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 ウェブサーバーのインストール


Elastic IPを設定


  1. 左側ナビゲーションネットワーク&セキュリティElastic IPを選択。


  2. 新しいアドレスの割り当てを選択。

  3. 作成されたIPアドレスを選択し、右クリックからアドレスの関連付けを選択。


  4. インスタンスをクリックするとすでに作成されているインスタンスが選択できる。


  5. 関連付けるで完了。

  6. 試しに関連づけられた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に管理したいドメインを記載。TypePublic 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でハマりまくった……。