Amazon EC2(Elastic Compute Cloud)

# はじめに
AWSを学び始めて初の投稿。クラウドエンジニアを目指し日々勉強中
各サービス奥が深い。。

# EC2とは？
Amazonが提供している**仮想サーバー構築サービス**のことで、利用することでOSを乗せた仮想環境をクラウド上にすばやく作ることができる。
そのため、従来のデータセンターでの物理的なサーバー構築を行うことはなく、継続利用時に起こりがちなスペック不足や、ディスク容量問題への対処も容易となり、長期的な運用も視野に入れることができる。

# 特徴
+ **迅速かつ柔軟なスケーリングが可能**
サーバーのスペック（CPUやメモリなど）も必要な台数も変更ができ、容量増減・機能分割も可能。

+ **簡単操作で調達・廃棄できる**
+ **OSのライセンス購入、インストールが不要**
+ **需要に応じた耐障害性・高可用性を高める**
インスタンスの起動と終了を行うことで高めることができる。また、常に設定した最小数のインスタンスを起動している状態にキープすることによって高可用性にも役立つ。

+ **冗長化も簡単に行える**
冗長化によって負荷の分散を行ったり、システム上に障害が発生しても全体の環境を維持することが可能

+ **従量課金によるコストメリット**
従量課金制を導入しているため初期費用が掛からない。
3つの料金形態があり、利用者はそれらから自由に選択することができる

# 料金形態

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/998cc58d-1638-1e63-cf52-33da06e33dac.png)


### ①オンデマンドインスタンス
サーバーの利用時間によって料金が発生する従量課金スタイル。
短時間や限られたタイミングでの利用、試し運用する際に適している。

### ②リザーブドインスタンス(RI)
**予約可能なサービス：EC2、DynamoDB、ElastiCache、RDS、RedShifなど**
稼働時間を事前に設定して料金を先に支払う方法。「**全前払い(All Upfront)」「一部前払い(Partial Upfront)」「前払いなし(No Upfront**)」の3種類支払方法が存在し、購入後に変更することはできない。マーケットプレイスにて販売することができる
1年または3年の長期利用の予約をすることで、オンデマンドインスタンスと比べて最大75％の大幅な割引される。




さらにここから「**スタンダードRI**」「**コンバーチブルRI**」の2種類のプランを選択することが可能

+ **コンバーチブルRI**
インスタンスのスペックアップをする際交換と変更を行うことができる。
交換は無料だが、交換元の価格が交換先より低い場合は調整額の支払いが必要になる

| 年数 | 1年 | 3年 |
|:-:|:-:|:-:|
| 割引率  | 31％  | 54％  |



+ **スタンダードRI**
**インスタンスファミリー、OS、テナント、支払オプションの変更ができない**


| 年数 | 1年 | 3年 |
|:-:|:-:|:-:|
| 割引率  | 40％  | 60％  |




:::note info
**料金比較したとき、スタンダードRIの3年全前払いのほうが安い**
:::

### ③AWS Savings Plans(SP)
**対応サービス：EC2,Fargate,Lambda**
リザーブドインスタンスと同じく1年または3年の期間で利用し使用料金を大幅に節約することができる。RIの場合は、条件に合致するインスタンスの様々な属性を指定して購入するが、SPの場合は「**条件に合致するインスタンに相当する金額を自分で計算し、その額をコミットする**」

