サイトアイコンmaita tomoya dev io

AWS EC2

DevOps/インフラ

AWS EC2

AWSとは何か

AWS(Amazon Web Services)は、Amazonが提供する世界最大のクラウドコンピューティングプラットフォーム。自社でサーバーを買って管理する代わりに、必要なときに必要なだけのコンピュータ資源をインターネット経由で借りられるサービスの集合体。

クラウドサービスを理解するには、以下の3つの分類を押さえておくとよい。

分類正式名称説明例えAWSでの例
IaaSInfrastructure as a Serviceサーバー、ネットワーク、ストレージなどインフラそのものを提供土地と建物の骨組みだけを借りるEC2, VPC, EBS
PaaSPlatform as a Serviceアプリケーションの実行環境を提供内装済みのテナントを借りるElastic Beanstalk, Lambda
SaaSSoftware as a Serviceソフトウェアそのものをサービスとして提供完成した店舗をそのまま使うAmazon WorkMail, Amazon Chime

IaaSでは自分でOSの設定やミドルウェアのインストールを行う必要がある。PaaSではアプリケーションコードだけを用意すればよい。SaaSはブラウザからすぐ使える。EC2はIaaSに分類される。つまり、自分でサーバーの設定から管理まで行う代わりに、最大限の自由度が得られるサービス。

なぜAWSを学ぶ必要があるのか

現代のWebサービスのほとんどはクラウド上で動いている。AWSは以下の理由で特に重要。

  • 世界シェア1位(約30%以上のシェア)
  • 200以上のサービスが提供されている
  • 日本にもリージョン(データセンター群)がある(東京、大阪)
  • 多くの企業が採用しており、求人でもAWSスキルが求められる
  • 無料枠があり、学習コストを抑えて始められる

EC2とは

EC2は Elastic Compute Cloud の略。AWSが提供する仮想サーバーサービスで、AWSの中で最も基本的かつ重要なサービスの1つ。

「仮想サーバー」とは、物理的なコンピュータの中にソフトウェアで作り出されたコンピュータのこと。1台の強力な物理サーバーの上に、複数の仮想サーバーを作り出し、それぞれが独立したコンピュータとして動作する。

自宅PCをクラウドに置く感覚

EC2を最も簡単に理解するには、「自分のパソコンをAWSのデータセンターに置いた」とイメージするとよい。

自宅PCEC2
電源を入れるインスタンスを起動する
OSをインストールするAMIを選択する
スペックを選ぶ(CPU、メモリ)インスタンスタイプを選ぶ
ハードディスクを増設するEBSボリュームを追加する
ファイアウォールを設定するセキュリティグループを設定する
リモートデスクトップで接続するSSHで接続する
電源を切るインスタンスを停止する
PCを廃棄するインスタンスを終了(terminate)する

大きな違いは、EC2では数分で新しいサーバーを作れること、スペックを後から変更できること、そして使った分だけ料金を払うこと。自宅PCは買ってしまえば使わなくてもお金はかからないが、EC2は起動している間だけ課金される(停止すれば課金は止まる)。

Elasticの意味

EC2の「Elastic(弾力性のある)」という名前には、必要に応じてサーバーの数やスペックを自在に変えられるという意味が込められている。アクセスが増えたらサーバーを増やし、減ったら減らす。これがクラウドの最大のメリット。


インスタンスタイプ

EC2で作成した仮想サーバーを「インスタンス」と呼ぶ。インスタンスタイプとは、そのサーバーのスペック(CPU、メモリ、ストレージ、ネットワーク性能)の組み合わせのこと。

インスタンスタイプの命名規則

インスタンスタイプの名前は、次のような規則で構成されている。

t3.medium
│ │  │
│ │  └── サイズ(nano, micro, small, medium, large, xlarge, 2xlarge...)
│ └──── 世代(数字が大きいほど新しい)
└────── ファミリー(用途別カテゴリ)

主なファミリー

