適切なAWS EC2 AutoScallingの利用方法

# 適切なAWS EC2 AutoScallingの利用方法

AutoScalingは処理負荷に応じてEC2インスタンスの数を自動で増減することができるサービスです。

AutoScalingを適切に利用すれば、実際のサービスの需要に合わせてシステムが落ちることなく安定的なパフォーマンスを発揮することができます。

# AutoScallingを利用するメリット

## 1.パフォーマンス効率
需要にあったリソースを自動的に維持することで、安定したパフォーマンスでサービスを安定稼働することが可能。

## 2.信頼性
異常が発生したEC2インスタンスを検知・削除し、新しいEC2インスタンスに置き換えることで信頼性を担保します。

## 3.コスト最適化
従量課金制なので、過度な支出を下げコスト最適化することが可能です。（AutoScallingで展開されたリソース費用はかかりますが、設定自体は無料です。）

# AutoScallingを利用するデメリット

## 1.設定の複雑さ
Auto Scalingの設定は複雑であり、適切なスケーリングポリシーの設定や、ヘルスチェックのパラメーター、起動設定などを理解し適切に設定する必要があります。

## 2.管理の難易度
スケールアウト（インスタンスの追加）とスケールイン（インスタンスの削除）のプロセスを適切に管理する必要があります。

これには、アプリケーションのステートレス設計やセッション管理などの考慮が必要です。

## 3.予測不可能なコスト
スケーリングにより、使用するリソースの量が変動するため、コストが予測しにくくなることがあります。

特に、スケーリングポリシーが適切でない場合、想定外のコストが発生する可能性があります。

# AutoScallingの利用方法

## 1. 起動テンプレートの作成
起動テンプレートは、Amazon EC2インスタンスを開始する際に必要な設定を事前に決めておくための機能です。

このテンプレートには、インスタンスの基本情報を指定します。

例えば、「AMI（Amazon Machine Image）」はインスタンスのOSや初期設定を含んでいます。

「インスタンスタイプ」はCPUやメモリのサイズを決めるもので、インスタンスの性能に関わります。

「KeyPair」はセキュリティのために、インスタンスへのログインに必要な鍵です。

「Security Group」はインスタンスのネットワークアクセスを管理するための設定です。

これらの設定をテンプレートとして保存しておくことで、新しいインスタンスを迅速に、かつ一貫した設定で起動することができます。

## 2. AutoScallingGropの作成
AutoScalingGroupは、EC2インスタンス（仮想サーバー）の配置と管理を自動化するためのものです。

これを使用すると、起動テンプレートで定義した設定に基づき、インスタンスをどのように配置するか、どれだけの数を保持するかを決定できます。

### EC2インスタンスの配置場所の指定方法
- VPCやサブネットの指定： インスタンスを配置するVPC（Virtual Private Cloud）やサブネットを指定します。
- 複数の可用性ゾーン（AZ）への分散： インスタンスを複数のAZに分散させることで、もし1つのAZがダウンしても、他のAZにあるインスタンスが動作を続けるため、全体の可用性が向上します。

### EC2インスタンスの配置数の指定方法
- インスタンス数の最小／最大／希望容量の設定： 必要なインスタンスの数を最小、最大、そして希望の容量として設定します。
- ヘルスチェックによる自動調整： AutoScalingGroupは定期的にインスタンスのヘルスチェックを行い、異常がある場合にはそのインスタンスを終了させ、新しいインスタンスを自動的に起動します。これにより、設定されたインスタンス数の範囲内で常にシステムを運用することが可能になります。


## 3. AutoScallingPolicyの設定
AutoScalingPolicyはいつ、どのような状態のときにスケーリングさせるか設定する機能です。

