AWS CLI完全ガイド:EC2インスタンスを自由に操る15の必須コマンド

目次

目次へ

AWS CLIとEC2の基礎知識

AWS CLIを使うメリット:GUIよりも高速で効率的な操作が可能に

AWS CLIは、AWSのサービスをコマンドラインから操作するためのツールです。EC2インスタンスの管理において、AWS CLIを使用することで以下のような大きなメリットが得られます:

  1. 操作の高速化と効率化
  • マウス操作が不要で、キーボードだけで完結
  • 複数のインスタンスを一括で操作可能
  • スクリプト化による自動化が容易
  1. 再現性の向上
  • コマンドをスクリプトとして保存可能
  • チーム内での手順共有が容易
  • 環境構築の再現性が高い
  1. リソース管理の詳細な制御
  • 細かいパラメータの指定が可能
  • フィルタリングによる柔軟な検索
  • 出力形式のカスタマイズ

AWS CLIのインストールと初期設定:10分で環境構築完了

AWS CLIを使い始めるための手順を説明します。

1. インストール手順

Windows環境の場合:

# MSIインストーラーをダウンロードして実行
# または、PowerShellで以下を実行
msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi

# インストール確認
aws --version

Mac/Linux環境の場合:

# curl を使用してインストール
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

# インストール確認
aws --version

2. 初期設定

AWS CLIを使用するには、アクセスキーIDとシークレットアクセスキーの設定が必要です。

# 対話形式で認証情報を設定
aws configure

# 以下の情報を順に入力
AWS Access Key ID: [アクセスキーID]
AWS Secret Access Key: [シークレットアクセスキー]
Default region name: [リージョン名(例:ap-northeast-1)]
Default output format: [出力形式(json/yaml/text)]

3. 動作確認

設定が完了したら、簡単なコマンドで動作確認を行います:

# EC2インスタンスの一覧を表示
aws ec2 describe-instances

# リージョン一覧を表示
aws ec2 describe-regions

セキュリティのベストプラクティス

  1. アクセスキーの適切な管理
  • アクセスキーは定期的にローテーション
  • 必要最小限の権限を付与したIAMユーザーを使用
  • アクセスキーを直接コードに埋め込まない
  1. 認証情報の安全な保管
  • ~/.aws/credentials ファイルのパーミッションを適切に設定
  • 環境変数を使用する場合は適切に管理
  • AWS Systems Managerのパラメータストアの活用を検討

これで基本的な環境構築は完了です。次のセクションでは、具体的なEC2インスタンスの操作コマンドについて説明していきます。

EC2インスタンスの基本操作コマンド

インスタンスの起動・停止・終了:基本的なライフサイクル管理

EC2インスタンスのライフサイクルを管理する基本的なコマンドを紹介します。

インスタンスの起動

# 基本的な起動コマンド
aws ec2 run-instances \
    --image-id ami-12345678 \
    --instance-type t2.micro \
    --key-name my-key-pair \
    --security-group-ids sg-12345678 \
    --subnet-id subnet-12345678

# より詳細な設定を含む起動例
aws ec2 run-instances \
    --image-id ami-12345678 \
    --instance-type t2.micro \
    --key-name my-key-pair \
    --security-group-ids sg-12345678 \
    --subnet-id subnet-12345678 \
    --count 1 \
    --user-data file://startup-script.sh \
    --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=MyInstance}]'

インスタンスの停止と開始

# インスタンスの停止(一時停止)
aws ec2 stop-instances --instance-ids i-1234567890abcdef0

# インスタンスの開始(再開)
aws ec2 start-instances --instance-ids i-1234567890abcdef0

# 複数インスタンスの同時操作
aws ec2 stop-instances --instance-ids i-1234567890abcdef0 i-0987654321fedcba0

インスタンスの終了(削除)

# インスタンスの終了
aws ec2 terminate-instances --instance-ids i-1234567890abcdef0

# 終了保護の確認
aws ec2 describe-instance-attribute \
    --instance-id i-1234567890abcdef0 \
    --attribute disableApiTermination

インスタンスの状態確認:詳細情報の取得方法