ファミリー名前用途
t汎用(バースト)Webサーバー、開発環境、小規模アプリt2.micro, t3.medium
m汎用バランスの取れたワークロードm5.large, m6i.xlarge
cコンピューティング最適化CPU集約型処理(バッチ処理、エンコード)c5.large
rメモリ最適化データベース、インメモリキャッシュr5.large
g/pGPU搭載機械学習、グラフィック処理g4dn.xlarge, p3.2xlarge
iストレージ最適化高速I/Oが必要なデータベースi3.large

初心者が覚えるべきインスタンスタイプ

インスタンスタイプvCPUメモリ用途月額目安(東京リージョン)
t2.micro11 GiB学習、テスト無料枠対象(12ヶ月)
t3.micro21 GiB軽量Webサーバー約$8/月
t3.small22 GiB小規模Webアプリ約$17/月
t3.medium24 GiB中規模アプリ約$34/月
t3.large28 GiB中〜大規模アプリ約$67/月

AWS無料枠について

AWSには新規アカウント作成から12ヶ月間使える無料枠がある。EC2に関しては以下の条件で無料で使える。

  • t2.micro インスタンス(またはt3.microが対象のリージョンもある)
  • 月750時間まで(1ヶ月は約720時間なので、1台なら常時起動でもOK)
  • Linux/Windows どちらも対象
  • EBS 30GBまで無料

注意点として、無料枠を超えると自動的に課金が始まる。複数のインスタンスを起動すると合計時間で計算されるので、2台起動すると半月で750時間に達する。学習目的なら必ず使い終わったらインスタンスを停止すること。


AMI(Amazon Machine Image)

AMIは、EC2インスタンスを作成するためのテンプレート。OSの種類、インストール済みのソフトウェア、設定などが含まれている。パソコンを買うときに「Windows搭載モデル」や「Mac」を選ぶのと同じ感覚。

主なAMI

AMI説明用途
Amazon Linux 2023AWS独自のLinuxディストリビューションAWS環境に最適化、無料、推奨
Ubuntu Server人気のLinuxディストリビューション一般的なWebサーバー、学習用
Red Hat Enterprise Linux企業向けLinuxエンタープライズ環境
Windows ServerMicrosoft Windows.NETアプリケーション
macOSApple macOSiOS/macOSアプリのビルド

カスタムAMI

自分で設定したEC2インスタンスからAMIを作成することもできる。例えば、Nginx + Node.js + PM2をインストールして設定まで済ませたインスタンスをAMIにしておけば、次回から同じ環境を数分で再現できる。これは、チーム開発やオートスケーリングで同じ構成のサーバーを量産する場合に特に便利。


インスタンスの作成手順

AWSマネジメントコンソールからEC2インスタンスを作成する手順を詳しく解説する。

事前準備

  1. AWSアカウントを作成する(クレジットカードが必要)
  2. AWSマネジメントコンソールにログインする
  3. 右上のリージョン選択で「アジアパシフィック(東京)ap-northeast-1」を選択する

手順

ステップ1: EC2ダッシュボードに移動

コンソール上部の検索バーに「EC2」と入力し、EC2サービスを選択する。左メニューの「インスタンス」をクリックし、「インスタンスを起動」ボタンを押す。

