addictionwhite’s diary

考え中のことを整理と忘備録のために綴ります。ここに書かれている考えは翌日には変わる可能性があります

ロードバランサー(ELB)を触ってみた際のメモ

ここでいうELBとはALBのことを指している。

用語メモ

■ターゲットグループ
EC2インスタンスをターゲットグループとしてグループ化し、ELBが転送する方法を設定する

■リスナー
どのような通信をターゲットグループに処理させるかを制御する。
ポートやパスの指定の割当もできる(/exec/はターゲットグループ2に割り当てるなど)

一つのアベイラビリティゾーンにEC2インスタンスを配置すると、
そのアベイラビリティゾーンに異常が発生した際どのEC2インスタンスにもアクセスできなくなる
なのでELBで負荷分散する際には異なるAZを設定する必要がある
(Design For Failureのためなのだと思う)

AZはサブネットに割り当てられる
https://qiita.com/jinnai73/items/cb4cffe6619a83876d17

■作業過程メモ
最初EC2を「複製」からそのまま作ったためサブネットも同じで同じAZになっておりELBが設定できなかった。
原本となるインスタンスはAMIを作成しておいたほうがいい(それをベースにVPCなど最初にインスタンスを作る際に設定できるパラメータを設定できる

Amazon EC2 インスタンスからの AMI の作成 https://docs.aws.amazon.com/ja_jp/toolkit-for-visual-studio/latest/user-guide/tkv-create-ami-from-instance.html

サブネットを新規で作り(AZは原本のインスタンスと異なるものを設定)、AMIからインスタンスを作り直して新しく作ったサブネットを割り当て

EC2起動後に、後からできること・できないこと
http://iga-ninja.hatenablog.com/entry/2014/10/30/000000

■ うまくいかなかったこと 
資料を読みながらELBとEC2インスタンス2つを設定したつもりだったのだけどうまく動かない
現象
・ELBのDNSを叩くと503
・EC2の2つのうち1つがnginxがはいらない

One of the configured repositories failed (不明),
and yum doesn't have enough cached data to continue. At this point the only
safe thing yum can do is fail. There are a few ways to work "fix" this:

■ 問題解決のアプローチ
最初にEC2になぜnginxが入らないかから調べていた(が結果的にこれはよくなかったと思う)
EC2インスタンスのうち1つはパブリックIP叩くとnginxの画面が出ていたので
ここでELB自体がうまく機能していないことがわかる

(正しく動けばヘルスチェックでnginxが動いていない方は見ずにnginxが起動しているインスタンスにのみ割り振られているはず。なのでELBの方から先に見るべきだった)

それを踏まえてELBの設定を見ても間違いを見つけられなかったので1からELBを作り直すと正しく挙動した(おそらく初期設定の段階でなにか設定を誤ったのだと思う。GUIから手で設定しているので)。

いま手元に動くELBと動かないELB(一応残している)があるのだけど、
aws cliあたりでパラメータを比較して何が違うかぱっと把握できるようできたら嬉しい

nginxが動かないインスタンスの問題の件(厳密にはyum updateが動かない)も、ググって出た記事を色々試したがうまく行かなかったので
結局新しくAMIからインスタンス作り直したら問題なくnginx導入できたので、そちらをターゲットグループに適用した。

■ あとから思ったこと
わからないところは粘り強く調べるべき、的な癖がついているけど、
クラウドになったらある程度1から作ったほうが早いならそうしたほうがよいと感じた
(いつしかなにかの本で読んだ、クラウドのサーバをペットのように可愛がらず家畜のように使い捨てる的な感覚)

クラウドは家畜の群れだ。ペットのようにかわいがるな! https://blogs.itmedia.co.jp/narisako/2014/07/post-047f.html

ロードバランサーが正しく動いているかの検証
それぞれのインスタンスに入ってにtailで入ってnginxのaccess.logを見る。
tailで確認する際はec2-userで入ると権限がないのでディレクトリとか見えないのでsudoで叩く

sudo tail -f /var/log/nginx/access.log

疑問
・確認の方法、CloudWatchとかで楽にできないのだろうか?EC2のセキュリティポリシー80開けてtailするの、台数増えたら手間そうに感じたので(知れている手間かもしれないけれど)
・ヘルスチェックが正しく効いているかのチェック方法はどうすればよいだろうか(ターゲットのec2インスタンス適当に一つ落としてELB叩くなど?)

【超入門】負荷分散をAWSロードバランサーを使ってやってみよう https://qiita.com/okamu_/items/c051156e44c4fbd65234

インフラ周りの動作確認、検証方法のノウハウためたいところ

■ nginxのインストール
コマンドがちょっと違うのでメモ

sudo yum update
sudo amazon-linux-extras install nginx1.12
# 起動
sudo service nginx start

(sudo yum install nginxでは入らない。ただこれを叩くとこのコマンドで叩くようにとエラーがでるのでちゃんとエラーを読んでいれば困りはしない)
Amazon Linux 2にExtrasレポジトリからNginxをインストールする
https://dev.classmethod.jp/cloud/aws/install-nginx-on-amazon-linux2-from-extras-repository/
EC2にyumでNginxをインストールしようとしたらできなかった話
https://qiita.com/kazehiki03/items/7712660dd0401186ac4d

AL2 では標準で Nginx の YUM 向けパッケージが提供されていません。

その他参考にした書籍 https://www.amazon.co.jp/Amazon-Web-Services完全ソリューションガイド-大澤-文孝-ebook/dp/B01N7M7IVS

■ その他
・nginxのaccess.logにアクセスしてないのにちょこちょこログ出てるのなんだろうと思っていたけどヘルスチェックからのアクセスぽい。
・AZさえ複数指定しておけば、ターゲットグループにインスタンス1つでも問題ない

1台のEC2でもELBを使うメリットについてまとめてみました https://dev.classmethod.jp/cloud/aws/benefit_elb_with_one_ec2/