巨人の足元でたじlog

そうして言葉を軽んじるから――― 君は私の言葉を聞き逃す

AWSで典型パターンのウェブサービスを1から構築してみる備忘録

2019/02/02 17:01 タイムトライアル始めます。

手を動かしながら2週間で学ぶ AWS 基本から応用まで | Udemy
これをベースにしつつ、自分なりに理解しながらやっていきます。

ドメイン取得

まずは、時間がかかるので最初にドメインを取っておきます。

ドメイン 無料」で検索。

https://my.freenom.com

これが良さそうでした。

適当なドメインを考えて、チェック。

空いているドメインだったので、選択してチェックアウトします。

Googleアカウントで登録。メールが飛んでいるので、認証します。

入力項目は、デフォルトの状態で一旦登録して、バリデーションかかったやつだけ入力します。

「アドレス 英語」

JuDress | 住所→Address変換

500回使ってるサイト

なんか登録がうまくいかないので、別のサービス使います。

無料で独自ドメインを取得できる!無料ドメインの取得サービス6選|ferret [フェレット]

に出てくる、Dot TK - 新しい無料ドメインを探しますを使います。

と思ったけど、フォーム画面じゃないのでギリセーフかもしれないけど、通常ページがhttps通信じゃないし、ドメイン選択したら、結局freenomのページにリダイレクトされた。糞。

しゃあなしで、無料ダイナミックDNS(DDNS)サービス - ieServer.Netをやる。

と思ったけど、無料ドメインと無料ダイナミックドメインはちょっと別物?

これは積んだーかと思ったところに、「これはブラウザの問題なのでは?」という僥倖。

safariから登録したら完了しましたー!

取得ができましたー!

取得したドメインにアクセスしても何も起きません。

このサイトにアクセスできません hogehoge.tk のサーバーの IP アドレスが見つかりませんでした。 となる。

そりゃそう。

Route53

Route53 > Dashboard > Hosted zone > Create Hosted Zone

Domain Name: freenomで取得したドメイン
Comment: 
Type: Public Hosted Zone

NSのvalueに4つのdnsがあるので、これを控えておきます。

freenomのページのドメインのManagementページに移ります。

DNSサーバー名を入力する場所があるので、4つのDNSを入力して保存します。

→まだ反映されていないです。
反映には数時間から数日かかるらしいです。

なので、一旦待ちます。ここまで約50分! くっそー登録に無駄に不要な時間かかってしまったためだ。

正味この作業は10分で終わるはずだった。。。

VPCをつくる。

最終的に目指す構成としては、一番ベタな構成を作っていきたい。 すなわち以下のような構成。

と、パワーポイントで作ろうとしたけど、プライベートMacパワポ入れてなかったので、Googleプレゼンテーションで作ることに。
と、 ちょっと様式が違って面倒くさかったので、紙でかく。これが一番早い。

f:id:benzenetarou:20190202180053j:plain

VPCをつくる

基本方針としては、デフォルトを使用する。
やむを得ず設定する場合は、ちゃんと意味を理解して設定することにします。

VPC > Create VPC

Name tag: hogehoge
IPv4 CIDR block: 10.0.0.0/16
IPv6 CIDR block: No IPv6 CIDR Block (default)
Tenancy: Default (後で調べる)

サブネットをつくる

今回は4つのサブネットを作りたいと思います。 CIDRブロックをどうしようか。
10.0.0.0/16が 65536 - 5(AWSの予約分) = 65531なので、
一旦はわかりやすさのために/24とかで切ります. 10.0.0.0 - 10.0.0.255ですね 作ったサブネットのサイダーたちは以下

10.0.0.0/24 hoge-a-public
10.0.1.0/24 hoge-a-private
10.0.2.0/24 hoge-c-public
10.0.3.0/24 hoge-c-private

この時点では、まだこの子たちはプライベートサブネットとか、パブリックサブネットとか、何も設定されていません。
サブネットは生まれながらにして、パブリック/プライベートと決まっているわけではないのです。
人は生まれた瞬間には善で、その後の人生で悪に染まっていくという性善説とは違いますね。
ほんとに余談ですが、性善説に意味については誤解して認識している人が多いです。性善説と性悪説のよくある誤解、他 いわゆる誤解されて使われている意味を表す言葉はないのでしょうかね?これは余談が過ぎた。

ルーティング

この作成したサブネットたちの運命を決めるのは、すべてルーティングなんですね。
f:id:benzenetarou:20190202182745p:plain

ルートテーブル↓
f:id:benzenetarou:20190202182740p:plain

これを見ると
送信先: 10.0.0.0/16
ターゲット: local
とある。 つまり10.0.0.0/16への通信はすべてlocalに向かうという意味だ。
他の通信は? まだ定義されていない。
4つのサブネットはすべて同じルートテーブルの設定になっていた。

とりあえずこのままEC2を立ててみよう。

EC2を起動する。

一旦10.0.0.0/24 hoge-a-publicにEC2を起動します。
基本はデフォルトオプション。 パブリックIPは有効にしました。