![SP](https://d1tlzifd8jdoy4.cloudfront.net/wp-content/uploads/2021/10/howtopurchace.png)

SPも「**Compute SP(割引率最大66％)」、「EC2 Instance SP(割引率最大72％)**」の2種類存在する。

+ **SPが適用される流れ**
1．同じ条件に合致するRIが存在した場合、RIが優先される
2．同じ条件に合致するCompute SP、EC2 Instance SPが存在した場合、EC2 Instance SPが優先される
3.同じ条件のSPにおいては、割引率が高い対象への適用が優先される


### ④スポットインスタンス
AWS内で未使用のEC2リソースを利用することが可能。
**最大90％割引で利用できる**ためコスト重視での利用を求める場合におすすめだが、インスタンスが途中で停止される可能性がある。

+ **スポットフリート**
スポットインスタンスの一種で、指定したキャパシティを満たすスポットインスタンスを起動することができる。条件を指定しておくと、インスタンスの価格を監視、条件に合ったEC2を見つけ出して起動、使いたい価格より高くなったインスタンスの自動的に廃棄、といったローテーションを自動で行ってくれる

### ⑤ベアメタルインスタンス
アプリケーションが基礎となるサーバーのプロセッサとメモリに直接アクセスでき、非仮想化環境での実行や、独自のハイパーバイザーを使用したいアプリケーションに適している。クラウド経由で物理サーバーのような設定が可能なインスタンス。

### オンデマンドキャパシティ予約
特定のAZで任意の時間だけ、EC2インスタンスのキャパシティを予約することができる。予約が作成されると起動有無に関わらず確保したコンピューティング料金分の課金が開始されるが、その間対象のインスタンスタイプの起動が保証される。

また、**AZをスコープとしたリザーブドインスタンスを購入している場合、購入台数分のキャパシティが予約されているため、ElasticCacheやRedShifftなどのサービスに対応している**

::: note info
**・なぜ必要なのか？**
対象のEC2インスタンスタイプを起動するためのキャパシティ（サーバ容量）を一時的にAWS側で確保できない時がある。
【**InsufficientInstanceCapacity エラー**】と呼ばれる
:::

### EC2フリート
オンデマンドインスタンス、リザーブドインスタンス、スポットインスタンスの購入オプションを一緒に使用して、複数のAZにまたがって複数のインスタンスタイプを起動できる。フリートに対する1時間あたりの支払い上限容量を設定し、上限料金に達するまでEC2フリートでインスタンスを起動することも可能。支払い上限料金に達すると、ターゲット容量に満たない場合でもフリートはインスタンスの起動を停止する

+ オンデマンドとスポットのターゲット容量を別個に定義し、1時間あたりの支払い上限金額を定義する
+ アプリケーションに最適なインスタイプを指定する

![EC2fleet](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/images/ec2-fleet.png)



# インスタンスとは？
仮想サーバのこと。様々な種類や性能のものがあるので、ユーザーの求める形で利用が可能。必要に応じて複数のインスタンスを立ち上げることで柔軟なインフラ構築ができる。

インスタンスを起動するとき、２種類のユーザーデータ「シェルスクリプト」「cloud-initディレクテティブ」を渡すオプションがあり、それを使用して起動後にスクリプトを実行したりすることができる。

::: note info
Linuxを実行するEC2インスタンスは最低60秒から1秒単位で課金される
:::

### インスタンスの状態

| 表示 | 内容 | 料金 |
|:-:|:-:|:-:|
| pending  | running状態への移行準備中。初めて起動する場合、pending状態になってから起動する場合、インスタンスはstopped状態になる  | 課金されない  |
| running  | インスタンスは実行中で利用できる状態  | 課金される  |
| stopping  | インスタンスは停止または停止休止の準備中  | 停止準備中は無課金。停止準備中は課金される  |
| stopped  | 停止されているため利用不可。いつでも起動することができる  | 課金されない  |
| shutting-down  | インスタンスの削除準備中  | 課金されない  |
| terminated  | 完全に削除済み。起動不可  | 課金されない  |

## インスタンスストア
EC2で利用できる基本的なブロックストレージで、**エフェメラル（揮発性）ディスク**。
一時的なデータが保持され、停止・終了とともにデータは消去される。
物理筐体のローカルディスクを使用するのでネットワークの影響を受けにくいため、ビデオ処理などの元ファイルからデータを再作成できるユースケースに安全に使用すると良い

::: note info
インスタンス初回起動時にユーザーがスクリプト形式で提供するデータをユーザーデータと言い、それを使用してインスタンスの起動後にスクリプトを実行することができる
:::


### インスタンスタイプ
ユースケースごとに選択できるCPUやメモリなどの組合せのこと。
様々な組み合わせやタイプが存在し、現在約200ほどある

#### 【インスタンスタイプの見分け方】

![インスタンス](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1881328%2F1de6eeda-76fe-698b-55a2-edbdc57d98c6.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=25e2f54761ab478b4025eb5e2f6dfa7e)


**≪インスタンスファミリー≫**
インスタンスタイプを用途別に分類したもの。以下5グループに分類される

![インスタンスファミリー](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F1881328%2F5d24813d-1578-726b-60b7-1fd371d49e12.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=de5731e5c4229f98f54c7415eafe60fa)


+ **汎用**
ファミリー：A1，M5,T3など
バランスの取れたコンピューティング、メモリ、ネットワークのリソースを提供し多様なワークロードに使用。インスタンスのリソースを同じ割合で使用するアプリケーションに最適なインスタンス

+ **コンピューティング最適化**
ファミリー：C5,C6gなど
高パフォーマンスプロセッサが必要なコンピューティングバウンドなアプリケーションに使用。バッチ処理、高性能WEBサーバ、HPC(ハイパフォーマンスコンピューティング)、専用ゲームサーバ、機械学習などに使われる

+ **メモリー最適化**
ファミリー：X1,R5,ハイメモリ,z1dなど
メモリ内の大きいデータセットを処理するワークロードに対して高速なパフォーマンスに最適なインスタンス

+ **ストレージ最適化**
ファミリー：H1,D2,I3,I3enなど
ローカルストレージの大規模データセットに対する高いシーケンシャル読み取りおよび書き込みアクセスを必要とするワークロード用。


+ **高速コンピューティング**
ファミリー：P3,Inf1,G4(GPU),F1(FPGA)など
ハードウェアアクセラレーターを使用して、グラフィックス処理、データパターン照合などの情報をCPUで実行するソフトウェアに最適

::: note info
AI機能をEC2インスタンスを利用した実行サーバ上に実装するのにも使用される
:::



**≪インスタンス世代≫**
インスタンスファミリーの世代番号で、新しくなるごとに数が増え最新となる

**≪インスタンスサイズ≫**
インスタンスタイプのスペックを示す。メモリに応じて「nano」「micro」「small」「medium」「xlarge」「2xlarge」などが用意されている

::: note info
**「nano」がスペック上一番低く、「2xlarge」が一番高い。**
:::


# 機能

## Amazon EBS(Amazon Elastic Block Store)
ブロックストレージサービスのこと。EC2の仮想的に外付けされるHDDのような記憶領域のこと。
※記載事項多くなってきたため別記事にて掲載しています

https://qiita.com/matuumo/items/b385922546149dbb362a






## Amazon Machine Image(AMI)
インスタンスの起動に必要なOSやボリューム、アプリケーションなどの情報を含むテンプレートのこと。インスタンスを起動する際必ず指定する必要があり、VMテンプレート（新しい仮想マシンの作成およびプロビジョニングに使用できる仮想マシンのマスターコピーのこと）として利用される。

| 種類 | 内容 |
|:-:|:-:|
|  クイックスタートAMI | AWSが用意しているOSから選択することができる。一部のAMIは無料で使用可能  |
|  カスタムAMI | 自分のアカウント内にあるEC2インスタンスから作成したAMIを使用することが可能  |
| AWS Markeplace AMI  | 企業(AWSと信頼されたサードパーティー)が作成したAMIで、WordPressやSQL Serverがインストール済のAMIを使用することが可能。通常の使用料以外に「**企業への使用料**」も発生するので注意が必要  |
| コミュニティAMI  |  ユーザーが作成したAMIで、AMIの共有設定を有効にした場合に表示される。共有されているAMIはAWSが審査したものではない為、本番環境など大事な場面での仕様は厳禁！ |


既存のEC2インスタンスで設定した値、ファイル、データなど**全てをテンプレート化して、2代目以降のEC2インスタンスにコピーすることが可能**。また、利用していたサーバを復元する際にも使用される

別リージョンにコピーは可能、このAMIはそのリージョンのAMIとして別物になる。

::: note info
launchPermissionプロパティから特定のAWSアカウントとAMIを共有することも可能。それが暗号されていた場合、KMSキーのポリシー変更し共有相手がKMSキーを使用できるようにしなければならない
:::

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/sharingamis-explicit.html


### ゴールデンイメージ
ユーザーが利用したいEC2インスタンスの最適な状態を保存したAMIのこと。一度作成してしまえば、それを活用してインスタンスの設定時間を短縮することができる

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/10e7f039-11e6-efb0-50c5-d213803a76d7.png)


