個人用ですが、役に立つとこともあるかも。
関連記事
この記事が役立ちそうな対象者
- ぼく
- とりあえずAWS触ってみたい人で、学習中だけどなんかまとまった記事欲しい人
- AWS上にWordPress載せて、Webサイトの構成を作ってみたい人
AWS側で実施したい構成
- SSL証明書インストール
- httpをhttpsにリダイレクト
- 記事のテキストをS3に保存
- 記事の画像をS3に保存
- 記事の画像をCloud Frontでキャッシュして表示させる(CDN)
- 記事の画像のURLをS3上にする
- 記事の画像のURLを/images等にする
- 料金が1,000円以上になったら通知をする
- ELBでEC2×2に不可分散する
- EC2を変更する(より強いスペックにする)
- 踏み台用(bastion)EC2を構築し、その中にpemキーを保存する
- →あんまよくなさそうなのでpemキーの保存方法は別途検討..
事前準備
全体の参考
-
AWS公式
-
WordPress ウェブサイトを構築する
- あるんかーい。知らんかった
-
WordPress ウェブサイトを構築する
-
AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ
- みんな大好き有名な記事。updateもしているみたい
-
CloudWatchで請求アラート作成しようとしたら下記表示が出てきた。
-
CloudWatchの通知が単にメールアドレスではなくAWS SNS(Simple Notification Service)利用になってた。元から?
-
SNS用に新規トピック作成
-
メールアドレス追加。
-
メールアドレスを認証。
- このメールアドレスは、AWS SNS側で"サブスクリプション"として、管理される。
- ここでのサブスクリプションは宛先リストみたいなもの。
-
Cloud Trailの箇所は実施していない。
-
git-secretsのinstallだけ実施した。
本番環境と開発環境でのAWSアカウントの分け方
参考:AWSアカウントとVPC、分ける? 分けない?: 分割パターンのメリット・デメリット
- 結論:システム×環境種類(本番/開発)で分けていくべき。
AWS リソースを使っていく
全体像
-
Regionは東京のみ。
-
VPC×1
- Subnet
- Public Subnet×1
- ELB(Elastic Load Balancer)×1
- Elastic Network Interface(default attached)
- EC2(Amazon Linux2)×2
- Elastic IP×1
- ELB(Elastic Load Balancer)×1
- Private Subnet×1
- RDS(Relational Database Service)
- Public Subnet×1
- S3(Simple Storage Service)
- Route53×1
- CloudFront(CDN)
- Subnet
-
Internet Gateway×1
-
ドメイン:お名前ドットコムで管理。
- AWS上でも購入できるけど、個人的にドメイン自体は複数持ってるので。
VPC作成
-
VPC×1作成。
- 10.0.0.0/16
-
Subnet×2 in 1aAZに作成
- VPC内にPublic Subnetを作成
- VPC内にPrivate Subnetを作成
-
Internet Gatewayを作成
- VPCにattach
-
Routing設定
- ルートテーブルには「送信先」と「ターゲット」が登録できる
- 「送信先」は通信がきた時の目的地。「ターゲット」はRouterが案内した目的地。
-
local
は自身のネットワーク内に転送する(返す)ことを表す - ルートテーブルに記載された
0.0.0.0/0
はデフォルトルートといい、ルートテーブルに登録されていないアドレスの場合に通る経路を示す- デフォルトルートをInternet Gatewayに設定する。
- ルートテーブルのレコード(?)の適用優先順位は、よりIPアドレス範囲が狭いルートに該当するもの。
- 例:10.0.0.0/16 > 10.0.20.0/24
- この場合10.0.20.0/24のルートが優先
- ルートテーブルはAWSの場合、VPCと各Subnetに対して設定可能
- Subnetに対してルートテーブルは1つだけ。
- AWSでは明示的にRouterを設置しない。
- Subnetに対してルートテーブルを割り当てるとRouterがあるような動きになる
- VPCとPublic Subnetに関連付け
- デフォルトゲートウェイ設定を行う
- ルート追加:送信先
0.0.0.0/0
- ターゲット:作成したInternet Gateway
- ルート追加:送信先
EC2
- t2.microで作成..
- セキュリティグループ設定
- keyは一旦Google Driveにも保存...
セキュリティグループ
- ※EC2立ち上げたばかりだと、標準でSSH(port:22)のみinbound許可されている。
- 接続を許可したいEC2インスタンスに紐づいたセキュリティグループのインバウンドルールを編集
- ルールを追加。まずはhttp(port:80)を任意の場所(どこでも)から許可。
- これでnginxのデフォルトページが表示される。
Elastic IP
- Elastic IPアドレスの割り当てをクリック
- 割り当てたいインスタンスを選択。
- EC2のプライベートIPも表示されるが、基本自動採番らしい。
- こんなの設定したっけって思ったのでメモ。
- 参考:Amazon EC2 インスタンスの IP アドレス指定
プライマリプライベート IP アドレスを指定しないでインスタンスを起動すると、サブネットの IPv4 範囲内で使用可能な IP アドレスが自動的に選択されます。
Route53
- ホストゾーンを作成する
- ドメイン名を入力
- タイプは
パブリックホストゾーン
でOK
- NSレコードとSOAレコードが作成される
- NSレコード:NameServer情報
- SOAレコード:ゾーン情報
- このままではRoute53、ドメインとEC2が紐づいていないのでドメインでサーバにアクセスできない。
- Route53でレコードを作成
- レコードタイプは
A
- 値にGlobal IPを入力
- TTLはデフォで一旦OK
- レコード名は標準何も入力しなくてよい
- 空欄であれば、取得したドメインでアクセス可能
- 何か文字を加えたければサブドメイン的に利用可能(多分)
- 例:sub.hoge.com
- ルーティングポリシー:一旦シンプルで。
- レコードタイプは
RDS
-
データベース>設定 からマルチAZ有無を確認できる。
-
データベースを選択し、編集からマルチAZ有無を変更可能。
-
まず、RDSを設置するprivate Subnetを作成
-
RDSに対するセキュリティグループを作成
- EC2のDashboardから。
- ※グループ名は設定後変更できない。
- インバウンドルールを作成
- タイプ:MySQL/Aurora
- ソース(アクセス元):カスタムでpublic SubnetのEC2が入っているセキュリティグループを検索して選択
- 以上。作成する。
-
DBサブネットグループ
- 複数のAZにあるSubnetに、RDSを作成する際に利用するグループ
- 1つだけSubnetを選択してもエラーとなるため、複数のSubnetを選択する必要がある。
- RDS作成する範囲を決めれる便利なやつ?
- EC2管理コンソールで作成したSubnetの中にRDS用のSubnetを作成するイメージ?
- 複数のAZにあるSubnetに、RDSを作成する際に利用するグループ
-
パラメータグループ
- 作成はした。
-
オプショングループ
- 作成はした。
-
RDSを作成。
- 今回はセキュリティグループと合わせてMySQL
- Standby Instanceを作成してMulti AZにRDSを設置するか否か選択可能
- スタンバイインスタンス作成しない場合は、RDSを作成するAZを選択可能。
- なので、DBサブネットグループで複数AZの複数サブネットを選択していても融通はきく(RDS1つだけ設置可能)
- データベース認証方式を選択
- パスワード認証:DBインスタンスに対して設定する(RDS作成画面で設定が必要) IDとパスワードだけ
- パスワードとIAMデータベース認証
- RDSリソースアクセス権限がある、IAMユーザの認証情報とDBインスタンスに対するID/pass情報を使用して認証。
- ↓RDS MySQL MultiAZの料金...個人では高すぎぃ〜〜〜
料金抑える参考
- RDS(Aurora)を夜中と休日は止めて、利用料を節約する
- RDS の停止機能を使ってコストを半分まで削減してみた
- 定期的に EC2・RDS インスタンスを停止・起動する仕組みの CloudFormation テンプレート
- RDSとAuroraを比較してみた
どのDBを選択するか参考(Aurora Serverless,PostgreSQL,MySQL,MariaDB)
-
AuroraかRDSどちらを選ぶべきか比較する話をDevelopers.IO 2019 in OSAKAでしました #cmdevio
-
結局RDS Aurora Serverless v1で作成した..。
- MySQL5.6のみ。
- v2もプレリリースあるらしい。
- 料金的な都合で。
-
15分で簡単!Aurora ServerlessからAuroraへの移行
- あとからRDSのAuroraに移行できることがわかったので試し。
CloudWatch
- AWS SNSでトピックを作成して、指定のメールアドレスへアラートを飛ばすことはできる
- 一度メール認証をする必要がある
- SNSのサブスクリプションでメールを管理している。
コマンド解説
ec2インスタンスへのログイン
chmod 600 ~/NNN.pem
- 管理者権限以外は読み書きできないように設定している。
- 初めだけ設定しよう。
↓↓↓SSHログイン
ssh -i ~/Desktop/NNN.pem ec2-user@12.345.123.14
-
ssh
だけ入力するとusage
として引数一覧を見ることができる。 -
~/Desktop/NNN.pem
はec2のpemファイルの場所。 -
@
以降はec2のpublic IP- デフォルトだと自動で割り当てられる
- 再起動等するとGIPは変更となる
- Elastic IPで一定にしよう。
UNPROTECTED PRIVATE KEY FILE!
と表示されてしまった場合
-
chmod 700 ~~~.pem
でアクセス権限変更する- chmod = change mode
- 参考:awsにssh接続が拒否された。
- 再度
ssh -i ~~
を実行すればログイン可能。
↓↓↓プロセスとポート番号一覧取得
sudo lsof -i -n -P
- どのポートが何に使われているかわかる
- 接続しているクライアントがどのポートを利用しているかわかる
- サーバ側がどのポートを開放(listen状態)しているかわかる
- 参考:lsofコマンド入門
↓↓↓yumでinstallしたもの一覧
yum list installed
- 参考:yumコマンド一覧
↓↓↓EC2(Amazon Linux2)へnginxをインストールする
sudo amazon-linux-extras install nginx1
-
sudo yum install nginx
だと下記表示してくれる。
"nginx is available in Amazon Linux Extra topic "nginx1"
To use, run # sudo amazon-linux-extras install nginx1"
- 参考【AWS EC2】Amazon Linux2にnginxをインストールする方法
- apacheとnginxだとnginxのほうが良さそうだったので選択。
- ちなみにapacheをインストールする場合は
sudo yum -y install httpd
でOK
↓↓↓nginx起動
sudo systemctl start nginx
- ステータス確認は
sudo systemctl status nginx
- サーバ(EC2)と共に起動するには
sudo systemctl enable nginx
-
sudo systemctl is-enabled nginx
でenableか確認可能
-
※EC2立ち上げたばかりだと、標準でSSH(port:22)のみinbound許可されている。
→したがって、http通信(port:80)は許可されていないので、GIP打ってもnginxの表示はでないよ。
→セキュリティグループでport80を許可してみる
監視系コマンド
↓↓↓CPU使用率確認
top
- これだけでOK
↓↓↓プロセス確認
ps aux
- これで全プロセスが出てくる
-
| grep ~~~
で~~~に該当するプロセスだけ絞って出力させることができる。 -
- 参考:プロセスを終了するkillコマンドの使い方まとめ!【Linuxコマンド集】
- 引数に
-9
で強制終了。
- 引数に
DNS系
↓↓↓NameServer知りたい時
dig hogehoge.com NS +short
-
+short
をつけることでシンプルにNSだけ出てくる
RDS系
- ↓↓↓EC2にログインして、mysqlをインストール
sudo yum -y install mysql
参考
-
↓↓↓EC2からRDS(MySQL)へログイン
mysql -h ##エンドポイント(コピぺ) -u ##マスターユーザー名 -p
-
-h
:endpointを指定してRDSを特定 -
-u
:ユーザー名入力 -
-p
:パスワードを求められる
↓↓↓Password入力後のTerminal(Ctr+C orexit;
でDB抜けられる)
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.6.10 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> ;
- ↓↓↓DBを作成する
- 小文字でもOK.
-
文末に
;
をお忘れなく!
CREATE DATABASE ##データベース名 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
- ↓↓↓DB名を表示する
SHOW DATABASES;
- ↓↓↓DBのユーザーを作成する
参考:MySQLで新しいユーザーを作成して権限を付与する方法
CREATE USER '##ユーザー名'@'%' IDENTIFIED BY '##パスワード';
%
はどこからでもログイン可能という意味。
RDSへのセキュリティはセキュリティグループで担保する。
▽参考:
-
↓↓↓作成したユーザにDBの操作権限を付与する
GRANT ALL ON ##ユーザー名. * TO '##ユーザー名'@'%';
- ↓↓↓権限付与した設定を反映させる(権限のリロード)
FLUSH PRIVILEGES;
## ↓↓ユーザが持つ権限を表示
GRANTS FOR ##ユーザー名
-
USAGE
は何も権限を持たないという意味。 -
↓↓↓ユーザー一覧を表示
SELECT host, user FROM mysql.user;
- 権限削除は
REVOKE ##内容 ON ##DB名.Table名 FROM ##ユーザ名'@'%';
- ユーザー削除は
DROP USER '##ユーザーネーム'@'%'
WordPress
- ↓↓↓phpをインストール
参考:(Amazon公式Docs)Amazon Linux 2 を実行している EC2 インスタンスに Extras Library からソフトウェアパッケージをインストールする方法を教えてください。
sudo amazon-linux-extras install -y php7.4
- ↓↓↓WordPressを動かすのに必要なPHP系ライブラリインストール
参考:
・php環境構築時に入れ忘れてコケるやーつ…。
・PHPでmbstringを設定して日本語環境に対応する方法を現役エンジニアが解説【初心者向け】
→mbstringは日本語化してくれるやつ
sudo yum install -y php-mbstring
- ↓↓↓ライブラリインストール後は、有効化のためにNGINXを再起動
sudo systemctl restart nginx
- ↓↓↓WordPressの最新版DL(保存したい場所にdirectory移動しておくこと)
・URL参照:https://ja.wordpress.org/download/
wget https://ja.wordpress.org/latest-ja.tar.gz
## tarでファイルを解凍
tar xzvf latest-ja.tar.gz
-
x:ファイルを解凍
-
z:g-zipを利用
-
v:圧縮/解凍状況を表示
-
f:ファイル名を指定
-
↓↓↓tar.gzファイルをhtml直下にコピー
- html直下でtar.gzをDLでもOK.
- 参考:AWS上でNginxを使ってWordPressの環境構築 | EC2 + WordPress + Nginx + PHP7 + Mysql5.6
- 参考:【Nginx】ドキュメントルートを変更したい
- →結論:変更しなくてOK..と思ったけど変更した
sudo cp -r * /usr/share/nginx/html/
#または
sudo cp -r * /var/www/html/wp/
- ↓↓↓NGINXに権限を渡す
sudo chown -R nginx:nginx /usr/share/nginx/html/
- NGINXのデフォルト公開ディレクトリは
usr/share/nginx/html
- vimで開くと確認できる
sudo vi /etc/nginx/nginx.conf
- 参考:[Qiita]vimの抜け方(メモ)
-
:w
で保存 -
:wq
で保存して終了 -
esc
キーで編集モードから抜ける
-
自分の失敗?書いておく
- apacheと同じように
/var/www/html
を作成してそこにWordPressのdirectoryを置いてみた。
- NGINXのデフォルト公開ディレクトリではないので、変更が必要だった。
- 変更したけどサイトみにいっても変更なし(NGINXのページが表示される)。
- configファイル見ると、HTTPとHTTPSの時の公開ディレクトリだけではなく他にも
user/share/nginx~~
のディレクトリが使われていた。 - そもそも無理にapacheと同じにする必要はないので、NGINXデフォルトの公開ディレクトリである
usr/share/nginx/html
にWordPressのdirectoryをコピー -
/var/www/html
に置いていたものはなんとか削除.. - サイトみに行くとWordPressの表示が!よかった
さらにつまづいたので書いておく(未解決)
- 上記のようにして、サイトが表示されたが、~~/wp-admin/set-up.config.phpの設定画面から、下記エラーが出現。
WordPress wp-config.phpファイルに書き込みできません。
- 正直いろいろみたつもりですが、全く変わらず。
- 参考(超一部):WordPress wp-config.phpファイルに書き込みできません。
- php-pfmとnginx.confの設定を何度も調べて確認したりしましたが、どうにも突破できませんでした。。
- ゴリ押しですが、結局WordPressのアナウンスの通り、wp-config.phpを作成することに。
- wp-config-sample.phpと同じdirectoryに
touch wp-config.php
で作成 - エラー画面でWPが作ってくれたtxtをコピーして
sudo vi
から編集して貼り付け。 - nginxとphp-fpmをrestartすると「config.phpあるっぽいですけど、WPインストールしますか?」と聞いてくれる。
- restartしないと、NGINXの404エラーが返ってきた。
- wp-config-sample.phpと同じdirectoryに
- こうしてWPのサイト名、ユーザ等作成して、超なんとかWordPressのダッシュボードまで辿り着きました。。
- どこかで今回の設定のツケがきそうです。
- プラグインとか子テーマ作成、テーマupdateとか..
用語メモ
-
CIDR(サイダー;Classless InterDomain Routing)表記:例:
192.168.10.0/24
- IPアドレスの表記方法
- IPアドレスは大抵前半24bit(8×3)/32bitでネットワーク部を表す
- どのネットワークかという住所(区)のこと
- 後半8bit(8×1)/32bitでホスト部を表す
- どの端末か(家)のこと
- CIDR表記の192.168.10
.0/24
について-
/24
は、「ネットワーク部がIPアドレスの前半何bitまでなのかを明らかにする」もの
-
- ※SubnetのIPアドレスはVPCのIPアドレスの範囲内にする必要がある。
- したがって、っ
-
サブネットマスク表記:例:
192.168.10.0/255.255.255.0
- ネットワーク部で利用するbitを記載している。
- IPアドレスの、前から255bit×3をネットワーク部で利用すると明記している。
- 参考:Qiita:IPアドレスの基礎知識
- 参考:【図解】IPアドレスの仕組み(クラス分類からサブネットまで)
- 気にしなくていいんだろうけどクラスの考え方的にはClass Bがバランス取れてる
- →だからSubnet概念が生まれた。
AWS試験メモ
参考:
- 【AWS認定試験】オンライン試験環境で気を付けたいこと
-
NHN Tech Blog
- 読みやすくわかりやすい。
- 楽しいWeb開発
- AWS認定クラウドプラクティショナーに出題されそうな用語まとめ
-
AWS サポートのプラン比較
- SAA,CPの学習リソースにリンクとして載ってることが多い。
- Amazon S3 ストーレジクラス
AWSでさらに実装したいこと
- 不正アクセス検知
- 参考:Lambda + CloudWatch Events + KMS で AWS コンソールへの不正アクセスを秒速で検知して「平穏な生活」を手に入れる
- Slackやメールに飛ばすことができる。
- リソース停止忘れ通知
AWSアカウント削除メモ
- 削除=解約=退会
- アカウント設定から解約できる(https://console.aws.amazon.com/billing/home#/account)
- アカウント解約後同じメールアドレスではAWSアカウントを作成できないとのこと。。
アカウントの解約
私は、閉鎖後期間が過ぎると、閉鎖したアカウントを再開できなくなることを認識しています。
私は、閉鎖後期間が過ぎると、請求コンソールにアクセスして過去の請求書や課税書類をダウンロードできなくなることを認識しています。
[#/請求の明細書はすべて、こちらからダウンロード]。月を選択し、概要セクションを展開し、支払い請求書や課税書類をダウンロードします。
私は、閉鎖後期間が過ぎると、このアカウントと現在関連付けられている E メールアドレスを使用して AWS アカウントを新規作成できなくなることを認識しています。
参考メディア
- 個人ポートフォリオ参考
- Enjoy IT Life
- 元楽天エンジニアの方らしい。
- メディア参考
- ブログ参考