インスタンスの状態や詳細情報を確認するための様々なコマンドを解説します。

基本的な状態確認

# 全インスタンスの一覧と状態確認
aws ec2 describe-instances

# 特定のインスタンスの状態確認
aws ec2 describe-instances --instance-ids i-1234567890abcdef0

# インスタンスの状態のみを簡潔に取得
aws ec2 describe-instance-status --instance-ids i-1234567890abcdef0

詳細情報の取得

# インスタンスの詳細な設定情報を取得
aws ec2 describe-instance-attribute \
    --instance-id i-1234567890abcdef0 \
    --attribute instanceType

# システムステータスとインスタンスステータスの確認
aws ec2 describe-instance-status \
    --instance-ids i-1234567890abcdef0 \
    --include-all-instances

インスタンスタイプの変更:パフォーマンスチューニングの実践

インスタンスタイプの変更は、パフォーマンスとコストの最適化に重要です。

インスタンスタイプの変更手順

# 1. インスタンスの停止
aws ec2 stop-instances --instance-ids i-1234567890abcdef0

# 2. インスタンスタイプの変更
aws ec2 modify-instance-attribute \
    --instance-id i-1234567890abcdef0 \
    --instance-type t2.small

# 3. インスタンスの再開
aws ec2 start-instances --instance-ids i-1234567890abcdef0

インスタンスタイプの互換性確認

# 利用可能なインスタンスタイプの確認
aws ec2 describe-instance-types \
    --filters "Name=current-generation,Values=true" \
    --query "InstanceTypes[*].InstanceType"

# 特定のインスタンスタイプの詳細情報
aws ec2 describe-instance-types \
    --instance-types t2.micro \
    --query "InstanceTypes[*].{Type:InstanceType,vCPU:VCpuInfo.DefaultVCpus,Memory:MemoryInfo.SizeInMiB}"

重要な注意点

  1. インスタンスの停止が必要
  • タイプ変更には必ずインスタンスの停止が必要
  • ダウンタイムの発生を考慮した計画が重要
  1. データとストレージの考慮
  • EBSボリュームは自動的に引き継がれる
  • インスタンスストアは新しいものに置き換わる
  1. ネットワーク設定の影響
  • プライベートIPアドレスは保持
  • パブリックIPアドレスは変更される可能性あり

これらの基本操作を習得することで、EC2インスタンスの効率的な管理が可能になります。次のセクションでは、より高度な管理テクニックについて説明していきます。

効率的なEC2管理のためのAWS CLIテクニック

フィルタリングと検索:必要な情報だけを素早く取得

AWS CLIでは、強力なフィルタリング機能を使用して必要な情報を効率的に取得できます。

基本的なフィルタリング

# 特定のタグを持つインスタンスの検索
aws ec2 describe-instances \
    --filters "Name=tag:Environment,Values=Production" \
    --query 'Reservations[*].Instances[*].[InstanceId,State.Name]'

# 特定の状態のインスタンスを検索
aws ec2 describe-instances \
    --filters "Name=instance-state-name,Values=running" \
    --query 'Reservations[*].Instances[*].[InstanceId,InstanceType]'

複雑なフィルタリング条件の組み合わせ

# 複数条件での検索(AND条件)
aws ec2 describe-instances \
    --filters \
    "Name=instance-type,Values=t2.micro" \
    "Name=availability-zone,Values=ap-northeast-1a" \
    --query 'Reservations[*].Instances[*].[InstanceId,State.Name]'

# 特定のVPC内の特定タグを持つインスタンス
aws ec2 describe-instances \
    --filters \
    "Name=vpc-id,Values=vpc-12345678" \
    "Name=tag:Project,Values=WebApp" \
    --query 'Reservations[*].Instances[*].[InstanceId,PrivateIpAddress]'

タグを活用した一括操作:複数インスタンスの同時管理

タグを使用することで、複数のインスタンスを効率的に管理できます。

タグの付与と管理

# 既存インスタンスへのタグ付与
aws ec2 create-tags \
    --resources i-1234567890abcdef0 \
    --tags Key=Environment,Value=Production Key=Project,Value=WebApp