$ ssh -i .ssh/my_aws_key.pem ec2-user@xxx.xxx.xxx.xxx

と、つながらない。igwが設定されていないので、これは閉じたサブネットになっているからか。 igwを設定していきます。

ということで失敗パターンでした。

インターネットゲートウェイを作成

名前をつけて作成します。
作成したインターネットゲートウェイVPCにアタッチするだけの簡単なお仕事です。
これで晴れてこのVPCはインターネットに繋がることができました。

ただ、まだVPC自体にigwをアタッチしただけで、ルートテーブルには設定していないので、igwとサブネットが分断されています。

ルートテーブルを作成

ルートテーブルはプライベートサブネット用とパブリックサブネット用に2つ作成します。
既存のルートテーブルは f:id:benzenetarou:20190202182740p:plain だったので、プライベートサブネットでははこちらを引き続き利用します。
パブリックサブネットでは、これに加えて、10.0.0.0/16以外の通信はインターネットゲートウェイに通じてほしいので、igwを追加したルートテーブルを作成します。

Create route tableします。
以下のような状態にします。

f:id:benzenetarou:20190202185638p:plain

このパブリックサブネット用のルートテーブルが作成できたら、パブリックサブネットのルートテーブルをこれに変更します。

EC2にssh接続

先程の状態ではssh接続できなかったEC2が、果たして接続できるようになっているのかっ?
$ ssh -i .ssh/my_aws_key.pem ec2-user@xxx.xxx.xxx.xxx

できました!勝ち!!

ルートテーブル完全に理解しました。

ここまで約1時間! ちょっとかかり過ぎな気もするけど、どこかでアホミスをしていたわけではないので、及第点とします。
デフォルトで何がどこまで作成されるのかを整理できたので良かった!

2019/02/02 19:16

EC2出の細かい設定

Amazon Linux 2でPHP7.2をインストールする - Qiita php7.2用にamazon-linux-extrasを使う。

sudo yum update - y
sudo yum install -y httpd
sudo amazon-linux-extras install php7.2
sudo yum install -y php php-mbstring php-pdo php-mysqln
sudo vi /etc/httpd/conf/httpd.conf

以下のように変更

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>
sudo yum install -y git
git clone https://github.com/ketancho/udemy-aws-14days.git
cd udemy-aws-14days/Day3
sudo cp -r . /var/www/html
sudo chkconfig on
sudo service httpd start

コンテンツ表示は本質ではないので、udemu作者さんが書いたサンプルコードを利用させてもらいます。 これでxxx.xxx.xxx.xxxにアクセスします。 とりあえず、表示されましたー

ここまで約40分。ちとかかり過ぎかな?

2019/02/02 21:27

プライベートサブネットにDBを作成する

プライベートサブネットにDB用のサーバーを作成します。

自分のローカルPC(グローバル)から直接はssh接続できないので、エージェントフォワードでssh接続したい。
鍵の情報をサーバーの中においておくのはあまりよろしくないと思うので、この方法を採用。

sshエージェントフォワード

ssh-agentを利用して、安全にSSH認証を行う - Qiita
ちょっとよくわからなかった。

ssh agent forwardingを行うサーバー側の要点の備忘録 - Qiita
これはわかりやすかった。

Macでやること

# 鍵の登録
ssh-add .ssh/my_aws_key.pem

# 確認
ssh-add


# 踏み台サーバーにssh接続
$ ssh -i .ssh/my_aws_key.pem ec2-user@xxx.xxx.xxx.xxx

$ sudo  vi /etc/ssh/ssh_config

# AllowAgentForwarding yes がコメントアウトになっているので外して有効化

$ exit


# macから。鍵の指定は必要ない!
$ ssh -A ec2-user@xxx.xxx.xxx.xxx

# プライベートサブネットのサーバーにssh接続
$ ssh aaa.aaa.aaa.aaa 

# 接続できましたー888888

NATゲートウェイを使用してプライベートサブネットから通信可能にする

$ sudo yum update -y

をしようとすると、インターネットに繋がっていないので、失敗する。 パブリックサブネットにNATゲートウェイを作成しました。
プライベートサブネットに適用されているルートテーブルの0.0.0.0/0の向き先を作成したNATゲートウェイに変更します。

その後

$ sudo yum update -y

をすると、正常に通信できているようです!やった!

mysqlを入れます。

sudo yum install -y mysql57-server
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
パッケージ mysql57-server は利用できません。
エラー: 何もしません

おいおいおいおい。
AWSのEC2で行うAmazon Linux2(MySQL5.7)環境構築 - Qiita
Amazon linux2はやはりいろいろと勝手が違うことが多いようだ。
これをみるに、まずは

