AWSをいじり倒す(4.ELB+AutoScaling)

 

前回、単一EC2構成にELBを適用できたので、

巷でよく聞くAutoScailingとELBの組み合わせとやらを試してみることにする

 

まずはAutoScailingから・・・の前に。

 

dev.classmethod.jp

にもあるように、

Auto Scalingを利用する上で必ず抑えておきたいのは、「Auto Scalingで管理されるEC2は起動設定で指定したAMIから起動する」ということです。

ということなので 、AMIを作っておかなければならない。

スケーリングを試すときに、Webサーバの立ってるインスタンスが複数必要なので

まずは、前回作ったインスタンスからAMIを生成する。

 

AMIの作成

インスタンスの画面から、イメージの作成を選ぶ

f:id:Messerarche:20200428201431p:plain

 

 

 

イメージの作成画面が出てくる。

f:id:Messerarche:20200428201657p:plain

イメージ名とイメージの説明は適当にtest、for_testとする。

再起動しない、は参考にするインスタンスを一度落としてからAMIを作るかどうか。

常識的に考えて落としてから作った方が良い(チェックは入れない)

 

 

ボリュームに、前回無意味にくっつけたsc1の500GBが指定されたままだった。

いらないので右端の×ボタンを押して消す。

こんな感じでイメージの作成ボタンを押した。

f:id:Messerarche:20200428202104p:plain

AMIの項目をみると・・・おお、やってるやってる。

f:id:Messerarche:20200428202205p:plain

 

3分かそこらでpendingがavailableの表示に変わった。

これで完成。

 

ということでAutoScalingの設定を進める

起動設定の作成

f:id:Messerarche:20200428200937p:plain

 

早速AMIの指定画面が出てきた。

さっき作った、testのマイAMIがある。選択選択。

f:id:Messerarche:20200428202613p:plain

 

インスタンスタイプの選択

こだわりないので最小スペック。

f:id:Messerarche:20200428202706p:plain


詳細設定

f:id:Messerarche:20200428202741p:plain

名前はtest-scalingとでもしよう。

ここでもスポットインスタンスのリクエストができるらしい。

 

でも値段が高い時は0台になっても良い使い方ってどんなだ??

って思って調べたら、ちゃんとスポットとオンデマンドを組み合わせるプランがあった

複数のインスタンスタイプと購入オプションを使用する Auto Scaling グループ - Amazon EC2 Auto Scaling (日本語)

へ〜。

 

IAMロールとモニタリングは現時点では指定無し無し

 

ボリュームの設定

f:id:Messerarche:20200428204130p:plain

特に追加はいらないのでこのまま次へ

 

セキュリティグループの設定

f:id:Messerarche:20200428204236p:plain

前回作ったEC2に使っていたセキュリティグループを使うため、既存のセキュリティグループを選択。

しかしセキュリティグループに関しては、別リージョンの設定も全部丸見えなのね。

 

確認画面が出て、作成!

f:id:Messerarche:20200428204449p:plain

 

キーペアの設定画面がでてきた。

f:id:Messerarche:20200428204521p:plain

そもそもキーを指定したインスタンスからAMI作っていて、

そのAMIで新たなインスタンスを作ろうとしているんだから

なんでここで再度キー選択画面が入るの?って少しモヤる。

Amazon EC2 のキーペア - Amazon Elastic Compute Cloud

インスタンスから Linux AMI を作成し、AMI を使用して別のリージョンまたはアカウントの新しいインスタンスを起動すると、新しいインスタンスには元のインスタンスからのパブリックキーが含まれます。これにより、元のインスタンスと同じプライベートキーファイルを使用して新しいインスタンスに接続できます。

ほら、言ってること間違ってない。ここで別のキー選択したら、2つのキーでアクセスできるようになるんか? 

・・・って、よくみたら上の画面内に書いとる!! 

Note: The selected key pair will be added to the set of keys authorized for this instance. Learn more about removing existing key pairs from a public AMI. 

 ほんとに2つのキーでいけることになるっぽい。

そしてキーペア無しで続行の選択肢もあることに気づいた。本来はこれを選ぶべきか

f:id:Messerarche:20200428205600p:plain

なるほどなるほど

 

 無事に設定ができた。

f:id:Messerarche:20200428222910p:plain


 

ここまではAutoScalingで起動するインスタンスの設定の作成、

次からがAuto Scalingグループの作成。

 

先ほど作った起動設定にチェックをいれて、

Auto Scalingグループの作成ボタンを押してみる

AutoScalingグループの詳細設定