# 複数リソースへの一括タグ付与
aws ec2 create-tags \
    --resources i-1234567890abcdef0 i-0987654321fedcba0 \
    --tags Key=Backup,Value=Daily

# タグに基づく一括操作
aws ec2 describe-instances \
    --filters "Name=tag:Backup,Values=Daily" \
    --query 'Reservations[*].Instances[*].InstanceId' \
    --output text | xargs -n1 aws ec2 create-snapshot --volume-id

タグベースの自動化スクリプト例

#!/bin/bash
# 開発環境のインスタンスを一括停止するスクリプト
aws ec2 describe-instances \
    --filters "Name=tag:Environment,Values=Development" \
    "Name=instance-state-name,Values=running" \
    --query 'Reservations[*].Instances[*].InstanceId' \
    --output text | \
    xargs -n1 aws ec2 stop-instances --instance-ids

出力カスタマイズ:JSON/YAML/テキスト形式の使い方

AWS CLIの出力形式をカスタマイズすることで、情報の可読性と処理効率を向上させることができます。

基本的な出力形式

# JSON形式での出力(デフォルト)
aws ec2 describe-instances --output json

# YAML形式での出力
aws ec2 describe-instances --output yaml

# テキスト形式での出力
aws ec2 describe-instances --output text

JQを使用した高度な出力処理

# インスタンスIDとプライベートIPのみを抽出
aws ec2 describe-instances | \
    jq -r '.Reservations[].Instances[] | [.InstanceId, .PrivateIpAddress] | @tsv'

# タグ名でグループ化された情報を取得
aws ec2 describe-instances | \
    jq -r '.Reservations[].Instances[] | 
    {InstanceId, Tags: (.Tags // [] | map({(.Key): .Value}) | add)}'

実用的な出力カスタマイズ例

# CSVフォーマットでの出力
aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].[InstanceId,InstanceType,State.Name,PrivateIpAddress]' \
    --output text | sed 's/\t/,/g' > instances.csv

# 人間が読みやすい形式での出力
aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].{
        ID:InstanceId,
        Type:InstanceType,
        State:State.Name,
        IP:PrivateIpAddress
    }' \
    --output table

効率的な情報抽出のためのクエリ例

# 特定の情報のみを抽出
aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].{
        Instance:InstanceId,
        Name:Tags[?Key==`Name`].Value | [0],
        Type:InstanceType,
        State:State.Name
    }'

# ネストされた情報の抽出
aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].{
        Instance:InstanceId,
        VPC:VpcId,
        Subnet:SubnetId,
        Security:SecurityGroups[*].GroupId
    }'

これらのテクニックを組み合わせることで、EC2インスタンスの管理作業を大幅に効率化できます。次のセクションでは、これらの知識を活用した自動化とスクリプティングについて説明します。

自動化とスクリプティング

シェルスクリプトでの活用:定期的なバックアップの自動化

AWS CLIをシェルスクリプトと組み合わせることで、複雑な運用タスクを自動化できます。

日次バックアップスクリプトの実装

#!/bin/bash

# バックアップ作成の関数定義
create_backup() {
    local instance_id=$1
    local description="Daily-Backup-$(date +%Y%m%d)"

    # インスタンスに接続されているEBSボリュームを取得
    volumes=$(aws ec2 describe-volumes \
        --filters "Name=attachment.instance-id,Values=$instance_id" \
        --query 'Volumes[*].VolumeId' \
        --output text)

    # 各ボリュームのスナップショットを作成
    for volume in $volumes; do
        echo "Creating snapshot for volume $volume"
        aws ec2 create-snapshot \
            --volume-id "$volume" \
            --description "$description" \
            --tag-specifications "ResourceType=snapshot,Tags=[{Key=AutoBackup,Value=true}]"
    done
}