### スケーリングの方法
|           | 説明 | ユースケース |
|---------------------------|------|------------|
| 手動スケーリング              | Auto Scaling Groupの設定を手動で変更し、インスタンス数を増減する方法 | 突然のトラフィック増加に迅速に対応する必要がある場合 |
| スケジュールに基づくスケーリング    | 予定された日時に自動的にインスタンス数を増減する方法 | 毎週特定の時間帯にトラフィックが増加することが予測される場合 |
| 予測スケーリング              | 過去のメトリクスを分析し、将来の需要を予測してインスタンス数を事前に調整する方法 | 特定のイベントやキャンペーンによるトラフィックの増加が予測される場合 |
| 動的スケーリング              | CloudWatchのメトリクスに基づいたポリシーに従って自動的にインスタンス数を調整する方法（Auto Scaling Policyにより定期的に調整される） | サービスのピーク時だけリソースを増やしたい場合 |


### 動的スケーリングに指定できるポリシー
| スケーリングの方法      | 説明 | ユースケース |
|-----------------------|------|------------|
| 簡易スケーリング          | 単一のメトリクスに基づいて、インスタンス数を一定量増減する方法 | 特定のCPU使用率が一定時間続いた時にインスタンス数を調整するなど、シンプルな条件でスケーリングを行いたい場合 |
| ステップスケーリング      | 複数のメトリクスに基づいて段階的にインスタンス数を増減する方法 | CPU使用率が急激に増加した場合など、異なるレベルの使用率に応じて段階的にインスタンス数を調整したい場合 |
| ターゲット追跡スケーリング | 指定したメトリクスの目標値を維持するようにインスタンス数を自動調整する方法 | 平均CPU使用率などの特定のメトリクスを一定の範囲内に保ちたい場合 |

## 4. クールダウン期間の設定
クールダウン期間とは、AutoScalingがインスタンスを追加したり削除したりする際に、次のスケール操作を一時停止するための一定の時間を指します。

これにより、インスタンスが多すぎたり少なすぎたりすることを防ぎ、不要にEC2インスタンスを起動するのを避けることができます。

EC2 AutoScalingで必ずしも設定する必要はありませんが、特にスケールアウト（インスタンス数を増やす操作）を行った際に、新しく起動したインスタンスが完全に動作する状態になるまで待ち、不必要なAutoScalingを防止するために有用です。

### クールダウンが未設定の場合
![スクリーンショット 2024-01-03 14.18.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286094/70880947-b869-641b-52be-fa797479388c.png)
画像参考：[AWSエンジニア入門講座――学習ロードマップで体系的に学ぶ](https://amzn.to/3tD80Ps)


### クールダウンが設定されている場合
![スクリーンショット 2024-01-03 14.20.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286094/55aaed7c-be07-d5aa-00b6-bfdb713fc38f.png)
画像参考：[AWSエンジニア入門講座――学習ロードマップで体系的に学ぶ](https://amzn.to/3tD80Ps)

# AutoScalling利用費用

AutoScaling自体の利用に関する基本的な料金は無料です。

ただし、関連コストは費用がかかります。

**1.EC2インスタンスの使用料**
Auto ScalingはEC2インスタンスを自動的にスケールアップ（増加）およびスケールダウン（減少）しますが、使用するEC2インスタンスには通常の料金が適用されます。従量課金制で、使用した分だけ料金が発生します。

**2.Elastic Load Balancing（ELB）の使用料**
Auto ScalingをElastic Load Balancingと組み合わせて使用する場合、ELBの使用料が別途発生します。ELBは、インスタンス間でトラフィックを分散させるためによく使用されます。

**3.データ転送費**
AWSのデータ転送費は、インターネットへのデータ転送や他のAWSリージョンやサービスとのデータ転送に関連する費用です。


# ユースケース別AutoScalling利用方法
いくつかの一般的なシナリオ

1.　予測可能なトラフィックの増加（例：セール期間中のEコマースサイト）
2.　不規則なトラフィックの変動（例：ニュースサイト）
3.　定期的なバッチ処理（例：夜間のデータ分析）


# まとめ
サーバーやサービスが落ちてしまうと、機会損失につながってしまうので事前にAutoScallingを設定しておくが重要です。