f:id:Messerarche:20200428222948p:plain

グループ名はtest-scale-groupとする。

開始時インスタンス数はいったん3を選ぶ。

 

で、ネットワークは・・・

f:id:Messerarche:20200428223136p:plain

自分で作った10.0.0.0/16を選んだらなにやら警告が。

パブリックIPは割り当ててやんねーぞ、と。

まあ、今回はELB経由でアクセスするので問題無し。

f:id:Messerarche:20200428225134p:plain

サブネットは複数指定することができた。

たぶん各AZにいい感じにばらけてインスタンスを作ってくれるんだろう。

 

高度な詳細

f:id:Messerarche:20200428232121p:plain

ロードバランシングは

f:id:Messerarche:20200428232141p:plain

前回作ったELBの送り先であるtest-groupを指定。

test-groupに今回のAuto Scalingで作るEC2達を所属させる。

 

ヘルスチェックのタイプは今回ELBを使うのでELB。

f:id:Messerarche:20200428232544p:plain

ヘルスチェックを開始するまでの時間は300秒

モニタリングの間隔はデフォルトでこれも300秒。

 

 

インスタンスの保護は、

f:id:Messerarche:20200428232823p:plain

だと。

ロールは作ってないので空白。

 

 

スケーリングポリシーの設定

f:id:Messerarche:20200428225325p:plain

 

範囲は2〜4インスタンスにしてみる。

f:id:Messerarche:20200428225525p:plain

メトリクスタイプは何種類からか選べるようだ。

 

ターゲット値は・・・

f:id:Messerarche:20200428225642p:plain

ということは、

ALBのリクエスト数だと、自分しかアクセスしないし今回は3とか4とかそういうオーダー。CPUの平均使用率なら50とか。

ネットワーク入力なら単位バイトということは例えば1MBだと1000000みたいな値を入力するんだろう。

 

これらがモニタリングの間隔(300秒)で超えていたらアウトということか。

とりあえずリクエスト数:3で設定。

 

インスタンス

f:id:Messerarche:20200428230525p:plain

日本語訳が胡散臭い項目だが、起動してからグループにいれるまで何秒まつという設定

デフォルトで300秒となのかな?とりあえず空白

 

スケールインの無効化

f:id:Messerarche:20200428230617p:plain

は、条件を満たさなかったときに減らすかどうか。

これ、インスタンス増やすことで条件を満たさなくなって、インスタンス減らしたところ条件を満たして、ってなると短時間で増減繰り返しそうで怖いな。

 

通知の設定

f:id:Messerarche:20200428232935p:plain

イベントが起きたときに通知してくれるらしい。

せっかくなんで設定してみる。

f:id:Messerarche:20200428233143p:plain

(実際にはhogehoogeじゃなくて実在のメアドを入力)

 

タグ

f:id:Messerarche:20200428233329p:plain

 

確認画面

f:id:Messerarche:20200428233359p:plain

 

作成!!

 

・・・えっf:id:Messerarche:20200428233435p:plain

スケーリングポリシーの何があかんかったんや・・・

f:id:Messerarche:20200428233651p:plain

インスタンスは:のところ、秒数いれてなかったので、適当に20秒を入れてみる。

 

リトライ!

f:id:Messerarche:20200428233743p:plain

あ、できた。よかった。秒数は埋めないとあかんらしい。早く言ってよー

 

 

確認

f:id:Messerarche:20200428234124p:plain

ターゲットグループさんが賑やかになっていた。

今回ので3台作られたらしい。

開始時インスタンス数は確かに3にしたが、ポリシーで範囲は2〜4としたので、

5分待てば2台に減るんかな?

AZは2aと2bにいい感じに分散されている

 

f:id:Messerarche:20200428234332p:plain

インスタンスも賑やかに。

 

5分待ったら、思惑通り1台減ろうとしている瞬間を激写できた。

f:id:Messerarche:20200428234711p:plain

 

AutoScalingグループ上でも消されようとしているインスタンス君。さようなら。

f:id:Messerarche:20200428234642p:plain

 


まず先に、最初に作った単独インスタンスは不要なので、ターゲットグループから外すことにした。

ターゲットグループの画面から編集

f:id:Messerarche:20200428235010p:plain

 

チェックして、削除

f:id:Messerarche:20200428235053p:plain

画像きれてしまったけど、右下に保存ボタンがあるので押す

 

testさんさようなら〜

f:id:Messerarche:20200428235206p:plain

 

 

改めてインスタンスをみると、スケールインによるインスタンスの死骸がw