# 古いバックアップの削除
cleanup_old_snapshots() {
    # 30日以上前のスナップショットを検索して削除
    old_snapshots=$(aws ec2 describe-snapshots \
        --owner-ids self \
        --filters "Name=tag:AutoBackup,Values=true" \
        --query 'Snapshots[?StartTime<=`'$(date -d "30 days ago" --iso-8601=seconds)'`].SnapshotId' \
        --output text)

    for snapshot in $old_snapshots; do
        echo "Deleting old snapshot $snapshot"
        aws ec2 delete-snapshot --snapshot-id "$snapshot"
    done
}

# メイン処理
main() {
    # 本番環境のインスタンスを取得
    instances=$(aws ec2 describe-instances \
        --filters "Name=tag:Environment,Values=Production" \
        --query 'Reservations[*].Instances[*].InstanceId' \
        --output text)

    # 各インスタンスのバックアップを作成
    for instance in $instances; do
        create_backup "$instance"
    done

    # クリーンアップ実行
    cleanup_old_snapshots
}

# スクリプト実行
main

エラーハンドリング:トラブルシューティングのベストプラクティス

AWS CLIコマンドの実行時には適切なエラーハンドリングが重要です。

エラーハンドリングの基本実装

#!/bin/bash

# エラーハンドリング関数
handle_error() {
    local exit_code=$1
    local error_message=$2

    if [ $exit_code -ne 0 ]; then
        echo "エラーが発生しました: $error_message" >&2
        # Slack通知やメール送信などの処理を追加可能
        exit $exit_code
    fi
}

# AWS CLIコマンド実行のラッパー関数
execute_aws_command() {
    local command=$1
    local error_message=$2

    output=$(eval "$command")
    handle_error $? "$error_message"
    echo "$output"
}

# 使用例
start_instance() {
    local instance_id=$1

    execute_aws_command \
        "aws ec2 start-instances --instance-ids $instance_id" \
        "インスタンス $instance_id の起動に失敗しました"
}

# リトライ処理の実装
retry_command() {
    local max_attempts=3
    local command=$1
    local attempt=1

    while [ $attempt -le $max_attempts ]; do
        if eval "$command"; then
            return 0
        fi

        echo "試行 $attempt 失敗。リトライします..."
        sleep $((attempt * 2))
        attempt=$((attempt + 1))
    done

    return 1
}

環境変数の活用:セキュアな認証情報の管理

認証情報を安全に管理しながら自動化スクリプトを実行する方法を説明します。

環境変数の設定と使用

#!/bin/bash

# 環境変数の設定例(.envファイルから読み込み)
load_env() {
    if [ -f .env ]; then
        export $(cat .env | grep -v '^#' | xargs)
    fi
}

# AWS認証情報の検証
verify_aws_credentials() {
    if [ -z "$AWS_ACCESS_KEY_ID" ] || [ -z "$AWS_SECRET_ACCESS_KEY" ]; then
        echo "AWS認証情報が設定されていません" >&2
        exit 1
    fi
}

# プロファイルの切り替え
switch_aws_profile() {
    local profile=$1
    export AWS_PROFILE=$profile

    # プロファイルの有効性を確認
    aws sts get-caller-identity >/dev/null 2>&1 || {
        echo "プロファイル $profile は無効です" >&2
        exit 1
    }
}

セキュアな実装例

#!/bin/bash

# セキュリティ設定
set -euo pipefail

# 機密情報を含む一時ファイルの安全な処理
cleanup() {
    # 一時ファイルの削除
    rm -f /tmp/aws_temp_*

    # AWS_SESSION_TOKENのクリア
    unset AWS_SESSION_TOKEN
}

# スクリプト終了時のクリーンアップ
trap cleanup EXIT

# 一時的な認証情報の使用
use_temporary_credentials() {
    local role_arn=$1

    # STSで一時的な認証情報を取得
    credentials=$(aws sts assume-role \
        --role-arn "$role_arn" \
        --role-session-name "AutomationScript")

    # 認証情報を環境変数に設定
    export AWS_ACCESS_KEY_ID=$(echo $credentials | jq -r .Credentials.AccessKeyId)
    export AWS_SECRET_ACCESS_KEY=$(echo $credentials | jq -r .Credentials.SecretAccessKey)
    export AWS_SESSION_TOKEN=$(echo $credentials | jq -r .Credentials.SessionToken)
}

