EC2

【VPC内リージョンサービス】

EC2(Elastic Compute Cloud)は、汎用・コンピュート最適化・メモリ最適化・GPU・ストレージ最適化など、多様なインスタンスタイプを提供する仮想サーバーサービスです。

用途に応じて最適な構成を選択することで、性能とコストのバランスを柔軟に調整することができます。

EC2では、EBS(Elastic Block Store) や インスタンスストアを利用してストレージを構成でき、ENI(Elastic Network Interface) により複数のネットワークインターフェースを設定することも可能です。

EIP(Elastic IP address) を割り当てることで、固定のパブリックIPアドレスを持つインスタンスを構築でき、インスタンスの再起動や再配置が発生しても同じIPで通信を継続できます。

SG(Security Group)で通信を制御し、IAM(Identity and Access Management)ロールを用いて安全にAWSサービスへアクセスできます。

キーペアを利用することで、インスタンスへの安全なログインを実現できます。キーペアは公開鍵と秘密鍵の組み合わせで構成され、SSH接続時の認証や管理者アクセスの保護に使用されます。

起動時には、ユーザーデータを利用してスクリプトを実行し、自動でソフトウェアのインストールや環境設定を行うことができます。これにより、手作業を減らして効率的にインスタンスを構築できます。

EC2の料金体系には、オンデマンドインスタンス、リザーブドインスタンス(RI)、セービングプラン(SP)、スポットインスタンスなどの購入オプションがあり、利用状況に応じてコストを最適化することができます。

さらに、インスタンスの起動構成をひとまとめにして再利用できるLaunch Templateを活用することで、複数のインスタンスを統一した設定で簡単に展開できます。

必要に応じて自動的にスケールイン・スケールアウトを行うAuto Scalingや、負荷分散を実現するELB(Elastic Load Balancing)と組み合わせることで、スケーラブルで高可用性なアーキテクチャを構築できます。

OSやミドルウェアの選択も自由で、任意のAMI(Amazon Machine Image)を利用して独自の環境を迅速に展開することができます。

運用管理面ではSSM(AWS Systems Manager)を利用することで、リモート接続、パッチ適用、ログ管理、自動化などの運用を効率化することができます。

重要用語

関連サービス

ユースケース

WebサーバーのホスティングEC2インスタンス上にApacheやNginxなどのWebサーバーをインストールし、自社Webサイトや業務アプリケーションを公開する。
既存オンプレアプリのリフト&シフトオンプレミスのWindowsやLinuxサーバーで動いていたアプリケーションを、ほぼそのままEC2に移行してクラウド運用に切り替える。
バッチ処理・バッチサーバーの実行決まった時間にだけ起動するEC2インスタンス上でログ集計やレポート作成などのバッチ処理を実行し、処理後に停止してコストを抑える。

ベストプラクティス

IAMロール利用による認証情報管理アクセスキーを埋め込まず、EC2インスタンスロールでAWSリソースにアクセスする。
セキュアなキーペア管理SSHキーペアを安全に保管し、不要なキーペアは削除する。
最新パッチの適用とAMI管理OSやミドルウェアを定期的に更新し、最新状態のゴールデンAMIを維持する。

高可用性・バックアップ・リトライ

高可用性・バックアップ・リトライ設計のポイント
【デフォルト】AWS内部で冗長化
 ・コントロールプレーン
 ・AMI・スナップショット格納ストレージ(S3 に保存されて、リージョン内で自動的にマルチAZ化)
 ・メタデータストア(AWS内部の冗長化データストアDynamoDB系に保存)
 ・EBSの内部冗長化(同一AZ内で複数ハードウェアにレプリケーション)
 ・EIP 管理基盤(ネットワークコントロールプレーン上で冗長化)
 ・ログ・監視(CloudWatch/CloudTrail)基盤
【マルチAZ構成】複数AZのサブネット構成
【ELB】トラフィックを自動分散、自動フェイルオーバー
【Auto Scaling】インスタンス障害や負荷変動に対して自動復旧・調整
【リージョン冗長化】ディザスタリカバリ要件がある場合

セキュリティ

関連サービス設定内容
Subnet(公開リソースと内部リソースの分離)【踏み台】
 Publicの専用Subnet
【Webサーバ】
 Privateの専用SubnetでマルチAZ構成
【バッチサーバ】
 Privateの専用SubnetでマルチAZ構成
SG(リソース単位のアクセス制御)【踏み台】
 インバウンド:22(SSH)
        3389(RDP)
 アウトバウンド:すべて許可
【Webサーバ】
 インバウンド:80(HTTP)
        443(HTTPS)
 アウトバウンド:すべて許可
【バッチサーバ】
 インバウンド:空(すべて拒否)
 アウトバウンド:443(API通信、必要範囲のみ)
WAF(アプリケーション層の脅威に対する防御)-
Shield(DDoS攻撃からのリソース保護)EIPにShield Standardは常時有効
【CloudFrontを使用しない場合】
 EIPにShield Advancedの有効化を推奨
