Udemy で AWS を学んでみた(1)
■受講したコース(現在は新規購入停止中)
■メモ
□AWSアカウント作成後にやっておきたいこと
・作業用IAMユーザの作成
・通常の作業にルートユーザは使用しない
・Cloud Trailの設定
・料金アラートの設定
□Simple Monthly Calculator
□EC2インスタンスへの接続
// 新規作成したプライベートキーファイルの場合は、アクセス権限を設定する必要がある
// 設定しない場合、「Unprotected Private Key File」エラーとなる
$ chmod 400 <キーペア名>.pem
// プライベートキーファイルを指定し、EC2インスタンスに接続
// 使用するユーザ名は「ec2-user」
$ ssh -i <キーペア名>.pem ec2-user@<パブリックIP>
□Elastic IPアドレスの注意点
・アタッチしたインスタンスが実行中でない、インスタンスにアタッチしていない等の場合は、お金がかかってしまう。
□CIDRについて
・IPアドレスのレンジを示すもの
例)CIDR:10.20.0.0/16⇒10.20.0.0~10.20.255.255
・/28:16のIPアドレス帯(実際は11)
・/24:256のIPアドレス帯(実際は251)
※5つ分のアドレスはAWS側に予約されているため使用不可、最初の0,1,2,3と最後の計5つ
□NAT GWについて
・プライベートサブネットは通常、外に出ていくことができない
→NAT GW経由で外に出ていくことができる
□セキュリティグループとネットワークACL
・セキュリティグループ
・インスタンス単位の制御
・ステートフル
例)HTTP(80)はフルオープン
・ネットワークACL
・サブネット単位の制御
・ステートレス
例)IN:SSHは全て許可、それ以外は全て拒否
OUT:1024-65535ポートのTCP通信は全て許可、それ以外は全て拒否
□ネットワーク関連の設計注意点
・VPC&サブネットは将来を意識して適切な広さにする
・「このサブネットって将来的にどれくらいPrivate IPが必要?
・サービス・機能ごとの要件を理解しておく
例)ロードバランサーのサブネット
・闇雲に広くすれば良いわけではないので注意
例)VPC Peering
□アカウント分割・VPCの粒度について
1. アカウント単位でわける
・メリット
・他の環境のリソースが見えない
・IAMの設定がシンプル
・デメリット
・環境ごとにIAMの設定が必要
2. VPC単位で分ける
・メリット
・IAMの設定は1度で良い
環境間のリソースを使いまわし、コストメリットがある(?)
・デメリット
・各環境のリソースが見えてしまい、作業しにくい→事故の元
・それを避けるには複雑なIAM設計が必要
□「ステップ3: インスタンスの詳細の設定」-「高度な詳細」-「ユーザーデータ」
・インスタンス初回起動時にスクリプトを実行させることができる設定
例)
#!/bin/bash
yum update -y
yum install -y httpd24
service httpd start
chkconfig httpd on
□RDSのスナップショット
・自動取得
・RDSインスタンスを削除すると自動取得されたスナップショットも削除される
・現在は、削除時に「Retain automated backups」オプションがデフォルトでチェックされているため、一時的に保持することが可能
→ただし、注意事項として「Determines whether retaining automated backups for 7 days after deletion」とあるように、無期限に保持されるものではない
・手動取得
・RDSインスタンス削除と同時に削除されることはない
・無期限に保持が可能
□RDSインスタンスの停止
・非冗長(シングル)構成の場合、インスタンスを停止することができる
→ただし、停止期間は7日間で、7日経つと起動してしまう
□ELB設計時のポイント
・AZをまたがったサーバ配置
・アプリケーションをステートレスに構築
■実践メモ
□Webサーバ1台
・VPCの作成
・パブリックサブネットの作成
・EC2インスタンスの作成
・ユーザーデータの設定
#!/bin/bash
# ホスト名設定
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=<ホスト名>/g' /etc/sysconfig/network
hostname '<ホスト名>'
# タイムゾーン設定
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo”|g' /etc/sysconfig/clock
# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n
# 必要なパッケージの導入
yum update -y
yum install -y httpd24
yum install -y php70 php70-mbstring php70-pdo php70-mysqlnd
yum install -y mysql
yum install -y git
・セキュリティグループの設定
・「SSH(22)」および「HTTP(80)」をフルオープン(本当は良くない)
・EC2インスタンスに接続
・Apache の設定
・DirectoryIndex の変更
$ sudo vim /etc/httpd/conf/httpd.conf
~~~
// index.phpを先に読み込む設定を追加
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
~~~
// コメントアウトを外し、ホスト名を設定
ServerName <ホスト名>
・httpd.confの確認テスト
$ sudo /etc/init.d/httpd configtest
・httpd プロセスの自動起動設定
$ sudo chkconfig httpd on
・http プロセスの立ち上げ
$ sudo service httpd start
$ sudo service httpd status
・PHPの設定
$ sudo vim /etc/php.ini
~~~
// 日本語などマルチバイト文字を使うために、拡張モジュールを有効化
extension=mbstring
~~~
// デフォルトで使用する言語を指定
mbstring.language = Japanese
~~~
// デフォルトで使用する文字コードを指定
default_charset = "UTF-8"
//// PHP 5.6.0 以前のバージョンの場合
mbstring.internal_encoding = UTF-8
・サンプルプログラムの取得
$ git clone https://github.com/ketancho/udemy-aws-14days.git
$ cd udemy-aws-14days/Day3/
$ sudo cp index.php /var/www/html/
$ sudo cp -r img /var/www/html/
□Webサーバ1台+DBサーバ(EC2)1台
・プライベートサブネットの作成
・EC2インスタンスの作成(DBサーバ用)
・ユーザーデータの設定
#!/bin/bash
# ホスト名設定
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=<ホスト名>/g' /etc/sysconfig/network
hostname '<ホスト名>'
# タイムゾーン設定
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo”|g' /etc/sysconfig/clock
# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n
・セキュリティグループの設定
・「SSH(22)」および「MySQL(3306)」をWebサーバのセキュリティグループからのみ許可
・NAT GWの作成
・配置先はパブリックサブネット
・ルートテーブルの作成
・プライベートルートテーブルにNAT GWのルーティングを追加
・EC2インスタンスに接続
// DBサーバがプライベートサブネットのため、インターネット経由で接続できないため、プライベートキーファイルを Webサーバへコピーする
$ scp -i <キーペア名>.pem <キーペア名>.pem ec2-user@<WebサーバのパブリックIP>:/home/ec2-user/
// WebサーバへSSH接続
$ ssh -i <キーペア名>.pem ec2-user@<WebサーバのパブリックIP>
// DBサーバへSSH接続
$ ssh -i <キーペア名>.pem ec2-user@<DBサーバのパブリックIP>
・ 必要なパッケージの導入&初期設定
$ sudo yum update -y
$ sudo yum install -y mysql57-server
・ mysqldプロセスの自動起動設定&立ち上げ
$ sudo chkconfig mysqld on
$ sudo service mysqld start
$ sudo service mysqld status
・MySQLの初期パスワード設定
$ mysqladmin -u root password
・DBサーバからMySQL接続
$ mysql -u root -p
・サンプルテーブルの作成
mysql> create database simple_blog;
mysql> use simple_blog;
mysql> create table posts (id int not null primary key, title varchar(100), detail varchar(1000), image varchar(1000));
mysql> insert into posts values (1, "XXXX", "XXXXXXXXXX", "./img/img1.jpeg");
mysql> insert into posts values (2, "YYYY", "YYYYYYYYYY", "./img/img2.jpeg");
mysql> grant all privileges on *.* to root@"%" identified by '<rootユーザのパスワード>' with grant option;
mysql> exit
・WebサーバからMySQL接続確認
$ mysql -h <DBサーバのパブリックIP> -u root -p
mysql> exit
・Webサーバの参照先をDBサーバに変更
$ sudo cp udemy-aws-14days/Day4/index.php /var/www/html/
$ sudo vim /var/www/html/index.php
・NAT GWおよびEIPの削除
□Webサーバ1台+DBサーバ(RDS)
・プライベートサブネットの作成(冗長化用)
・サブネットグループの作成
・プライベートサブネットを追加
・パラメータグループの作成
・デフォルトのパラメータグループは変更できないため、事前に作成が必要
・DBインスタンスの作成
・マスタスレーブ構成にする場合
・マルチAZ配置を有効化(有償)
・アベイラビリティゾーンは「指定なし」
・パラメータグループの設定変更
slow_query_log = 1
・WebサーバからMySQL接続
$ mysql -h <RDSインスタンスのエンドポイント> -u root -p
・サンプルテーブルの作成
mysql> create database simple_blog;
mysql> use simple_blog;
mysql> create table posts (id int not null primary key, title varchar(100), detail varchar(1000), image varchar(1000));
mysql> insert into posts values (1, "XXXX-RDS", "XXXXXXXXXX", "./img/img1.jpeg");
mysql> insert into posts values (2, "YYYY-RDS", "YYYYYYYYYY", "./img/img2.jpeg");
mysql> exit
・Webサーバの参照先をDBサーバに変更
$ sudo vim /var/www/html/index.php
・DBインスタンスの設定変更
・非冗長(シングル)構成にする場合
・マルチAZ配置を無効化
・DBサーバ(EC2)の削除(または、停止)
□Webサーバ2台+DBサーバ(RDS)+ロードバランサ
・パブリックサブネットの作成(冗長化用)
・パブリックサブネットの「IPの自動割り当て」設定を有効化
・EC2インスタンスの作成(Webサーバ用)
・既存のWebサーバからAMIを取得
・ALBの作成
・セキュリティグループの作成
・「HTTP(80)」をフルオープン(本当は良くない)
□Webサーバ+DBサーバ(RDS)+Auto Scaling
・ALBの設定変更
・ターゲットグループの変更
・登録済みターゲットの削除
・Auto Scaling起動設定
・既存のWebサーバのAMIを利用
・Auto Scalingグループの作成
・ロードバランシングを有効化
・ステップスケーリングポリシー
・Decrease Group Size:削除 2 インスタンス 次の条件の場合 10 >= CPUUtilization > -無限大
・Increase Group Size:追加 2 インスタンス 次の条件の場合 40 <= CPUUtilization < +無限大