これらの自動化スクリプトとセキュリティ実装を活用することで、EC2インスタンスの管理を効率的かつ安全に行うことができます。次のセクションでは、実践的なユースケースについて説明していきます。

実践的なユースケース

本番環境のスケールアップ:負荷対応のための迅速な対処法

突発的な負荷増加に対応するため、本番環境のEC2インスタンスを安全にスケールアップする方法を解説します。

負荷対応の自動化スクリプト

#!/bin/bash

# 設定値
THRESHOLD_CPU=80
INSTANCE_ID="i-1234567890abcdef0"
NEW_INSTANCE_TYPE="t2.large"

# CPU使用率の監視
monitor_cpu_usage() {
    aws cloudwatch get-metric-statistics \
        --namespace AWS/EC2 \
        --metric-name CPUUtilization \
        --dimensions Name=InstanceId,Value=$INSTANCE_ID \
        --start-time $(date -u -v-5M "+%Y-%m-%dT%H:%M:%SZ") \
        --end-time $(date -u "+%Y-%m-%dT%H:%M:%SZ") \
        --period 300 \
        --statistics Average \
        --query 'Datapoints[0].Average' \
        --output text
}

# スケールアップの実行
perform_scale_up() {
    # 事前チェック
    echo "現在のインスタンス状態を確認中..."
    current_state=$(aws ec2 describe-instances \
        --instance-ids $INSTANCE_ID \
        --query 'Reservations[0].Instances[0].State.Name' \
        --output text)

    # インスタンスタイプ変更の実行
    echo "インスタンスを停止中..."
    aws ec2 stop-instances --instance-ids $INSTANCE_ID
    aws ec2 wait instance-stopped --instance-ids $INSTANCE_ID

    echo "インスタンスタイプを変更中..."
    aws ec2 modify-instance-attribute \
        --instance-id $INSTANCE_ID \
        --instance-type "{\"Value\": \"$NEW_INSTANCE_TYPE\"}"

    echo "インスタンスを再起動中..."
    aws ec2 start-instances --instance-ids $INSTANCE_ID
    aws ec2 wait instance-running --instance-ids $INSTANCE_ID
}

スケールアップ時の注意点

  1. 事前準備
  • 現在の設定のバックアップ
  • ダウンタイムの通知
  • ロードバランサーからの切り離し
  1. 実行手順のチェックリスト
  • インスタンスの状態確認
  • 依存サービスの確認
  • バックアップの作成
  • 変更の実行
  • 動作確認

開発環境のコピー:テスト環境の素早い構築方法

開発環境を正確にコピーして新しいテスト環境を構築する方法を説明します。

環境複製スクリプト

#!/bin/bash

# 設定
SOURCE_INSTANCE_ID="i-source123456"
TARGET_NAME="test-environment"
TARGET_SUBNET_ID="subnet-12345678"
TARGET_SG_ID="sg-12345678"

# インスタンスのAMIを作成
create_ami() {
    local ami_id=$(aws ec2 create-image \
        --instance-id $SOURCE_INSTANCE_ID \
        --name "Copy-$TARGET_NAME-$(date +%Y%m%d)" \
        --description "Copy of $SOURCE_INSTANCE_ID for testing" \
        --no-reboot \
        --query 'ImageId' \
        --output text)

    echo "AMI作成中... ($ami_id)"
    aws ec2 wait image-available --image-ids $ami_id
    echo "AMI作成完了"

    echo $ami_id
}

# 新しい環境の構築
launch_new_environment() {
    local ami_id=$1

    aws ec2 run-instances \
        --image-id $ami_id \
        --instance-type t2.micro \
        --subnet-id $TARGET_SUBNET_ID \
        --security-group-ids $TARGET_SG_ID \
        --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=$TARGET_NAME}]" \
        --query 'Instances[0].InstanceId' \
        --output text
}

コスト最適化:未使用インスタンスの検出と停止

コスト最適化のための未使用インスタンスの検出と管理方法を紹介します。

コスト最適化スクリプト

#!/bin/bash

