CloudFront経由で静的ページをS3ウェブホスティング

やりたいこと

CloudFrontをたててS3にあるhtmlファイルを独自ドメインで見れるようにする
この構成をつくりたい
http://aws.clouddesignpattern.org/index.php/CDP:Cache_Distribution%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
 
参考にしたページ
Developers.IO(クラメソさんの技術ブログ、いつもお世話になってます。)
https://dev.classmethod.jp/cloud/aws/cdn-with-cloudfront-and-s3/
AWS公式
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/website-hosting-cloudfront-walkthrough.html
  

前提

 独自ドメインを持っていること

1. 準備

S3バケットを作成し、htmlファイルを置く
バケットの名前は公開するURLに合わせるのが良い
例) test.zzz.net で公開する場合、バケットの名前もtest.zzz.netにする
置いたファイルを公開する

バケットポリシー
{
  "Version": "2012-10-17" ,
  "Statement": [
    {
      "Sid": "PublicReadForGetBucketObjects",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::xxxxx.xxx.xxx/*"
    }
  ]
}
※xxxx.xxx.xxxはバケット名

準備出来たらアクセス出来るか試してみる
   

2. CloudFrontディストリビューション作成

 [CreateDistribution]-[web Distribution]のGet startedを選択
 [Origin Domain Name] をクリックするとS3バケットが選べるので、先程公開したバケットを指定
 [Alternate Domain Names]にアクセスさせる予定のCNAMEを入力(cdn.xxx.xxとか)
 [Default Root Object] にindex.htmlなど、ファイル名を入力
 [Create Distribution]で作成
 15分ぐらいで出来上がり
 出来上がったらCloudFrontのDistribution画面の[DomainName]に表示されているxxx.cloudfront.netをコピーか何かしておく

3. Route53でCNAME設定

 [Create Record set]からCNAMEを作成する
 [Name]にCloudFrontディストリ作成したCNAMEを入力
 [value]にxxx.cloudfront.netを入力
 [Save Reacord Set]で保存
   

4. CNAMEで作ったレコードでアクセスしてみる

 webページが表示されれば成功
   

5. ちょっとだけハマったこと

 最初CloudFrontのディストリ作成のところで[Default Root Object]に何も入れずに進めてアクセスしたらAccess DeniedとかなったのでRootObjectには入れておいたほうが良いのかも

AWSでEBSを動的に拡張する

EBSをオンラインで拡張する

[ec2-user@ip-172-31-6-252 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        488M   56K  488M   1% /dev
tmpfs           497M     0  497M   0% /dev/shm
/dev/xvda1      7.8G  1.1G  6.7G  14% /

EBSのメニューから
ボリュームの変更でサイズ変更
今回は8GB → 20GBに変更
5分しないぐらいで完了
※増やすことはできても減らすことは出来ないようだ

[ec2-user@ip-172-31-6-252 ~]$ sudo fdisk -l /dev/xvda
Disk /dev/xvda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00000000

    Device Boot      Start         End      Blocks   Id  System
/dev/xvda1               1    16777215     8388607+  ee  GPT

リサイズ

[ec2-user@ip-172-31-6-252 ~]$ sudo resize2fs /dev/xvda
resize2fs 1.42.12 (29-Aug-2014)
resize2fs: Device or resource busy while trying to open /dev/xvda
Couldn't find valid filesystem superblock.

起動ディスクなど、パーティション切られてるとちょっとめんどくさいみたい。
めんどくさいのでEBS作り直してもう一度

[root@ip-172-31-6-252 ~]# mount /dev/xvdf /tmp
[root@ip-172-31-6-252 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        488M   60K  488M   1% /dev
tmpfs           497M     0  497M   0% /dev/shm
/dev/xvda1      7.8G  1.1G  6.7G  14% /
/dev/xvdf       4.8G   10M  4.6G   1% /tmp

[root@ip-172-31-6-252 ~]# fdisk -l /dev/xvdf

Disk /dev/xvdf: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

5GBのディスクを10GBに拡張する

[root@ip-172-31-6-252 ~]# fdisk -l /dev/xvdf

Disk /dev/xvdf: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

[root@ip-172-31-6-252 ~]# resize2fs /dev/xvdf
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/xvdf is mounted on /tmp; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/xvdf is now 2621440 (4k) blocks long.

[root@ip-172-31-6-252 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        488M   60K  488M   1% /dev
tmpfs           497M     0  497M   0% /dev/shm
/dev/xvda1      7.8G  1.1G  6.7G  14% /
/dev/xvdf       9.8G   12M  9.3G   1% /tmp

増えとる!!


OS起動するディスクとか、パーティションが切ってあるEBSは安易に変更しないほうがいい
(当然かもしれないが)後々に拡張する可能性があるデータは別でディスクを用意するのが良い、パーティションは切らない
EBSは細かい容量でアタッチできるのでパーティション切るような運用はやめたほうがいいのかもしれない

AWS Beanstalk でdockerを使う

beanstalk触り始めの時に理解に苦しんだので備忘録。

やりたいこと
aws beanstalk dockerを使ってデプロイする

マルチコンテナを使ったwebアプリのデプロイ

まずはシンプルな構成で、
1インスタンス1コンテナを起動するところから

使った環境
操作端末:EC2 (Amazon Linux)
aws eb cliを使用


beanstalkでdockerを使うにあたって、Dockerrun.aws.jsonというファイルを作る

[ec2-user@ip-10-0-2-9 bs-docker-1]$ cat Dockerrun.aws.json 
{
  "AWSEBDockerrunVersion": "1",
  "Image": { "Name" : "nginx:latest" },
  "Ports" : [{ "ContainerPort": "80"}],
  "Volumes": [{"HostDirectory": "/var/app/current/html","ContainerDirectory": "/usr/share/nginx/html"}]}

jsonに馴染みがないので苦戦。。

今回はEC2で作ったファイルをbeanstalkのインスタンスにデプロイするという形。

Linux上でmkdirでディレクトリを作って、それを丸ごとアップデートしてデプロイする感じ。
Linuxからだとzipする必要がないらしい。
"eb create"コマンドで対話的に環境を作ることができる
アップロードされたディレクトリは、beanstalk上のインスタンスの"/var/app/current"にアップされる。

Windows環境からファイルを作成した場合はフォルダにいれないでファイルを直接zipすればOK(多分)

AWS上でのWordPress落とし穴

前回WordPressのインストールをした後の気づきです。

WordPressの表示がおかしい

AWS上のEC2インスタンスにテスト環境を作ったのですが、しばらく使わないだろうという理由で一旦シャットダウンしていました。
その後、ちょっと確認したい事があったのでEC2を起動してWordPressにアクセスしたのですが、表示が壊れている状態となっていました。

  • IP直打ちでインストールした際の注意点

調べてみるとよくある現象のようですが、インストール時にパブリックIP直打ちでインストールした場合、WordPressのサイトアドレスに「http:(IPアドレス)」と設定されてしまい、EC2のシャットダウン、起動によりサーバのIPアドレスが変わってしまうため、諸々設定が読み込めず、サイトの表示が壊れてしまうようです。

ぱっと思い浮かんだ対処としては、以下2点。
1. インストール後、EC2を落とさずにWordPressの設定からサイトアドレスを変更
 [設定]-[一般]-[サイトアドレス(URL)]を変更
2.ドメイン設定してからインストール(今回はRoute53を使用)

WordPressの管理画面から「更新」などができない

AWS上だけに限った話ではないですが、インストールディレクトリの所有者をroot等にしている場合、更新する際にFTPの情報を求められると思います。今回の環境ではwebサーバはapacheを使っているので、インストールディレクトリ(/var/www/wordpress)の所有者をapacheにしてあげることで回避可能。

chown -R apache:apache /var/www/wordpress

WordPress 4.8.2 インストールメモ

WordPress 4.8.2をインストールしたときのメモ。

環境

サーバ EC2
OS Amazon Linux 2017.09
webサーバ Apache 2.4
言語環境 php7.1
DB mysql5.7

webサーバのインストール

teratermなどからAWS上のEC2インスタンスにログイン。

今回の環境でyumhttpdのみを指定するとApache2.2がインストールされる。
php7系のインストールでうまくいかなかったので、Apache2.4のバージョンを指定。

sudo yum install httpd24

webサーバの起動と自動起動設定

sudo service httpd start
sudo chkconfig httpd on

phpのインストール

どのパッケージにどんな役割があるかどうかはよくわかりませんが、以下のパッケージをインストール。

sudo yum install php71 php71-mbstring.x86_64 php71-devel.x86_64 php71-pdo.x86_64 php71-gd.x86_64 php71-mysqlnd.x86_64

mysqlのインストール

mysql5.7をインストール。

sudo yum install mysql57-server

mysqlの設定

mysqladmin -u root password 'xxxxx' #dbのrootパスワード設定
mysql -u root -p
  mysql> create database wp; #wpという名前のdbを作成
        Query OK, 1 row affected (0.00 sec)

  mysql> grant all privileges on wp.* to wp@localhost identified by 'xxxxx'; #管理権限付与
        Query OK, 0 rows affected, 1 warning (0.00 sec)

WordPressダウンロード、解凍

WordPressのパッケージをダウンロードして解凍。

wget https://ja.wordpress.org/wordpress-4.8.2-ja.tar.gz .
tar zxvf wordpress-4.8.2-ja.tar.gz

webサーバの公開場所に保存

sudo cp -r wordpress /var/www/

webサーバのDocumentRootの変更

sudo vi /etc/httpd/conf/httpd.conf
     DocumentRoot "/var/www/wordpress" #120行目付近
  <Directory "/var/www/wordpress"> 
      AllowOverride All
      # Allow open access:
      Require all granted
  </Directory>

httpd.confの編集が完了したらサービス再起動

sudo service httpd restart

WordPress設定ファイルの編集

sudo cp /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php
sudo vim /var/www/wordpress/wp-config.php

28 /** WordPress のためのデータベース名 */
29 define('DB_NAME', 'xxxxx');
30
31 /** MySQL データベースのユーザー名 */
32 define('DB_USER', 'xxxx');
33
34 /** MySQL データベースのパスワード */
35 define('DB_PASSWORD', 'xxxxxxxx');
#先ほどmysqlで設定した内容を記載

WordPressのインストール

ブラウザからサーバへアクセスすると、以下のような画面が表示されるので、一通り入力して「WordPressをインストール」。
f:id:kawakamasu:20171014233716p:plain

vps上にメールサーバ構築

webサービスのアカウント登録などに使うための捨てアドレスが欲しかったので自前でメールサーバ構築。
以下の環境で構築開始。

サーバ Serversman@vps
OS CentOS7.0

サーバの設定

本題に入る前にvpsの設定をいじる。
 userアカウント作成 
 sshでrootログイン禁止
 SELINUX Disabled
 ホスト名変更
 iptables設定変更
  INPUT DROP
   sshのポート穴あけ
  

Postfixを設定

設定自体はwebに沢山あるので調べながら進める。
今回参考にさせてもらったのは以下のサイト。
centossrv.com


vi /etc/postfix/main.cf
※左の数字は行番号
75 #myhostname = host.domain.tld
76 #myhostname = virtual.domain.tld
77 myhostname = duck-dz.kazika.net ※追記

85 #mydomain = domain.tld
 86 mydomain = kazika.net ※追記
 
 101 #myorigin = $myhostname
102 #myorigin = $mydomain
103 myorigin = $mydomain ※追記

117 #inet_interfaces = all
118 #inet_interfaces = $myhostname
119 #inet_interfaces = $myhostname, localhost
120 inet_interfaces = localhost
↓ に変更
117 inet_interfaces = all
118 #inet_interfaces = $myhostname
119 #inet_interfaces = $myhostname, localhost
120 #inet_interfaces = localhost


168 mydestination = $myhostname, localhost.$mydomain, localhost
169 #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
170 #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
171 #       mail.$mydomain, www.$mydomain, ftp.$mydomain
↓ に変更
168 #mydestination = $myhostname, localhost.$mydomain, localhost
169 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
170 #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
171 #       mail.$mydomain, www.$mydomain, ftp.$mydomain

422 #home_mailbox = Mailbox
423 #home_mailbox = Maildir/
424 home_mailbox = Maildir/ ※追記

577 #smtpd_banner = $myhostname ESMTP $mail_name
578 #smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
579 smtpd_banner = $myhostname ESMTP unknown ※追記
master.cfを編集
#smtp      inet  n       -       n       -       -       smtpd ※コメントアウト

submission inet n       -       n       -       -       smtpd ※コメントアウト解除
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes ※コメントアウト解除
各種サービス起動
sasl起動
systemctl start saslauthd
systemctl enable saslauthd.service


Postfix起動
systemctl restart postfix.service
systemctl enable postfix.service
ln -s '/usr/lib/systemd/system/postfix.service' '/etc/systemd/system/multi-user.target.wants/postfix.service'

とりあえず以上でサーバからメール送信することはできる。


はまった箇所
 サーバから自分のgmailにメール送信したときに遅れない問題
  

  • デフォルトメールクライアントがpostfixでなくsendmailだった

  →解決:alternatives --config mta コマンドでデフォルトmailコマンドを変更

  • dnsで名前解決ができていなかった

  →iptablesでINPUTに53ポートが許可されていなかった
   これが原因でyumcurlが出来なかった
   sshでログインする際も遅かった。これはアクセス元のIPアドレスを逆引きしようとしていて、
   名前解決できずにタイムアウトしてから次の処理に進むためだった。
   ログインしたときに、"Last login: Mon Jul 17 21:24:44 2017 from xxxxx.jp"
   これを表示するときのやつ。

  • logにipv6関連のメッセージが記載してあった。

   →IPv6に対応していないサーバ環境で出るメッセージだった模様。
       postfixのmain.cfの"inet_protocols = all"を"inet_protocols = ipv4"に変更

Raspberry Pi2に無線設定

Raspberry Pi2 typeBにUSB無線ドングルを買ってきて設定。DHCPで。

あんまり安いと発熱がすごいらしいのでこちらを購入。少し使用した状態だと発熱は大丈夫そう。

sudo iwlist wlan0 scan |grep ESSID
                    ESSID:"xxxxxxxxxx"
                    ESSID:"oooooooooo"
                    ESSID:"aaaaaaaa"

wpa_passphrase <ESSID> ←検索したSSIDを指定
# reading passphrase from stdin
ここにパスワード打ち込む

以下のようにネットワークの設定が生成されるので、コピー
network={
	ssid="xxxxxxxxxx"
	#psk="hogehoge"
	psk=4923805fdgnoas0gtwn4fgntl2l410anebtpabe0
}

sudo vim /etc/wpa_supplicant/wpa_supplicant.conf 
country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
#先ほどコピーしたネットワークの設定をここに貼り付け

再起動して、ifconfigでIPが振られていることを確認。