ACM(SSL/TLS証明書の自動管理)-
KMS(データの暗号化と鍵の安全管理)-
Secrets Manager(機密情報の安全管理)-
SSM Parameter Store(設定情報の一元管理)パラメータ(Parameter)の作成が推奨
 アプリ設定・OS設定値・スクリプトパラメータ
CloudTrail(操作履歴の記録・監査・追跡)【自動記録】
作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI)
データ操作は追跡できない(データプレーンAPI)
Config(リソースの構成状態・設定変更を記録)【Configが有効な場合】
インスタンス/AMI/SG等の変更履歴・タグ/IMDS/暗号化/公開IP等の準拠評価
GuardDuty(脅威を自動検出)【GuardDutyが有効な場合】
VPC Flow LogsとDNSからの異常通信検知
EC2 が Instance Profile を引き受ける典型的な連携パターン
Instance Profile を介して連携するサービスInstance Profile にアタッチするポリシー
CloudWatch Logslogs:CreateLogGroup
logs:CreateLogStream
logs:PutLogEvents
CloudWatch Metricscloudwatch:PutMetricData
S3s3:ListBucket
s3:GetObject
s3:PutObject
s3:DeleteObject
DynamoDBdynamodb:GetItem
dynamodb:PutItem
dynamodb:UpdateItem
dynamodb:DeleteItem
dynamodb:Query
dynamodb:Scan
SQS(送信)sqs:SendMessage
SQS(ポーリング)sqs:ReceiveMessage
sqs:DeleteMessage
sqs:GetQueueAttributes
sqs:ChangeMessageVisibility
SNSsns:Publish
ECR on EC2ecr:GetAuthorizationToken
ecr:BatchGetImage
ecr:GetDownloadUrlForLayer
Secrets Managersecretsmanager:GetSecretValue
SSM Session ManagerAmazonSSMManagedInstanceCore
SSM Parameter Storessm:GetParameter
ssm:GetParameters
ssm:GetParametersByPath
KMSkms:GenerateDataKey
kms:Encrypt
kms:Decrypt
※)権限設計の原則

信頼ポリシー: EC2

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

ログ・監視

ログ出力先ログの種類
CloudWatch Logs【CloudWatch Agentのインストールが必要】
システムログ
アプリケーションログ
CloudWatch Logs優先の原則
標準メトリクス
メトリクス名説明
DiskReadBytesディスク読み取りバイト数
DiskReadOpsディスク読み取り回数
DiskWriteBytesディスク書き込みバイト数
DiskWriteOpsディスク書き込み回数
NetworkIn受信ネットワーク量
NetworkOut送信ネットワーク量
CPUCreditBalanceT系CPUクレジット残高
CPUCreditUsageT系CPUクレジット使用量
CPUUtilizationCPU使用率
StatusCheckFailedインスタンス全体のステータスチェック失敗
StatusCheckFailed_Instanceインスタンス側ステータス失敗
StatusCheckFailed_Systemシステム側ステータス失敗
詳細モニタリング メトリックス
メトリクス名説明
EBSReadBytesEBS読み取りバイト
EBSReadOpsEBS読み取りオペレーション
EBSWriteBytesEBS書き込みバイト
EBSWriteOpsEBS書き込みオペレーション
NetworkPacketsIn受信パケット数
NetworkPacketsOut送信パケット数
カスタムメトリクス(EC2 CloudWatch Agent インストール)
メトリクス名説明
diskio_read_bytesディスクIO読み取りバイト数
diskio_write_bytesディスクIO書き込みバイト数
diskio_readsディスクIO読み取り回数
diskio_writesディスクIO書き込み回数
diskio_io_timeディスクIO時間
mem_used_percentメモリ使用率
mem_available_percentメモリ空き率
mem_usedメモリ使用量(MB)
mem_availableメモリ空き容量(MB)
disk_used_percentディスク使用率
disk_freeディスク空き容量
disk_usedディスク使用量
swap_used_percentスワップ使用率
swap_usedスワップ使用量
swap_freeスワップ空き容量
tcp_establishedTCP ESTABLISHED接続数
tcp_time_waitTCP TIME_WAIT接続数
tcp_listenTCP LISTEN接続数
netstat_tcp_establishednetstat TCP確立済み接続数

制限値(固定値/ハードリミット/ソフトリミット)

固定値制限値
インスタンスあたりのENI数インスタンスタイプに依存
リージョンあたりのAMI数50,000(プライベート)
リージョンあたりのキーペア数5,000

ソフトリミット制限値
リージョンあたりのOn-Demand vCPU32(初期)、リクエストに応じて増加
リージョンあたりのSpot vCPUOn-Demandと同様
インスタンスあたりのセキュリティグループ数5
セキュリティグループあたりのルール数60(インバウンド)、60(アウトバウンド)
リージョンあたりのElastic IP(VPC)5
スナップショットの同時作成数5(リージョンあたり)