### EC2 Image Builder
AMIの作成、テスト、メンテナンスなどの自動化するパイプラインを作成し、イメージ管理の効率化をすることができる。
セキュリティとコンプライアンスを満たした最新のイメージを作成し、イメージを実稼働環境で使用する前にテストし検証も行ってくれる

![image builder](https://d1.awsstatic.com/re19/image-builder/Product-Page-Diagram_Image-Factory.cbf8db591ca6de1c5d9149f3cd6ccfe6c6a64f33.png)

# ブートストラップ
EC2を立ち上げる際に利用できる機能。AMIを使用してインスタンスを起動した後に実行されるスクリプト。
インスタンスを起動する最初の1回だけ実行され、最初に実行したコマンドを事前にシェルで書いておくことで、初期設定やソフトのインストールを自動で行うことができる。

【**ヒューマンエラーを回避し反復可能なプロセスを自動化できる手法**】
+ ブートストラップ
+ EC2インスタンスの起動テンプレート
+ インフラのコード化

## キーペア
EC2インスタンスにログインや起動する際に使用するセキュリティ認証情報のこと。
2種類のキーペアが存在する
**パブリックキー：EC2内で保存されるセキュリティ認証情報**
**プライベートキー：利用者がダウンロードして保存する必要があるセキュリティ認証情報**
キーペアは「EC2コンソール」から作成するか、もしくは「AWS CLI」を利用する方法の2種類に分けられる。EC2インスタンス毎に新しく作成することもできるし、既存のキーペアを使いまわすことも可能


::: note warn
プライベートキーを紛失した場合復元不可のため大切に保管すること
:::


## AWS CLI(Amazon Command Line Interface)
AWSをコマンドライン（コンピューターに対する指示を文字で行う操作体系）から利用するために公式から提供されているツール。**WindowsのコマンドプロンプトやMACのTerminalにインストールして利用する**
CLIを用いることで、何度も繰り返す操作をスクリプトとしてまとめて自動化し業務効率化し、手作業による人的ミスの削減。CLIを中心に、AWSの多岐にわたるサービスを統合・連携し、自社独自の業務フローを柔軟に構築できる
初期設定の際、アクセスキーが必要になる

![CLIメリット](https://udemy.benesse.co.jp/wp-content/uploads/03_cli_merit-large.png)

## EC2 Instance Connect
EC2インスタンスに対するSSH接続をIAMを用いて管理することができる機能。IAMの権限でアクセス制御が行えて、一時的に生成した公開鍵で自分のローカルマシンまたはマネジメントコンソールからログイン可能

**クライアントソフトウェアをインストールしていなくても、事前の設定事項なしにAmazon Linux、Ubuntu 16.04 以降にアクセスできる**

![connect](https://d1tlzifd8jdoy4.cloudfront.net/wp-content/uploads/2019/06/Untitled-35.png)

## セキュリティグループ
EC2インスタンスの仮想ファイヤーウォールとして提供されるAWSの標準機能のこと。インバウンドルールとアウトバウンドルールにより受信トラフィックと送信トラフィックを制御する役割があり、双方の制御ができることから高いセキュリティレベルを保つことが可能。

AWSセキュリティグループはEC2インスタンスごとにファイヤーウォールを設定する「ステートフルな機能」として提供され、指定した通信のみを許可する「ホワイトリスト形式」が採用されている。

::: note info
**デフォルトセキュリティグループは、インバウンドはすべて拒否設定になっている。新しいルールを設定した場合、全ての既存インスタンスと新規インスタンスに対して新ルールの設定が適用される**
同じセキュリティグループに割り当てられたインスタンスからのインバウンドトラフィックのみ許可されている
:::

## インスタンスのIPアドレス


### ENI(Elastic network interface)
仮想ネットワークインターフェースのことで、インスタンスへのIPアドレスの割り当て時に利用される。同じAZ内のインスタンスにアタッチできる。物理的環境においてのNICを指す
各種IPアドレス情報やMACアドレスなどの情報が入っている。

実行中のアタッチ（ホットアタッチ）、停止中のアタッチ（ウォームアタッチ）、インスタンスが起動中のアタッチ（コールドアタッチ）と3種類の方法でEC2インスタンスにアタッチする。

::: note info
**・ネットワークインターフェースとは？**
コンピュータ内の通信機能を利用するためにOS上に設けられた呼び出し窓口や、その仕様などのことを指す。
**・NIC（Network Interface Card）とは？**
コンピュータなどの機器を通信ネットワークに接続するためのカード型の拡張装置
:::

### パブリックIP
無料で使用できる動的なパブリックIPv4アドレスのこと。パブリックIPアドレスの割り当てが有効化されていれば、自動的にリソースに割り当てられる。**インスタンスが停止した場合はIPアドレスが変更されてしまう**。


### Elastic IP
**料金：利用時無料、解放せずに利用しないと有料**
固定のパブリックIPv4アドレスをインスタンスに割り当てることができる。アドレスを関連付けることで、インターネットから特定のインスタンスにアクセスができるようになる。IPアドレスを指定することはできないが、取得したIPアドレスは占有することが可能。**停止してもIPアドレスは変更されない**。

**あるAZ内のインスタンス障害を、別のAZ内のインスタンスに迅速にリマップすることでマスクすることができる**


### BYOIP
オンプレミス環境で保有しているIPアドレスをAWSで利用可能なように移行をすることが出来る。

#### ROA(Route Origin Authorization)
RIR(地域インターネットレジストリ)を介して作成されるドキュメント。これを使用してパブリックにルーティング可能なIPv4またはIPv6アドレス範囲の一部または全部を移行することが出来る。


## Hibenation(ハイバネーション)
シャットダウンする前にメインメモリの内容をハードディスクなどに退避し、次回起動時にまたメインメモリに読み込んでシャットダウンする前と同じ状態で起動する機能。通常シャットダウンしてから起動する際、OSの起動にかなりの時間がかかっていましたが、OSは起動したままなのでメモリロードの時間だけで起動できる。
ルートボリュームにメインメモリの状態を保存する

::: note info
**ルートボリュームが暗号化されたEBSボリュームである必要がある**
:::

## テナント属性

### DedicatedHosts(専有ホスト）
EC2インスタンスの容量を持つ物理サーバで、完全に1つのアカウントのユーザー専用となる。1つのホスト(ハードウェア)を借りて、そのホストに必要に応じてEC2を立てて使用する。
**AmazonやEC2でMicrosoftやOracleなどのベンダー対象ソフトウェアライセンス (Windows Server、SQL Server、SUSE Linux Enterprise Server など**)を使用できるため、AWSの弾力性、シンプルさ、伸縮性を備えながら、独自のライセンスを使用する柔軟性とコスト効率が得られる。



### Dedicated Instances(ハードウェア専有インスタンス)
同じAWSアカウント内で部署ごとにグループでハードウェアを共有される可能性があるインスタンスなので、コンプライアンス対応(他組織との同居を禁止する場合)などで利用される
EC2を1つ立てるたびに、AWSからハードウェアが1つ貸し出されるイメージ

![Dedicated Instances](https://res.cloudinary.com/zenn/image/fetch/s--1AEVOTEd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_1200/https://storage.googleapis.com/zenn-user-upload/deployed-images/4fe7652adcd91ea5a0522add.png%3Fsha%3D8c0c9715f7981bcd98e1406261f34497879ef48e)

## Amazon EC2 Auto Scaling
アプリケーションの負荷を処理するために適切な数のインスタンスを利用できるように準備すること。Auto Scalingグループを作成しインスタンスの最大数を指定することができる

### メリット
+ **耐障害性の向上**：インスタンス異常時、新しいインスタンスの起動
+ **冗長化**：AZ障害時に別のAZでインスタンスを起動
+ **可用性の向上**：トラフィック処理のための適切なインスタンスの起動台数の増減管理
+ **コスト管理の強化**：必要な時にインスタンスを起動し、不要な場合は削除することで費用を節約

Auto Scalingの詳細に関しては以下サイトから確認してください

https://qiita.com/matuumo/items/37c54f2d3322737aff46


## プレイスメントグループ
ネットワークパフォーマンス向上や物理サーバ障害時の影響範囲を限定させるために、インスタンスをグループ化することができる
プレイスメントグループにはクラスター・分散・パーティションの3種類の戦略がある

### クラスター(cluster)

![cluster](https://d1tlzifd8jdoy4.cloudfront.net/wp-content/uploads/2020/09/placement-group-cluster.png)

単一AZ内のインスタンスをグループ化した構成。低いネットワークレイテンシー、高いネットワークスループットを実現するアプリケーション向けの構成になっている。

### 分散(spread)

![spread](https://d1tlzifd8jdoy4.cloudfront.net/wp-content/uploads/2020/09/placement-group-spread.png)

それぞれに独自のネットワークおよび電源がある異なるラックに別々に配置できるインスタンスのグループ。少数の重要なインスタンスが互いに分離して保持できる。インスタンスが同じラックを共有するときに発生する可能性のある同時障害のリスクを軽減する

### パーティション(partition)

![partition](https://d1tlzifd8jdoy4.cloudfront.net/wp-content/uploads/2020/09/placement-group-partition.png)

各グループをパーティションと呼ばれる論理的なセグメントに分割した構成。それぞれ一連のラックがあり、グループない同士でしかラックを共有しない。ラックを分離することで、アプリケーション内でのハードウェア障害による影響を隔離して軽減する


# ハイブリッドクラウドアーキテクチャ
オンプレミスのプライベートクラウドとサードパーティーのパブリッククラウドプラットフォームを連携させたもの

::: note info
**・ハイブリッドクラウドとは？**
異なる種類のインフラの組み合わせのこと
:::


# おわりに
うまくまとまっていない＆足りないところもあるので気づいたら日々更新していきたいと思います。

# 参考
https://dev.classmethod.jp/articles/ec2-reserved-instances-savings-plans-comparison/