# 設定
CPU_THRESHOLD=10
DAYS_THRESHOLD=7

# 低使用率インスタンスの検出
find_underutilized_instances() {
    aws ec2 describe-instances \
        --filters "Name=instance-state-name,Values=running" \
        --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==`Name`].Value|[0]]' \
        --output text | while read -r instance_id instance_name; do

        # CPU使用率の確認
        avg_cpu=$(aws cloudwatch get-metric-statistics \
            --namespace AWS/EC2 \
            --metric-name CPUUtilization \
            --dimensions Name=InstanceId,Value=$instance_id \
            --start-time $(date -d "$DAYS_THRESHOLD days ago" --iso-8601=seconds) \
            --end-time $(date --iso-8601=seconds) \
            --period 86400 \
            --statistics Average \
            --query 'Datapoints[*].Average' \
            --output text)

        if [ $(echo "$avg_cpu < $CPU_THRESHOLD" | bc -l) -eq 1 ]; then
            echo "低使用率インスタンス検出: $instance_id ($instance_name)"
            echo "  平均CPU使用率: $avg_cpu%"
        fi
    done
}

# コスト最適化レポートの生成
generate_cost_report() {
    # インスタンスタイプごとの集計
    echo "インスタンスタイプ別集計:"
    aws ec2 describe-instances \
        --query 'Reservations[].Instances[].[InstanceType]' \
        --output text | sort | uniq -c

    # 停止中のインスタス一覧
    echo -e "\n停止中のインスタンス:"
    aws ec2 describe-instances \
        --filters "Name=instance-state-name,Values=stopped" \
        --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==`Name`].Value|[0]]' \
        --output text

    # EBSボリューム使用状況
    echo -e "\n未接続のEBSボリューム:"
    aws ec2 describe-volumes \
        --filters "Name=status,Values=available" \
        --query 'Volumes[].[VolumeId,Size]' \
        --output text
}

コスト最適化のベストプラクティス

  1. 定期的なモニタリング
  • CPU使用率の監視
  • メモリ使用率の確認
  • ネットワーク使用量の分析
  1. 自動化による管理
  • 開発環境の自動停止
  • 未使用リソースの検出
  • コストレポートの自動生成
  1. リソースのライフサイクル管理
  • タグベースの管理
  • 使用期限の設定
  • 定期的なクリーンアップ

これらの実践的なユースケースを理解し、適切に実装することで、効率的なEC2インスタンスの管理が可能になります。次のセクションでは、トラブルシューティングとベストプラクティスについて説明します。

トラブルシューティングとベストプラクティス

よくあるエラーとその解決方法:実践的な対処法

AWS CLIを使用する際によく遭遇するエラーとその解決方法を解説します。

認証関連のエラー

# エラー例1: 認証情報が見つからない
$ aws ec2 describe-instances
Unable to locate credentials

# 解決方法
aws configure  # 認証情報を設定
# または
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_KEY"

権限関連のエラー

# エラー例2: 権限不足
An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.

# 解決方法:必要な権限の確認
aws iam get-user  # 現在のユーザーを確認
aws iam list-attached-user-policies --user-name YOUR_USERNAME  # 付与されているポリシーを確認

# 最小権限ポリシーの例
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "*"
        }
    ]
}

リソース制限関連のエラー

# エラー例3: インスタンス制限到達
An error occurred (InstanceLimitExceeded) when calling the RunInstances operation

# 解決方法:現在の制限確認
aws service-quotas get-service-quota \
    --service-code ec2 \
    --quota-code L-1216C47A

# 制限緩和リクエスト
aws service-quotas request-service-quota-increase \
    --service-code ec2 \
    --quota-code L-1216C47A \
    --desired-value 20

セキュリティベストプラクティス:安全な運用のために

EC2インスタンスを安全に運用するためのベストプラクティスを紹介します。

セキュリティグループの適切な設定

# セキュリティグループの作成
aws ec2 create-security-group \
    --group-name "web-server-sg" \
    --description "Security group for web servers"

# 必要最小限のポートのみを開放
aws ec2 authorize-security-group-ingress \
    --group-name "web-server-sg" \
    --protocol tcp \
    --port 80 \
    --cidr 0.0.0.0/0

