AWS再入門ブログリレー2022 EC2編

2022.02.25

こんにちは。クラスメソッドのスジェです。
当エントリは弊社コンサルティング部による『AWS 再入門ブログリレー 2022』の 17日目のエントリです。

このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWSをこれから学ぼう!という方にとっては文字通りの入門記事として、またすでにAWSを活用されている方にとってもAWSサービスの再発見や2022年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。1つでも知らない機能があり、学びにつながれば幸いです。

では、さっそくいってみましょう。17日目のテーマはAmazon EC2です。

EC2とは?

Amazon Elastic Compute Cloud (Amazon EC2) は、クラウド内で規模の変更が可能なコンピューティング性能を利用できるウェブサービスです。 また、ウェブスケールのコンピューティングをデベロッパーが簡単に利用できるよう設計されています。 - EC2 FAQ

平たく言えば仮想スペース(クラウド)にコンピュータ(インスタンス)を作って、お金を払ってレンタルするサービスです。
簡単にインスタンスを作成·削除することができ、これらの作業はすぐに終わります。

特徴

EC2を利用することで得られるメリットはだいたい下記の通りです。

  • 要求に合わせてコンピューティング性能を素早く更新可能(flexibility)
  • 用意されている環境のイメージ(AMI)を利用して、素早くインスタンスの展開が可能だし、複数のインスタンス展開も簡単
  • 使用した分だけの料金、または長期契約など必要に合わせたコスト管理が可能
  • I/O, ネットワーク, ストレージタイプ, コンピューティング性能やグラフィック性能など要求に合わせてインスタンスのタイプが選択可能 他に管理やセキュリティの観点でも様々なメリットがあります。

EC2の機能

EC2の機能についてみてみます。

インスタンス

AWS EC2では管理するサーバーの単位をインスタンスと呼びます。
インスタンスを作成する際、AMI(Amazon Machine Image)とインスタンスタイプ、ネットワーク設定、ボリューム、タグなどオプションを決めます。

AMI

インスタンスの起動や活用に必要なOS・アプリケーションサーバー、様々なソフトウェアが構成された状態で提供されるテンプレートです。
AMIを利用して、同様な構成の複数のインスタンスを簡単に作成できます。
このようなAMIはAWSやあるソフトウェア供給者が提供するものを使ったり、ユーザーが自分の環境をEC2上に構築してこれをAMI化することも可能です。(バックアップと同じです)

インスタンスタイプ

ユーザーはCPU,メモリー、ストレージ、ネットワークなどが適切に設定されているインスタンスタイプを決めてインスタンスを作成します。
インスタンスタイプ名で、タイプやサイズなどを知ることができます。

用途に合わせて適切なインスタンスタイプを選ぶことで性能・コストの効率的な運用ができます。
利用可能なインスタンスタイプは公式ページをご参照ください。

インスタンスタイプによって一時的な性能の拡張(バーストパフォーマンス)ができます。
バーストパフォーマンスとは一時的に性能の拡張が必要な時間にインスタンスの基本性能以上に性能を拡張する機能です。
普段は基本性能でインスタンスを利用し、必要に応じてバーストすることでコスト最適化ができます。
T4g、T3a、T3 インスタンスタイプ、および前世代の T2 インスタンスタイプが支援しています。
T インスタンスは、アイドル状態のときに CPU クレジットが加算され、アクティブなときに CPU クレジットを消費します。
1 CPU クレジットで 1 分間、最大の CPU コアパフォーマンスにバーストできます。

ボリューム

インスタンスは ローカルインスタンスストレージとEBS(Elastic Bloc Store)という外部ストレージで構成されています。
ローカルインスタンスストレージはインスタンスタイプによって提供しているディスクタイプ(HDD, SSD, NvMe SSD)やサイズに差があります。
それで当該タイプを利用する際、ディスクタイプが必要な作業に適しているかを確認し、タイプを選択しなければなりません。
タイプごとにボリューム情報は公式ドキュメントをご参照ください。

ローカルインスタンスストレージに保存されたデータはインスタンスの寿命によって削除されますが、EBSに保存したデータは寿命に関係なくEBSを残したらデータを維持することもできます。
それでインスタンスを削除する前に外部ストレージ(EBS)を分離すると他にインスタンスでも活用できます。
また、EBSは暗号化もできるし、EBSのsnapshotを作成してAMIと同様にバックアップもできます。

ネットワーク

AWS VPC というAWS専用のバーチャルネットワークを利用します。
VPCのcidr範囲内でもっと細かくスペースを分けた「サブネット」上にインスタンスを作成します。
各サブネットはアベイラビリティーゾーンを別々に設定することができ、 ユーザーがアプリケーションを運用する際に複数のEC2インスタンスを複数のアベイラビリティーゾーンにかけて作成することで高可用性の確保ができます。