f:id:Messerarche:20200428235354p:plain

 

testさんもお役御免なので、落としておく。

f:id:Messerarche:20200428235446p:plain

 

ロードバランサーにアラームが出ていることに気づいた。

f:id:Messerarche:20200429000007p:plain

AlermLow・・・だから、下回ったぞ!ってことか。

 

 

さて、最後にELB経由でインスタンスに3回以上アクセスしたらスケーリングしてくれるのか、という点を試す。

いや、2台だから合計6回か。

まずは5回、アクセスしてみる。

f:id:Messerarche:20200429000154p:plain

でも、ロードバランスされてるから平均2.5で、スケールアウトはされない。

 

次の5分で10回アクセスしてみる。

f:id:Messerarche:20200429000543p:plain

こえたぞーー

・・・あれ?アラームがでない

 

通知のオプションからClowdWatchの画面を開いてみる

f:id:Messerarche:20200429000528p:plain

赤線超えてません?(そういう赤線じゃないの!?)

 

15回アクセスしてみることに

f:id:Messerarche:20200429002905p:plain



だめだ・・・スケールアウトしない

よくよくみると、小さく

3 分内の3データポイントのRequestCountPerTarget > 3

と書いてある。RequestountPerTargetの3は自分で設定した3だとして

3分以内の3データポイントってなんぞ?

文字通り受け取ったら、300秒ごとにチェックしてる状況だと永遠にひっかからないんだが。

 

編集できないか試してみる

f:id:Messerarche:20200429003034p:plain

期間が1分て・・・、怪しい。

5分に変えてみると

f:id:Messerarche:20200429003200p:plain

いい感じに15分以内の3データポイントが赤線を上回る絵になった。

ついでに条件もよくみると

f:id:Messerarche:20200429003252p:plain

以上、じゃなくて、より大きいなのね。ぴったりじゃ反応しないと

 

 

アラームの更新を押すと即反応w

でもよくみたらこれLowのほうだ。

f:id:Messerarche:20200429003400p:plain

嵐が去ったあとのアラームがでたみたい。

 

ということでまた5分ごとに10回ぐらいアクセスを3回くりかえす

 

でた。

f:id:Messerarche:20200429005151p:plain

しかし、アクセス連打してからアラームが出るまでが、くそ遅い。

10分ぐらいはラグがあったと思う。

 

そして、アクセス連打しすぎたのか一気に4台へw

f:id:Messerarche:20200429005304p:plain

 

どうも待ちきれなくて15分で45回ぐらいクリックしてしまったらしい

平均15回/5分。2台あるから1台あたり7.5回/5分のアクセス。

3台に増やしても1台あたり5回のアクセスなので

閾値の1台あたり3回には足りない、と判断して4台に増えたのね。賢いな。

 

思惑通り増えたのはいいが、アクセス過多からアラーム発生までが本当に遅いので、

バーストには向かないというのがよくわかった。

ちなみにスケールした時点で登録したメアドに以下のようなメールもきていた。

f:id:Messerarche:20200429010031p:plain

increasing the capacity from 2 to 4とかいてある。

sns.amazonaws.comさんから届いているので、期せずしてSNSも利用したことになる。

 

 

せっかく自動で生成してくれたアラーム条件を変更しないといけなかったのは少しモヤる。もっと上手な初期設定があったんだろうか。

 

とにかく、ELBと連携した状態でAutoScalingによるスケールアウト・スケールインの挙動は確認できたので、いったんよしとする。

 

また、AutoScaling設定中にELBのターゲットグループ指定があったことから、

0から作る時は、先にELBで空のターゲットグループを作ってから、AutoScalingの設定、という順番となるというのも気付き。こんなんやってみんとわからん。

 

おまけ1。

ELBへのアクセス状況をClowdWatchが監視して、閾値を超えたらAutoScalingするという流れだったが、そのAutoScalingは誰が指示しているのか?がよくわからなかったので色々みていたところClowdWatchのアラームトリガーにAutoScalingアクションというのを発見。

f:id:Messerarche:20200429012240p:plain

ということは、ClowdWatchさんがAutoScalingを直接指示しているのね。

間にまた何か別のサービスでも噛んでるのかと思った。

 

おまけ2。

終わらせ方ってどうするんだ。

f:id:Messerarche:20200429013822p:plain

削除・・・しかないのか。

削除することで、インスタンスからClowdWatchの設定まで綺麗に消えた。

 

次回以降はシングルインスタンス+ELB構成ですすめることになりそう。

 

 

進捗。

f:id:Messerarche:20200429012457p:plain