# 定期的なセキュリティグループルールの監査
aws ec2 describe-security-groups \
    --query 'SecurityGroups[*].{Name:GroupName,Rules:IpPermissions}' \
    --output json > security_audit.json

IAMロールの適切な使用

# インスタンスプロファイルの作成
aws iam create-instance-profile \
    --instance-profile-name "web-server-profile"

# ロールの作成と設定
aws iam create-role \
    --role-name "web-server-role" \
    --assume-role-policy-document '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "ec2.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }'

# 最小権限の付与
aws iam attach-role-policy \
    --role-name "web-server-role" \
    --policy-arn "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"

パフォーマンス最適化:応答速度を向上させるテクニック

EC2インスタンスのパフォーマンスを最適化するためのテクニックを解説します。

パフォーマンスモニタリングの実装

#!/bin/bash

# CloudWatchメトリクスの取得
monitor_instance_performance() {
    local instance_id=$1
    local start_time=$(date -d '1 hour ago' --iso-8601=seconds)
    local end_time=$(date --iso-8601=seconds)

    # CPU使用率
    aws cloudwatch get-metric-statistics \
        --namespace AWS/EC2 \
        --metric-name CPUUtilization \
        --dimensions Name=InstanceId,Value=$instance_id \
        --start-time $start_time \
        --end-time $end_time \
        --period 300 \
        --statistics Average Maximum

    # メモリ使用率(カスタムメトリクス)
    aws cloudwatch get-metric-statistics \
        --namespace Custom/EC2 \
        --metric-name MemoryUtilization \
        --dimensions Name=InstanceId,Value=$instance_id \
        --start-time $start_time \
        --end-time $end_time \
        --period 300 \
        --statistics Average Maximum
}

# アラームの設定
set_performance_alarms() {
    local instance_id=$1

    # CPU使用率アラーム
    aws cloudwatch put-metric-alarm \
        --alarm-name "HighCPU-$instance_id" \
        --alarm-description "CPU usage exceeds 80%" \
        --metric-name CPUUtilization \
        --namespace AWS/EC2 \
        --dimensions Name=InstanceId,Value=$instance_id \
        --period 300 \
        --evaluation-periods 2 \
        --threshold 80 \
        --comparison-operator GreaterThanThreshold \
        --statistic Average \
        --alarm-actions arn:aws:sns:region:account-id:topic-name
}

パフォーマンス最適化のベストプラクティス

  1. インスタンスサイジング
  • 適切なインスタンスタイプの選択
  • 定期的な使用率の確認
  • コストパフォーマンスの最適化
# インスタンスタイプの推奨事項を取得
aws compute-optimizer get-ec2-instance-recommendations \
    --instance-arns arn:aws:ec2:region:account-id:instance/instance-id
  1. ストレージ最適化
  • EBSボリュームの最適化
  • IOPSの監視と調整
  • ボリュームタイプの適切な選択
# EBSボリュームのパフォーマンス確認
aws cloudwatch get-metric-statistics \
    --namespace AWS/EBS \
    --metric-name VolumeReadOps \
    --dimensions Name=VolumeId,Value=vol-1234567890abcdef0 \
    --start-time $(date -d '1 hour ago' --iso-8601=seconds) \
    --end-time $(date --iso-8601=seconds) \
    --period 300 \
    --statistics Average
  1. ネットワーク最適化
  • プレイスメントグループの使用
  • Enhanced Networkingの有効化
  • ネットワークパフォーマンスの監視
# ネットワークパフォーマンスの確認
aws cloudwatch get-metric-statistics \
    --namespace AWS/EC2 \
    --metric-name NetworkIn \
    --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
    --start-time $(date -d '1 hour ago' --iso-8601=seconds) \
    --end-time $(date --iso-8601=seconds) \
    --period 300 \
    --statistics Average

これらのベストプラクティスとトラブルシューティング手法を適切に実装することで、EC2インスタンスの安定した運用が可能になります。定期的な見直しと更新を行い、常に最適な状態を維持することが重要です。