基本的にインスタンスのIPアドレスはVPC内だけ通信できるプライベートIPが指定されます。
インスタンスがインターネットと通信するためにはインターネットゲートウェイ(IGW)をサブネットに連結したり、インターネットへの発信だけが必要ならネットゲートウェイを連結することで通信ができます。1
インターネット通信のために必要なパブリックアドレスはインスタンス作成時に自動作成したり、固定パブリックアドレスであるElastic IP アドレスを連結することで付与できます。

帯域幅はインスタンスのvCPUによって違います。

使用可能なインスタンスのネットワーク帯域幅は、その vCPU の数によって異なります。例えば、m5.8xlarge インスタンスには 32 個の vCPU と 10 Gbps のネットワーク帯域幅があり、m5.16xlarge インスタンスには 64 個の vCPU と 20 Gbps のネットワーク帯域幅があります。ただし、インスタンスがこの帯域幅を達成できない場合があります。例えば、インスタンスレベルでネットワーク許容量 (1 秒あたりのパケット数や追跡される接続数など) を超えた場合などです。トラフィックが使用できる帯域幅の量は、vCPUsの数と宛先によって異なります。例えば、m5.16xlarge インスタンスは 64 vCPUs のため、リージョン内の別のインスタンスへのトラフィックは、使用可能な全帯域幅(20 Gbps)を利用できます。ただし、異なるリージョンの別のインスタンスへのトラフィックは、使用可能な帯域幅(10 Gbps)の 50% しか利用できません。 - 公式ドキュメント

マシンラーニングのように基本TCP以上のネットワーク性能が必要な場合、EFA(Elastic Fabric Adapter)をでTCP通信より低く、一貫性の高いレイテンシーを提供し、高いスループットが得られます。
EFAをサポートしていないインスタンスタイプもありますので、EFAが必要な場合は事前に確認する必要があります。

セキュリティ

AWSサービスは基本的にAWSと顧客の責任共有モデルに従います。
それでハードウェア的な部分はAWSが責任をもって管理しますが、クラウド内部のセキュリティは顧客が管理する必要があります。

顧客がEC2のセキュリティを強化できる方法としてはネットワークACL(Network Access Control List)とセキュリティグループがあります。
ネットワークACLとセキュリティグループはファイアウォールのような機能を持つ、インスタンスの受信・発信トラフィックを制限することができます。
ACLが先にVPCに適用されて、サーブネット単位でセキュリティグループが適用されます。
ACLについて詳細な内容は公式ドキュメントをご参照ください。
セキュリティグループについて詳細な内容はこちらをご参照ください。

もし、インターネット通信はいらないけどAWSの他サービスと通信が必要ならVPCエンドポイントを利用することで実装できます。
次のイメージのようにVPCエンドポイントを利用するとAWSサービスと通信する際にトラフィックをAWSネットワークに制限できます。
エンドポイントの詳細は下記の記事をご参照ください。

IAMを利用してインスタンスにアクセスできるユーザーやサービスなどを制限することができます。逆にインスタンスからアクセスできるサービスも制限できます。
AWSコンソールでリモートにインスタンスを管理するためのAWS SSM(SystemsManager)やロギングのためにAWS Cloudwatchなどを利用するためにはインスタンスに適切なIAMロールを付与する必要があります。
EC2とIAMについて詳細な内容は公式ドキュメントをご参照ください。

セキュリティを強化するためにはインスタンス内部のソフトウェアをアップデートしたりインスタンスアクセスに必要なアカウント情報やキーペアを管理しましょう。
また、モニタリングのためにVPCフローログを有効にしてCloudWatchと連携することもできます。

コスト

Amazon EC2 は無料でお試しいただけます。Amazon EC2 インスタンスの支払いには 5 つの方法があり、オンデマンド、Savings Plans、リザーブドインスタンス、スポットインスタンス、そして、お客様専用の物理サーバーに EC2 インスタンスのキャパシティーを提供する Dedicated Host への支払いも可能です。 - 公式ドキュメント