AWS CLIのサンプルコード

SG を作成する(VPC ID 指定)
aws ec2 create-security-group \
  --group-name web-ec2-sg \
  --vpc-id vpc-xxxxxxxxx \
  --tag-specifications 'ResourceType=security-group,Tags=[{Key=Name,Value=web-ec2-sg}]'
SG ID を表示する
aws ec2 describe-security-groups
インバウンドルールを追加する(SG ID 指定)
aws ec2 authorize-security-group-ingress \
  --group-id sg-xxxxxxxxx \
  --protocol tcp \
  --port 80 \
  --cidr 0.0.0.0/0
SG を削除する(SG ID 指定)
aws ec2 delete-security-group \
  --group-id sg-xxxxxxxxx

SSH 接続用のキーペアを作成する
aws ec2 create-key-pair \
  --key-name my-key-pair \
  --query 'KeyMaterial' \
  --output text > my-key-pair.pem
SSM 接続用の IAMロールを作成する
aws iam create-role \
  --role-name SSMInstanceRole \
  --assume-role-policy-document file://trust-policy.json
SSM 接続用の IAMロールにIAMポリシーをアタッチする(IAMロール名 指定)
aws iam attach-role-policy \
  --role-name SSMInstanceRole \
  --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
SSM 接続用の Instance Profile を作成する
aws iam create-instance-profile \
  --instance-profile-name SSMInstanceProfile
SSM 接続用の Instance Profile にIAMロールを追加する
(Instance Profile名、IAMロール名 指定)
aws iam add-role-to-instance-profile \
  --instance-profile-name SSMInstanceProfile \
  --role-name SSMInstanceRole

SSH 接続のインスタンス を作成する(Subnet ID、SG ID、キーペア 指定)
aws ec2 run-instances \
  --image-id ami-xxxxxxxxx \
  --instance-type t2.micro \
  --key-name my-key-pair \
  --subnet-id subnet-xxxxxxxxx \
  --security-group-ids sg-xxxxxxxxx \
  --associate-public-ip-address \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=MyWebServer}]'
SSM 接続のインスタンス を作成する(Subnet ID、SG ID、Instance Profile名 指定)
aws ec2 run-instances \
  --image-id ami-xxxxxxxxx \
  --instance-type t2.micro \
  --subnet-id subnet-xxxxxxxxx \
  --security-group-ids sg-xxxxxxxxx \
  --associate-public-ip-address \
  --iam-instance-profile Name=SSMInstanceProfile \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=MyWebServer}]'
インスタンス IDを表示する
aws ec2 describe-instances
インスタンスを削除する(インスタンス ID 指定)
aws ec2 terminate-instances \
  --instance-ids i-xxxxxxxxx

インスタンスを起動する(インスタンス ID 指定)
aws ec2 start-instances \
  --instance-ids i-xxxxxxxxx
インスタンスを停止する(インスタンス ID 指定)
aws ec2 stop-instances \
  --instance-ids i-xxxxxxxxx
インスタンスを再起動する(インスタンス ID 指定)
aws ec2 reboot-instances \
  --instance-ids i-xxxxxxxxx

EBS Volume ID を表示する
aws ec2 describe-volumes
EBSスナップショットを作成する(EBS Volume ID 指定)
aws ec2 create-snapshot \
  --volume-id vol-xxxxxxxxx \
  --tag-specifications 'ResourceType=snapshot,\
  Tags=[{Key=Name,Value=DB-Backup},{Key=Environment,Value=Production}]'
EBSスナップショット IDを表示する
aws ec2 describe-snapshots \
  --owner-ids self
EBSスナップショットを削除する(EBS スナップショット ID 指定)
aws ec2 delete-snapshot \
  --snapshot-id snap-xxxxxxxxx

インスタンスからAMI を作成/登録する(インスタンス ID 指定)
aws ec2 create-image \
  --instance-id i-xxxxxxxxx \
  --name "MyAMI-20241204" \
  --tag-specifications 'ResourceType=image,\
  Tags=[{Key=Name,Value=MyAMI-20241204}]'
AMI IDを表示する
aws ec2 describe-images \
  --owner-ids self
AMIを削除/登録解除する(AMI ID 指定)
aws ec2 deregister-image \
  --image-id ami-xxxxxxxxx

CloudFormationのサンプルコード

Terraformのサンプルコード

料金計算

課金項目説明
インスタンス使用時間インスタンスタイプ別の時間単位課金
(On-Demand、Reserved、Spot)
データ転送リージョン間、AZ間、インターネットへの転送量
Elastic IP使用していないElastic IPアドレスの料金
EBSボリュームアタッチされたEBSストレージの容量と種類
EBSスナップショットスナップショットの保存容量
ロードバランシングElastic Load Balancerの使用料金
詳細モニタリングCloudWatchによる詳細モニタリング
専有ホストDedicated Hostsの時間単位料金
料金計算ツール

公式ページ

AWSドキュメント EC2