
【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 Logs | logs:CreateLogGroup logs:CreateLogStream logs:PutLogEvents |
| CloudWatch Metrics | cloudwatch:PutMetricData |
| S3 | s3:ListBucket s3:GetObject s3:PutObject s3:DeleteObject |
| DynamoDB | dynamodb:GetItem dynamodb:PutItem dynamodb:UpdateItem dynamodb:DeleteItem dynamodb:Query dynamodb:Scan |
| SQS(送信) | sqs:SendMessage |
| SQS(ポーリング) | sqs:ReceiveMessage sqs:DeleteMessage sqs:GetQueueAttributes sqs:ChangeMessageVisibility |
| SNS | sns:Publish |
| ECR on EC2 | ecr:GetAuthorizationToken ecr:BatchGetImage ecr:GetDownloadUrlForLayer |
| Secrets Manager | secretsmanager:GetSecretValue |
| SSM Session Manager | AmazonSSMManagedInstanceCore |
| SSM Parameter Store | ssm:GetParameter ssm:GetParameters ssm:GetParametersByPath |
| KMS | kms: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のインストールが必要】 システムログ アプリケーションログ |
標準メトリクス
| メトリクス名 | 説明 |
|---|---|
| DiskReadBytes | ディスク読み取りバイト数 |
| DiskReadOps | ディスク読み取り回数 |
| DiskWriteBytes | ディスク書き込みバイト数 |
| DiskWriteOps | ディスク書き込み回数 |
| NetworkIn | 受信ネットワーク量 |
| NetworkOut | 送信ネットワーク量 |
| CPUCreditBalance | T系CPUクレジット残高 |
| CPUCreditUsage | T系CPUクレジット使用量 |
| CPUUtilization | CPU使用率 |
| StatusCheckFailed | インスタンス全体のステータスチェック失敗 |
| StatusCheckFailed_Instance | インスタンス側ステータス失敗 |
| StatusCheckFailed_System | システム側ステータス失敗 |
詳細モニタリング メトリックス
| メトリクス名 | 説明 |
|---|---|
| EBSReadBytes | EBS読み取りバイト |
| EBSReadOps | EBS読み取りオペレーション |
| EBSWriteBytes | EBS書き込みバイト |
| EBSWriteOps | EBS書き込みオペレーション |
| 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_established | TCP ESTABLISHED接続数 |
| tcp_time_wait | TCP TIME_WAIT接続数 |
| tcp_listen | TCP LISTEN接続数 |
| netstat_tcp_established | netstat TCP確立済み接続数 |
制限値(固定値/ハードリミット/ソフトリミット)
| 固定値 | 制限値 |
|---|---|
| インスタンスあたりのENI数 | インスタンスタイプに依存 |
| リージョンあたりのAMI数 | 50,000(プライベート) |
| リージョンあたりのキーペア数 | 5,000 |
| ソフトリミット | 制限値 |
|---|---|
| リージョンあたりのOn-Demand vCPU | 32(初期)、リクエストに応じて増加 |
| リージョンあたりのSpot vCPU | On-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の時間単位料金 |