l$ amazon-linux-extras list
  0  ansible2                 available    [ =2.4.2  =2.4.6 ]
  2  httpd_modules            available    [ =1.0 ]
  3  memcached1.5             available    [ =1.5.1 ]
  4  nginx1.12                available    [ =1.12.2 ]
  5  postgresql9.6            available    [ =9.6.6  =9.6.8 ]
  6  postgresql10             available    [ =10 ]
  8  redis4.0                 available    [ =4.0.5  =4.0.10 ]
  9  R3.4                     available    [ =3.4.3 ]
 10  rust1                    available    \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2  =1.31.0 ]
 11  vim                      available    [ =8.0 ]
 13  ruby2.4                  available    [ =2.4.2  =2.4.4 ]
 15  php7.2                   available    \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11  =7.2.13 ]
 16  php7.1                   available    [ =7.1.22  =7.1.25 ]
 17  lamp-mariadb10.2-php7.2  available    \
        [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5
          =10.2.10_7.2.8  =10.2.10_7.2.11  =10.2.10_7.2.13 ]
 18  libreoffice              available    [ =5.0.6.2_15  =5.3.6.1 ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =17.12.1  =18.03.1  =18.06.1 ]
 21  mate-desktop1.x          available    [ =1.19.0  =1.20.0 ]
 22  GraphicsMagick1.3        available    [ =1.3.29 ]
 23  tomcat8.5                available    [ =8.5.31  =8.5.32 ]
 24  epel                     available    [ =7.11 ]
 25  testing                  available    [ =1.0 ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    [ =1.8.0_192  =1.8.0_202 ]
 28  firecracker              available    [ =0.11 ]
 29  golang1.11               available    [ =1.11.3 ]
 30  squid4                   available    [ =4 ]

で確認してみるとな。
なるほど、このリポジトリ?にメジャーなミドルウェアとかは用意されている的なことなんだろう。
しかし今回はmysqlはその中になかったと。
なのでこの記事では、自前で公式mysqlリポジトリを追加しようとしている。
自分はepelの文字列を確認できたのでepelから落としてみようかと思う。

sudo amazon-linux-extras install -y epel
yum --enablerepo=epel search mysql
.
.
.

よくわからない結果が出てきたので、やめる。
というよりは、epelにはmysql-serverはなさそうだった。remiにはあるっぽいけど、どうせremiの追加が必要ならmysqlの公式使うわ。

# リポジトリの追加
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm -y

#mysql8.0リポジトリの無効化
sudo yum-config-manager --disable mysql80-community

#mysql5.7リポジトリの有効化
sudo yum-config-manager --enable mysql57-community

#mysql5.7がインストールできるか確認
$ yum info mysql-community-server


#mysqlインストール
sudo yum install mysql-community-server -y
mysqld --version

# 起動設定&start
sudo service mysqld start
sudo chkconfig mysqld on

AWSのEC2で行うAmazon Linux2(MySQL5.7)環境構築 - Qiitaを途中までやっていたけど、mysqlのセットアップは本質的なところじゃないから、今は必要なかったんだよなーそこでの頑張りは。

#rootパスワードを確認
$ cat /var/log/mysqld.log | grep password
A temporary password is generated for root@localhost: ************

ここで表示されたパスワードをそのまま使用しようとしたら、ログインはできたけど、create databaseできなかった。再作成しないとだめだったらしい。

mysql_secure_installation

パスワード変更。パスワード様式の要求が面倒くさかった。Mysql 5.7* パスワードをPolicyに合わせるとめんどくさい件について - Qiita

mysql -u root -p

create database simple_blog;

use simple_blog;

create table posts (id int not null primary key, title varchar(100), detail varchar(1000), image varchar(1000));

insert into posts values (1, "XXXX", "XXXXXXXXXX", "./img/img1.jpeg");

insert into posts values (2, "YYYY", "YYYYYYYYYY", "./img/img2.jpeg");

grant all privileges on *.* to root@"%" identified by 'PASSWORD_hogehoge' with grant option; 

webサーバー側からmysql -h x.x.x.x -u root -pでDBサーバーに接続するとのことだったけども、

$ mysql -h 10.0.1.35 -u root -p
-bash: mysql: コマンドが見つかりません

そりゃそうだ。。入れてないもんそんなもの。

おとなしく旧バージョンのOSでやればよかった。 webサーバーを作り直す。

旧バージョンのOSで作り直した方は、ssh-agentでうまく行かず
もういいや鍵コピーする。

諸々できましたー
途中面倒くさくなって省いたけど、プライベートサブネット内のDBサーバーにパブリックサブネットのWebサーバーからアクセスして、グローバルIPでアクセスできました!!

振り返り

ドメインとのヒモ付はまだ完了していないが、一通りのVPC周りのことは、特にルートテーブルあたりは整理できて腑に落ちた。
一応形としては、パブリックサブネットからプライベートサブネットに通信するということができたので、良しとする。

しかし、本質的じゃないところで変に躓いてしまった。これは良くないところとして反省しよう。
全部をきれいに、正しいやり方でやりたがりすぎるきらいがある。
やるべきときはそれをやって、本質じゃないところではとりあえず動けばいい、迂回策でいい。この考えをして手を動かしていかないと、永遠に終わらない。