単純にオンデマンドでサーバーを起動することではなく一定時間だけ起動が必要だったりするとそれに合わせた支払い方法でコストの最適化ができます。
支払い方法について説明するします。

  • オンデマンド
    • オンデマンドインスタンスでは、実行するインスタンスに応じて、コンピューティングキャパシティーに対して時間あたりまたは秒あたりの料金が発生します。長期間の契約や前払いは必要ありません。アプリケーションの需要に応じて、コンピューティングキャパシティーを自在に増減でき、料金は、使用するインスタンスについて、指定された時間料金の支払いのみです。
  • スポットインスタンス
    • オンデマンド価格から最大 90% 割引で予備の Amazon EC2 コンピューティングキャパシティーをリクエストできます。ただし、リクエストできるインスタンスが時間によってい違いますし、ずっどリクエストしたインスタンスで起動できることではないのでご注意ください。
  • Savings Plans
    • Savings Plansは1~3 年期間で一貫したコンピューティング使用量 (例: USD/時間で測定) を契約するかわりに、低い EC2 および Fargate 使用料金が提供される柔軟な料金モデルです。
  • リザーブドインスタンス (RI)
    • リザーブドインスタンス (RI) では、オンデマンド料金に比べて大幅な割引価格 (最大 72%) が適用され、特定のアベイラビリティーゾーンで使用するキャパシティーを予約できます。 ただし、1・3年単位で契約できるし、前払いによって割引率が違います。
  • Dedicated Hosts
    • お客様専用の物理 EC2 サーバーです。

また、インスタンスタイプによってコストが違いますので、適切なインスタンスタイプを利用することでコストの節約ができます。
各タイプの支払い方法別コストはコストページをご参照ください。

作ってみよう

簡単な設定のインスタンスを作ってみましょう。
VPCとサブネットなどはすでに作成されている前提で進めます。
次のような設定のEC2を作成します。

  • インスタンス1台
  • OSはAmazon Linux 2
  • タイプはt2.medium、ボリュームは50 GB
  • パブリックサブネット上に作成
  • 自分のIPからSSHアクセスを許可
  • 全てのアドレスからHTTPアクセス許可
  • キーペア名は"TestEC2"

EC2を作成するためにはAWSコンソールで「EC2」に入ります。
その後「インスタンスを起動」をクリックして、インスタンスを作成します。
AMIはAmazon Linux 2を選びます。

タイプを選択して、「インスタンスの詳細の設定」に進めます。

インスタンスの詳細な設定をします。
インスタンス数は1台として設定します。
そして作成されていたVPCとインターネットゲートウェイがアタッチされているサブネットを選択します。
ElasticIPを作成してアタッチするので、自動割り当てパブリック IPは「無効化」します。
ユーザーデータは(user data)インスタンスを作成してから、自動に実行するコマンドを記入します。

# 例
#!/bin/bash
yum update -y
amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
yum install -y httpd mariadb-server
systemctl start httpd
systemctl enable httpd
usermod -a -G apache ec2-user
chown -R ec2-user:apache /var/www
chmod 2775 /var/www
find /var/www -type d -exec chmod 2775 {} \;
find /var/www -type f -exec chmod 0664 {} \;
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

他にもインスタンスを停止した際の動作やIAMロールなど様々なオプションの設定ができます。
今回は簡単な設定でします。
次の画面でボリュームを設定します。
サイズ以外のオプションはデフォルトにしておきます。(SSDのgp2、暗号化なし)
次の画面で必要に応じてタグを設定します。
ちなみに「Name」タグを設定すると、インスタンス名が設定できます。(インスタンス作成後にも名前は設定できます。)
今回はスルーします。
タグ設定後、セキュリティグループを設定します。
既に作成しておいたセキュリティグループがあればそれを利生しても大丈夫です。
今回はイメージのように作成してみます。
設定値を確認してからEC2を作成します。
そうすると次のようにキーペアを設定する画面が表示されます。
既存のキーペアがあればそのまま使ったり、新しいキーペアを作成します。
新しいキーペアを使うとダウンロードをクリックしなければ「インスタンスの作成」が活性化されません。
作成後、インスタンス一覧をみると新しいインスタンスが作成中であることが確認できます。

最後にElastic IPをアタッチしてインターネットと通信するための固定のパブリックIPを付与します。
EC2コンソールの「Elastic IP(Elastic IPs)」タブで「Elastic IP アドレスを割り当てる(Allocate Elastic IP address)」をクリックして、パブリックアドレスを作成します。(設定値はデフォルトにします。)
その後、作成したアドレスをチェックして、「Elastic IPアドレスの関連付け(Associate Elastic IP address)」をクリックします。

そして作成したインスタンスを選んで、「関連付ける(Associate)」をクリックしてパブリックアドレスを付与します。

最後に

以上、『AWS再入門ブログリレー2022』の17日目のエントリ『AWS EC2』編でした。

次回(2/28(月))の芦沢さんの「Amazon WAF」もお楽しみください!


  1. 正確には「NAT Gatewayを利用しても、外部へのリクエストに対するリスポンスが取得できるし、外部からインスタンスへのリクエストができない設定になる」という意味になります。