ステップ2: 名前とタグの設定

  • 名前: わかりやすい名前をつける(例: my-web-server
  • タグを追加すると、複数のインスタンスを管理しやすくなる

ステップ3: AMIの選択

  • Amazon Linux 2023(無料枠対象)を選択
  • アーキテクチャは「64ビット(x86)」を選択

ステップ4: インスタンスタイプの選択

  • t2.micro(無料枠対象)を選択

ステップ5: キーペアの作成

  • 「新しいキーペアの作成」をクリック
  • キーペア名: my-key-pair
  • キーペアのタイプ: RSA
  • プライベートキーファイル形式: .pem(Mac/Linux)または .ppk(Windows + PuTTY)
  • 「キーペアを作成」をクリック
  • .pemファイルが自動ダウンロードされる(このファイルは二度とダウンロードできないので大切に保管)

ステップ6: ネットワーク設定

  • VPC: デフォルトVPCを使用
  • サブネット: 優先順位なし
  • パブリックIPの自動割り当て: 有効
  • セキュリティグループ: 新しいセキュリティグループを作成
    • SSHトラフィックを許可(ポート22)
    • ソースを「マイIP」に設定(自分のIPアドレスのみ許可、セキュリティのため)

ステップ7: ストレージの設定

  • 8 GiB gp3(無料枠の範囲内)
  • 暗号化はデフォルトのまま

ステップ8: 起動

  • 設定を確認して「インスタンスを起動」をクリック
  • 数分でインスタンスが「running」状態になる

キーペア(SSH鍵)

キーペアは、EC2インスタンスにSSHで安全に接続するための認証情報。公開鍵暗号方式を使用している。

公開鍵暗号方式を簡単に理解する

公開鍵暗号方式は「南京錠と鍵」に例えるとわかりやすい。

  • 公開鍵 = 南京錠(誰にでも配れる。EC2インスタンスに配置される)
  • 秘密鍵 = 鍵(自分だけが持つ。.pemファイル)

南京錠は誰でも閉められるが、開けられるのは鍵を持つ人だけ。同様に、公開鍵で暗号化されたデータは、対応する秘密鍵でしか復号できない。

.pemファイルの管理

# ダウンロードしたキーペアを安全な場所に移動
mv ~/Downloads/my-key-pair.pem ~/.ssh/

# パーミッションを変更(自分だけが読めるようにする)
chmod 400 ~/.ssh/my-key-pair.pem

chmod 400を設定しないとSSH接続時にエラーになる。これはセキュリティ上の仕組みで、他人が読める状態の秘密鍵は危険だとSSHが判断するため。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'my-key-pair.pem' are too open.

このエラーが出たら chmod 400 を忘れている。

キーペア管理のベストプラクティス

  • .pemファイルは絶対にGitリポジトリにコミットしない
  • .gitignore*.pem を追加しておく
  • バックアップは暗号化したUSBやパスワードマネージャーで管理
  • チーム開発では各メンバーが自分用のキーペアを作成する
  • 紛失した場合、そのキーペアでアクセスしていたインスタンスには接続できなくなる(AWS Systems Manager Session Managerを代替として使える)

セキュリティグループ

セキュリティグループは、EC2インスタンスへのトラフィック(通信)を制御する仮想ファイアウォール。「どのIPアドレスから、どのポートへの通信を許可するか」を定義する。

ファイアウォールとは

ファイアウォールは「建物の警備員」のようなもの。誰が入っていいか(インバウンド)、誰が出ていいか(アウトバウンド)をチェックして、許可されていない通信をブロックする。

インバウンドルールとアウトバウンドルール

方向説明例え
インバウンド外部からEC2への通信建物に入ってくる人を管理
アウトバウンドEC2から外部への通信建物から出ていく人を管理

デフォルトでは、インバウンドは全てブロック、アウトバウンドは全て許可されている。

よく使うポート番号

ポートプロトコル用途
22SSHリモート接続(Linux)
80HTTPWebサイト表示(暗号化なし)
443HTTPSWebサイト表示(暗号化あり)
3000カスタムNode.js開発サーバー
3306MySQLMySQLデータベース
5432PostgreSQLPostgreSQLデータベース
6379RedisRedisキャッシュ
8080カスタム代替HTTPポート

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

Webサーバーを公開する場合の典型的な設定:

インバウンドルール:

タイププロトコルポート範囲ソース説明
SSHTCP22マイIP(例: 203.0.113.0/32)管理者のSSH接続
HTTPTCP800.0.0.0/0全世界からのHTTPアクセス
HTTPSTCP4430.0.0.0/0全世界からのHTTPSアクセス

アウトバウンドルール:

タイププロトコルポート範囲送信先説明
すべてのトラフィックすべてすべて0.0.0.0/0全ての送信を許可

セキュリティグループの重要なルール

  • セキュリティグループはステートフル: インバウンドで許可した通信の戻りのトラフィックは自動的に許可される
  • 1つのインスタンスに複数のセキュリティグループを紐付けられる
  • ルールの変更は即座に反映される(再起動不要)
  • 「拒否ルール」は設定できない。許可ルールのみ。許可されていない通信は全てブロックされる
  • SSHのソースを 0.0.0.0/0(全世界)にするのはセキュリティ上非常に危険。必ず自分のIPアドレスに限定する

SSH接続

SSH(Secure Shell)は、ネットワーク越しにリモートのコンピュータを安全に操作するためのプロトコル。EC2インスタンスへの接続は基本的にSSHを使う。

基本的な接続コマンド

ssh -i ~/.ssh/my-key-pair.pem ec2-user@<パブリックIPアドレス>

各要素の説明:

要素説明
sshSSHコマンド
-i ~/.ssh/my-key-pair.pem秘密鍵ファイルを指定
ec2-userログインユーザー名(AMIによって異なる)
@<パブリックIPアドレス>接続先のIPアドレス

AMIごとのデフォルトユーザー名

AMIデフォルトユーザー名
Amazon Linuxec2-user
Ubuntuubuntu
Red Hatec2-user
CentOScentos
Debianadmin

接続の実際の流れ

# 1. キーペアのパーミッションを確認
ls -la ~/.ssh/my-key-pair.pem
# -r--------  であること

# 2. EC2に接続
ssh -i ~/.ssh/my-key-pair.pem ec2-user@54.250.xxx.xxx

# 初回接続時はフィンガープリントの確認が表示される
# The authenticity of host '54.250.xxx.xxx' can't be established.
# Are you sure you want to continue connecting (yes/no)?
# → yes と入力

# 3. 接続成功すると以下のようなプロンプトが表示される
#    __| __|_ )
#    _| (   /   Amazon Linux 2023
#   ___|\___|___|
# [ec2-user@ip-172-31-xx-xx ~]$

# 4. サーバーの情報を確認
uname -a
cat /etc/os-release

# 5. 接続を終了
exit

SSH接続のトラブルシューティング

エラー原因解決方法
Permission denied (publickey)キーペアが間違っている正しい.pemファイルを指定
Connection timed outセキュリティグループでSSHが許可されていないポート22のインバウンドルールを追加
Connection refusedSSHサービスが起動していないインスタンスを再起動
UNPROTECTED PRIVATE KEY FILE.pemファイルのパーミッションが緩いchmod 400 を実行
Host key verification failedホストキーが変わった~/.ssh/known_hostsの該当行を削除

SSH設定ファイルで接続を簡略化

毎回長いコマンドを打つのは面倒なので、~/.ssh/configファイルに設定を書いておくと便利。

# ~/.ssh/config
Host my-ec2
    HostName 54.250.xxx.xxx
    User ec2-user
    IdentityFile ~/.ssh/my-key-pair.pem

これで以下のコマンドだけで接続できるようになる:

ssh my-ec2

Elastic IP

Elastic IPは、AWSが提供する静的なパブリックIPv4アドレス。EC2インスタンスに固定IPアドレスを割り当てるために使う。

なぜ固定IPが必要なのか

EC2インスタンスのパブリックIPアドレスは、インスタンスを停止して再起動するたびに変わる。これは以下の問題を引き起こす:

  • DNSの設定を毎回変えなければならない
  • SSH接続先が毎回変わる
  • 外部サービスのIPホワイトリストに登録できない

Elastic IPを使えば、インスタンスの起動・停止に関わらずIPアドレスが固定される。

Elastic IPの注意点

状況料金
実行中のインスタンスに関連付けられている無料
どのインスタンスにも関連付けられていない有料(約$3.65/月)
停止中のインスタンスに関連付けられている有料

AWSは限りあるIPv4アドレスの無駄遣いを防ぐため、使っていないElastic IPに料金を課金する。使わなくなったElastic IPは必ず解放すること。

Elastic IPの割り当て手順

1. EC2ダッシュボード → 左メニュー「Elastic IP」
2. 「Elastic IPアドレスの割り当て」をクリック
3. ネットワークボーダーグループ: ap-northeast-1(東京)
4. 「割り当て」をクリック
5. 割り当てられたIPを選択 → 「アクション」→「Elastic IPアドレスの関連付け」
6. インスタンスを選択して関連付ける

インスタンスのライフサイクル

EC2インスタンスには、いくつかの状態(ステート)がある。それぞれの状態と料金の関係を理解することが重要。

インスタンスの状態遷移

[pending] → [running] → [stopping] → [stopped]
                │                        │
                │                        └→ [pending] → [running](再起動)
                │
                └→ [shutting-down] → [terminated]

各状態の詳細

状態説明EC2料金EBS料金データ
pending起動準備中無料課金-
running実行中課金課金保持
stopping停止処理中無料課金-
stopped停止中無料課金EBSに保持
shutting-down終了処理中無料--
terminated終了済み無料無料全て削除

停止(stop)と終了(terminate)の違い

操作停止(stop)終了(terminate)
例えパソコンのシャットダウンパソコンの廃棄
データEBSボリュームに保持されるEBSボリュームも削除される(設定による)
再起動可能不可能
EC2料金かからないかからない
EBS料金かかるかからない
パブリックIP変わる(Elastic IPなら固定)解放される

学習中は必ず使い終わったらインスタンスを停止すること。完全に不要になったら終了する。停止中でもEBSの料金はかかるので、長期間使わない場合は終了してしまったほうがよい。


EBS(Elastic Block Store)

EBSは、EC2インスタンスに接続するブロックストレージサービス。パソコンに例えると「外付けハードディスク」のようなもの。EC2インスタンスを停止してもデータは保持される。

ボリュームタイプ

ボリュームタイプ名前用途IOPSスループットコスト
gp3汎用SSD(第3世代)ほとんどのワークロード3,000(ベース)125 MB/s
gp2汎用SSD(第2世代)レガシー互換サイズに依存サイズに依存
io1/io2プロビジョンドIOPS SSDデータベース、高IOPS最大64,000最大1,000 MB/s
st1スループット最適化HDDビッグデータ、ログ処理500500 MB/s
sc1コールドHDDアーカイブ、低頻度アクセス250250 MB/s最低

初心者はgp3を選んでおけば間違いない。gp3はgp2の後継で、コストパフォーマンスに優れている。

EBSの基本操作

# EC2にSSH接続後、ディスクの確認
lsblk

# 出力例:
# NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# xvda    202:0    0   8G  0 disk
# └─xvda1 202:1    0   8G  0 part /

# ディスク使用量の確認
df -h

# 追加したEBSボリュームのフォーマットとマウント
sudo mkfs -t xfs /dev/xvdf
sudo mkdir /data
sudo mount /dev/xvdf /data

# 永続化(再起動後も自動マウント)
echo '/dev/xvdf /data xfs defaults,nofail 0 2' | sudo tee -a /etc/fstab

ユーザーデータ(起動時スクリプト)

ユーザーデータは、EC2インスタンスの起動時に自動実行されるスクリプト。サーバーの初期セットアップを自動化できる。

基本的なユーザーデータの例

#!/bin/bash
# システムの更新(Amazon Linux 2023ではdnfを使用)
dnf update -y

# Nginxのインストール
dnf install -y nginx

# Nginxの起動と自動起動設定
systemctl start nginx
systemctl enable nginx

# Node.jsのインストール(nvm経由)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm install 20
nvm use 20

# アプリケーションのクローンとセットアップ
cd /home/ec2-user
git clone https://github.com/example/my-app.git
cd my-app
npm install
npm run build

ユーザーデータの設定方法

インスタンス作成時の「高度な詳細」セクションで「ユーザーデータ」フィールドにスクリプトを貼り付ける。スクリプトはroot権限で実行される。

ユーザーデータのログ確認

# ユーザーデータの実行ログ
sudo cat /var/log/cloud-init-output.log

Auto Scaling

Auto Scalingは、負荷に応じてEC2インスタンスの数を自動的に増減させる機能。アクセスが急増してもサーバーがダウンしない、アクセスが減ったら余分なサーバーを減らしてコストを節約する、という2つの効果がある。

Auto Scalingの仕組み

         ┌─────────────────────────────────────────┐
         │          Auto Scaling グループ            │
         │                                           │
         │  ┌────────┐ ┌────────┐ ┌────────┐       │
負荷増加 → │  EC2 #1 │ │  EC2 #2 │ │  EC2 #3 │ ← 自動追加
         │  └────────┘ └────────┘ └────────┘       │
         │                                           │
         │  最小: 1台  希望: 2台  最大: 5台          │
         └─────────────────────────────────────────┘

主要な概念

概念説明
起動テンプレート新しいインスタンスの設定(AMI、インスタンスタイプ、キーペア等)
Auto Scalingグループインスタンスの集合。最小/最大/希望台数を設定
スケーリングポリシーいつ増やすか/減らすかのルール
クールダウン期間スケーリング実行後、次のスケーリングまでの待機時間

スケーリングポリシーの種類

ポリシー説明
ターゲット追跡メトリクスを目標値に維持CPU使用率を50%に維持
ステップスケーリング閾値に応じて段階的にスケールCPU 70%で+1台、90%で+2台
スケジュール時間指定でスケール毎朝9時に5台、夜10時に2台
予測スケーリング過去のパターンから予測して事前スケール過去のトラフィックパターンに基づく

ロードバランサー

ロードバランサーは、複数のEC2インスタンスにトラフィックを分散させるサービス。レストランの案内係が空いているテーブルにお客さんを案内するイメージ。

AWSのロードバランサーの種類

種類名前動作レイヤー用途
ALBApplication Load Balancerレイヤー7(HTTP/HTTPS)Webアプリケーション
NLBNetwork Load Balancerレイヤー4(TCP/UDP)超高速処理、ゲームサーバー
GLBGateway Load Balancerレイヤー3セキュリティアプライアンス
CLBClassic Load Balancerレイヤー4/7レガシー(非推奨)

初心者がまず覚えるべきはALB。WebアプリケーションにはALBを使う。

ALBの基本構成

ユーザー → ALB → ターゲットグループ → EC2インスタンス群
              │
              ├── /api/* → APIサーバー群
              └── /* → Webサーバー群

ALBはURLのパスやホスト名に基づいてルーティングを振り分けられる。例えば /api/ へのリクエストはAPIサーバーへ、それ以外はWebサーバーへといった設定が可能。


EC2でのWebサーバー構築

ここでは、EC2上にNginx + Node.jsのWebサーバーを構築する手順を詳しく解説する。

全体構成

インターネット → EC2(Nginx:80) → Node.js App(:3000)

NginxがリバースプロキシとしてHTTPリクエストを受け取り、Node.jsアプリケーションに転送する構成。

ステップ1: EC2にSSH接続

ssh -i ~/.ssh/my-key-pair.pem ec2-user@54.250.xxx.xxx

ステップ2: システムの更新とNginxのインストール

# Amazon Linux 2023の場合
sudo dnf update -y
sudo dnf install -y nginx

# Nginxの起動と自動起動設定
sudo systemctl start nginx
sudo systemctl enable nginx

# 動作確認(ブラウザでパブリックIPにアクセスして確認)
curl http://localhost

ステップ3: Node.jsのインストール

# nvmのインストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
source ~/.bashrc

# Node.js LTSのインストール
nvm install --lts
node -v
npm -v

ステップ4: Node.jsアプリケーションの作成

# アプリケーションディレクトリの作成
mkdir ~/my-app && cd ~/my-app
npm init -y

# Expressのインストール
npm install express
// ~/my-app/app.js
const express = require('express')
const app = express()
const PORT = 3000

app.get('/', (req, res) => {
  res.json({
    message: 'Hello from EC2!',
    timestamp: new Date().toISOString(),
    hostname: require('os').hostname(),
  })
})

app.get('/health', (req, res) => {
  res.json({ status: 'ok' })
})

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`)
})

ステップ5: PM2でプロセス管理

# PM2のインストール(プロセスマネージャー)
npm install -g pm2

# アプリケーションの起動
pm2 start app.js --name my-app

# 自動再起動の設定(サーバー再起動時)
pm2 startup
pm2 save

# 状態確認
pm2 status
pm2 logs

PM2は、Node.jsアプリケーションのプロセスマネージャー。アプリがクラッシュしても自動で再起動してくれる。

ステップ6: Nginxのリバースプロキシ設定

sudo vi /etc/nginx/conf.d/my-app.conf
# /etc/nginx/conf.d/my-app.conf
server {
    listen 80;
    server_name _;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}
# 設定のテスト
sudo nginx -t

# Nginxの再起動
sudo systemctl restart nginx

ステップ7: セキュリティグループの確認

EC2のセキュリティグループでポート80(HTTP)が許可されていることを確認する。ブラウザからパブリックIPにアクセスして、Node.jsアプリのレスポンスが返ればデプロイ完了。


料金体系

EC2の料金体系は複数のモデルがある。用途に応じて適切なモデルを選ぶことでコストを最適化できる。

料金モデルの比較

モデル説明割引率適切な用途契約期間
オンデマンド使った分だけ支払い基準価格短期利用、テスト、予測不能なワークロードなし
リザーブド事前予約で割引最大72%オフ24時間365日稼働するサーバー1年または3年
Savings Plans一定額の使用を約束最大72%オフ柔軟な割引プラン1年または3年
スポット余剰キャパシティを利用最大90%オフ中断されても問題ないバッチ処理なし(中断あり)

具体的な料金例(東京リージョン、Linux、2024年時点の参考値)

インスタンスオンデマンド(/時間)オンデマンド(/月)リザーブド1年(/月)
t3.micro$0.0136約$10約$6
t3.small$0.0272約$20約$12
t3.medium$0.0544約$40約$25
t3.large$0.1088約$80約$50
m5.large$0.124約$91約$57

スポットインスタンスの注意点

スポットインスタンスは最大90%の割引が得られるが、AWSがそのキャパシティを必要とした場合、2分前の通知で中断される。以下の用途に適している:

  • バッチ処理
  • データ分析
  • CI/CDのビルドサーバー
  • テスト環境

本番のWebサーバーには絶対に使ってはいけない。

料金の確認と節約のコツ

料金の確認方法:
1. AWS Billing and Cost Management ダッシュボード
2. AWS Cost Explorer で詳細分析
3. AWS Budgets でアラート設定

節約のベストプラクティス:

  • 使っていないインスタンスは停止する
  • 使っていないElastic IPは解放する
  • 適切なインスタンスタイプを選ぶ(過剰スペックを避ける)
  • リザーブドインスタンスで長期コストを削減
  • AWS Trusted Advisorでコスト最適化の提案を確認する

ベストプラクティス

タグ付け

全てのAWSリソースにタグをつけることで管理が楽になる。

推奨タグ:
- Name: リソースの名前(例: production-web-server)
- Environment: 環境(例: production, staging, development)
- Project: プロジェクト名(例: my-web-app)
- Owner: 管理者(例: team-a)
- Cost-Center: コストセンター(予算管理用)

セキュリティ

  • SSHポートは自分のIPアドレスのみに制限する
  • rootユーザーでの直接ログインを無効にする
  • 定期的にOSとパッケージをアップデートする
  • IAMロールを使用してEC2からAWSサービスにアクセスする(アクセスキーをEC2に保存しない)
  • セキュリティグループは最小権限の原則に従う
  • EBSボリュームの暗号化を有効にする
  • AWS Systems Manager Session Managerの利用を検討する(SSHポートを開けずに接続できる)

運用

  • CloudWatchでメトリクスを監視する(CPU使用率、メモリ使用率、ディスクI/O)
  • CloudWatchアラームで異常を検知する
  • AMIのバックアップを定期的に取得する
  • インスタンスメタデータサービスv2(IMDSv2)を使用する

実践演習

演習1: 初めてのEC2インスタンス

  1. AWSアカウントを作成する(無料枠を利用)
  2. 東京リージョンでt2.microインスタンスを起動する
  3. SSHで接続してOSの情報を確認する
  4. Webサーバー(Nginx)をインストールして、ブラウザからアクセスする
  5. 作業後、インスタンスを停止する

演習2: Node.jsアプリのデプロイ

  1. EC2上にNode.js + Expressのアプリケーションを構築する
  2. PM2でプロセス管理を設定する
  3. Nginxでリバースプロキシを設定する
  4. ブラウザからアクセスして動作を確認する

演習3: セキュリティの強化

  1. セキュリティグループのルールを見直す
  2. SSH接続元IPを自分のIPのみに制限する
  3. IAMロールを作成してEC2に関連付ける
  4. EBSの暗号化を確認する

参考リンク