第5章:クラウド環境特有のトラブルシューティング

章の概要

学習目標: クラウド環境での責任分担、分散アーキテクチャ、サービス依存を理解し、クラウド特有の診断手法を習得する
前提知識: 第4章の各レイヤー診断技術
到達点: クラウドネイティブなトラブルシューティング能力の獲得
想定学習時間: 5-6時間


5.1 クラウドサービスの障害パターンと影響分析

難易度: ★★☆(中級)

共有責任モデルにおける責任範囲の明確化

クラウドサービスでは、クラウドプロバイダーと利用者の間で運用責任が分担されます。問題発生時の適切な対応のために、責任範囲を正確に理解することが必要です。

IaaS環境での責任分担では、インフラストラクチャサービスでの責任範囲を明確化します。

プロバイダー責任範囲:

  • 物理インフラ(データセンター、ハードウェア)
  • 仮想化レイヤー(ハイパーバイザー)
  • ネットワークインフラ(物理ネットワーク)
  • 基本セキュリティ(物理セキュリティ)

利用者責任範囲は、ゲストOS以上の全ての層に及びます。OSのシステムサービス状態の管理、ネットワークインターフェースの設定、セキュリティポリシーの実装など、従来のシステム管理者が行っていた作業の多くが、引き続き利用者の責任となります。

PaaS環境での責任分担では、プラットフォームサービスでの責任範囲を理解します。

プロバイダー責任範囲:

  • OS、ランタイム環境
  • ミドルウェア、開発フレームワーク
  • プラットフォーム監視

利用者責任範囲:

  • アプリケーションコード
  • データ管理
  • ユーザー認証・認可
  • API使用

SaaS環境での責任分担では、ソフトウェアサービスでの責任範囲を把握します。

リージョンとアベイラビリティゾーンの障害影響

リージョン障害の特性と対策では、広範囲での障害への対応を計画します。

リージョン障害の確認:

# AWS CLI での複数リージョン確認
aws ec2 describe-regions
aws sts get-caller-identity --region us-east-1
aws sts get-caller-identity --region us-west-2

# サービス状況確認
curl -s https://status.aws.amazon.com/

マルチリージョン戦略:

  • データレプリケーション設定
  • DNS フェイルオーバー設定
  • アプリケーションの地理分散

アベイラビリティゾーン障害の管理では、リージョン内での障害分散を図ります。

AZ障害の検出:

# EC2インスタンスのAZ確認
aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Placement.AvailabilityZone]'

# ELBのヘルスチェック確認
aws elbv2 describe-target-health --target-group-arn arn:aws:elasticloadbalancing:...

クラウドサービス固有の監視と診断

サービス可用性の監視では、依存するクラウドサービスの状態を継続的に監視します。

サービスヘルスの監視は、各クラウドプロバイダーのヘルスダッシュボードやAPIを通じて、サービスの健全性、性能低下、部分的障害、地域限定の問題などを継続的に評価します。Personal Health DashboardやService Healthの情報は、プロアクティブな監視と予防的な対応を可能にします。

APIレート制限とリソース制約の本質

クラウドサービスのAPIレート制限は、サービスの安定性と公平性を保つための重要な保護機構です。不適切なAPI使用パターンは、アプリケーションの性能低下、サービスの一時停止、予期しないコスト増加を引き起こす可能性があります。

APIレート制限の設計は、サービスごと、操作ごと、ユーザーごとに異なり、バースト容量、持続可能レート、リクエストキューの深さなど、複数のパラメーターで制御されています。効果的なAPI使用戦略には、指数バックオフ、リクエストのバッチ化、キャッシュ戦略の最適化などが含まれます。


5.2 主要クラウドプロバイダーでの実践的アプローチ

難易度: ★★★(上級)

AWS(Amazon Web Services)での診断技術

CloudWatch による統合監視では、AWS全体のメトリクス監視とアラート管理を行います。

CloudWatchメトリクス確認:

# EC2インスタンスメトリクス
aws cloudwatch get-metric-statistics \
  --namespace AWS/EC2 \
  --metric-name CPUUtilization \
  --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
  --start-time 2023-01-01T00:00:00Z \
  --end-time 2023-01-01T23:59:59Z \
  --period 300 \
  --statistics Average

# RDSパフォーマンス確認
aws cloudwatch get-metric-statistics \
  --namespace AWS/RDS \
  --metric-name DatabaseConnections \
  --dimensions Name=DBInstanceIdentifier,Value=mydb-instance \
  --start-time 2023-01-01T00:00:00Z \
  --end-time 2023-01-01T23:59:59Z \
  --period 300 \
  --statistics Average

AWS X-Ray による分散トレーシングでは、マイクロサービスアーキテクチャでの問題を分析します。

X-Rayトレース分析:

# トレース取得
aws xray get-trace-summaries \
  --time-range-type TimeRangeByStartTime \
  --start-time 2023-01-01T00:00:00 \
  --end-time 2023-01-01T23:59:59

# サービスマップ取得
aws xray get-service-graph \
  --start-time 2023-01-01T00:00:00 \
  --end-time 2023-01-01T23:59:59

VPC Flow Logs による ネットワーク分析では、AWS ネットワーク内のトラフィックを詳細に分析します。

Flow Logs分析:

# Flow Logsの有効化確認
aws ec2 describe-flow-logs

# CloudWatch Logs でのFlow Logs確認
aws logs describe-log-groups --log-group-name-prefix VPCFlowLogs

Azure での診断と監視

Azure Monitor の活用では、Azure全体の統合監視を実現します。

Azure Monitor確認:

# リソースのメトリクス確認
az monitor metrics list --resource /subscriptions/.../resourceGroups/myRG/providers/Microsoft.Compute/virtualMachines/myVM

# ログクエリ実行
az monitor log-analytics query \
  --workspace workspace-id \
  --analytics-query "Heartbeat | where Computer == 'myVM' | limit 10"

Application Insights による アプリケーション監視では、アプリケーション性能の詳細監視を行います。

Application Insights確認:

# アプリケーション可用性確認
az monitor app-insights query \
  --app app-id \
  --analytics-query "requests | where timestamp > ago(1h) | summarize count() by bin(timestamp, 5m)"

Google Cloud Platform(GCP)での監視と分析

Cloud Monitoring による統合監視では、GCP リソースの包括的な監視を実現します。

Cloud Monitoring確認:

# メトリクス確認
gcloud monitoring metrics list --filter="resource.type=gce_instance"

# アラートポリシー確認
gcloud alpha monitoring policies list

Cloud Logging による ログ分析では、GCP全体のログを統合的に分析します。

Cloud Logging確認:

# ログエントリ確認
gcloud logging read "resource.type=gce_instance AND severity>=ERROR" --limit=50

# ログベースメトリクス確認
gcloud logging metrics list

5.3 サーバーレス・コンテナ環境の課題と対策

難易度: ★★★(上級)

サーバーレス環境でのトラブルシューティング

関数実行とパフォーマンスの分析では、サーバーレス関数の実行特性を詳細に分析します。

Lambda関数診断(AWS):

# Lambda関数のログ確認
aws logs describe-log-groups --log-group-name-prefix /aws/lambda/

# 関数の設定確認
aws lambda get-function --function-name my-function

# 実行統計の確認
aws lambda get-function-configuration --function-name my-function

コールドスタート分析:

import time
import json

def lambda_handler(event, context):
    # コールドスタート検出
    if 'cold_start' not in globals():
        global cold_start
        cold_start = True
        print("Cold start detected")
    else:
        print("Warm start")
    
    start_time = time.time()
    # 処理実行
    processing_time = time.time() - start_time
    
    return {
        'statusCode': 200,
        'body': json.dumps({
            'processing_time': processing_time
        })
    }

イベントドリブンアーキテクチャの監視では、イベントの流れと処理状況を包括的に監視します。

SQSキュー監視:

# キューの状況確認
aws sqs get-queue-attributes \
  --queue-url https://sqs.region.amazonaws.com/account/queue-name \
  --attribute-names All

# デッドレターキューの確認
aws sqs receive-message \
  --queue-url https://sqs.region.amazonaws.com/account/dlq-name \
  --max-number-of-messages 10

コンテナ環境での診断技術

コンテナライフサイクルの監視では、コンテナの作成から終了までの全ライフサイクルを監視します。

Docker診断:

# コンテナ状態確認
docker ps -a
docker stats

# コンテナログ確認
docker logs container-id --timestamps

# コンテナ内でのプロセス確認
docker exec container-id ps aux

Kubernetes クラスタの診断では、Kubernetes環境での包括的な問題診断を行います。

Kubernetes診断:

# クラスタ状態確認
kubectl cluster-info
kubectl get nodes -o wide

# ポッド状態確認
kubectl get pods --all-namespaces
kubectl describe pod pod-name

# サービス確認
kubectl get services
kubectl get endpoints

# ログ確認
kubectl logs pod-name -c container-name --previous

ポッド診断詳細:

# ポッドのリソース使用量
kubectl top pods --all-namespaces

# ポッドのイベント履歴
kubectl get events --sort-by=.metadata.creationTimestamp

# ネットワーク診断
kubectl exec -it pod-name -- nslookup kubernetes.default

コンテナセキュリティの監視では、コンテナ環境固有のセキュリティリスクを管理します。

セキュリティ診断:

# コンテナイメージの脆弱性スキャン
docker scan image-name

# Kubernetesセキュリティポリシー確認
kubectl get podsecuritypolicy
kubectl get networkpolicy

# RBAC設定確認
kubectl get rolebindings --all-namespaces
kubectl auth can-i create pods --as=system:serviceaccount:default:default

5.4 クラウド運用コストに関わるトラブルシューティング

難易度: ★★☆(中級)

コスト急増の原因分析と対策

クラウドの従量課金モデルでは、設定ミスや予期しない負荷により、コストが急激に増加する可能性があります。

コスト監視と異常検知では、継続的なコスト監視により異常を早期発見します。

AWS Cost Explorer API使用:

# コスト情報取得
aws ce get-cost-and-usage \
  --time-period Start=2023-01-01,End=2023-01-31 \
  --granularity DAILY \
  --metrics BlendedCost \
  --group-by Type=DIMENSION,Key=SERVICE

# 予算確認
aws budgets describe-budgets --account-id 123456789012

Azure Cost Management:

# コスト分析
az consumption usage list --top 10

# 予算アラート確認
az consumption budget list

リソース使用効率の最適化では、クラウドリソースの効率的な利用により、コストパフォーマンスを向上させます。

未使用リソース検出:

# AWS 未使用EBSボリューム検出
aws ec2 describe-volumes \
  --filters Name=status,Values=available \
  --query 'Volumes[*].[VolumeId,Size,CreateTime]'

# 未使用Elastic IP検出
aws ec2 describe-addresses \
  --query 'Addresses[?AssociationId==null].[PublicIp,AllocationId]'

# 停止中のEC2インスタンス
aws ec2 describe-instances \
  --filters Name=instance-state-name,Values=stopped \
  --query 'Reservations[*].Instances[*].[InstanceId,InstanceType,LaunchTime]'

リソースサイジング分析:

# CloudWatchメトリクスを使用したサイジング分析
import boto3
from datetime import datetime, timedelta

def analyze_instance_utilization(instance_id):
    cloudwatch = boto3.client('cloudwatch')
    
    end_time = datetime.utcnow()
    start_time = end_time - timedelta(days=7)
    
    # CPU使用率取得
    cpu_metrics = cloudwatch.get_metric_statistics(
        Namespace='AWS/EC2',
        MetricName='CPUUtilization',
        Dimensions=[{'Name': 'InstanceId', 'Value': instance_id}],
        StartTime=start_time,
        EndTime=end_time,
        Period=3600,
        Statistics=['Average', 'Maximum']
    )
    
    avg_cpu = sum(point['Average'] for point in cpu_metrics['Datapoints']) / len(cpu_metrics['Datapoints'])
    max_cpu = max(point['Maximum'] for point in cpu_metrics['Datapoints'])
    
    if avg_cpu < 20 and max_cpu < 50:
        return "Oversized - consider downsizing"
    elif avg_cpu > 80 or max_cpu > 90:
        return "Undersized - consider upsizing"
    else:
        return "Appropriately sized"

課金最適化戦略では、クラウドプロバイダーの課金オプションを効果的に活用します。

Reserved Instance分析:

# AWS Reserved Instance使用状況
aws ce get-reservation-utilization \
  --time-period Start=2023-01-01,End=2023-01-31

# Savings Plans使用状況
aws ce get-savings-plans-utilization \
  --time-period Start=2023-01-01,End=2023-01-31

リソース最適化と自動化

Infrastructure as Code(IaC)による管理では、インフラストラクチャの定義と管理を自動化します。

Terraformでのコスト最適化:

# terraform/cost-optimization.tf
resource "aws_instance" "web" {
  ami           = data.aws_ami.amazon_linux.id
  instance_type = var.instance_type
  
  # スポットインスタンスの使用
  instance_market_options {
    market_type = "spot"
    spot_options {
      max_price = "0.05"
    }
  }
  
  # 自動停止タグ
  tags = {
    AutoStop = "true"
    Environment = var.environment
  }
}

# Auto Scaling設定
resource "aws_autoscaling_group" "web" {
  name                = "web-asg"
  min_size            = 1
  max_size            = 10
  desired_capacity    = 2
  vpc_zone_identifier = var.subnet_ids
  
  # コスト最適化のためのmixed instances
  mixed_instances_policy {
    instances_distribution {
      on_demand_percentage = 20
      spot_allocation_strategy = "diversified"
    }
    
    launch_template {
      launch_template_specification {
        launch_template_id = aws_launch_template.web.id
        version = "$Latest"
      }
      
      override {
        instance_type = "t3.medium"
      }
      override {
        instance_type = "t3.large"
      }
    }
  }
}

監視とアラートの自動化では、運用監視を包括的に自動化します。

CloudWatchアラーム設定:

# コスト異常検知アラーム
aws cloudwatch put-anomaly-detector \
  --namespace AWS/Billing \
  --metric-name EstimatedCharges \
  --stat Average \
  --dimensions Name=Currency,Value=USD

# 高CPU使用率アラーム
aws cloudwatch put-metric-alarm \
  --alarm-name cpu-high \
  --alarm-description "High CPU usage" \
  --metric-name CPUUtilization \
  --namespace AWS/EC2 \
  --statistic Average \
  --period 300 \
  --threshold 80 \
  --comparison-operator GreaterThanThreshold \
  --evaluation-periods 2

Lambda自動修復関数:

import boto3
import json

def lambda_handler(event, context):
    ec2 = boto3.client('ec2')
    
    # CloudWatchアラームからのイベント処理
    alarm_data = json.loads(event['Records'][0]['Sns']['Message'])
    
    if alarm_data['AlarmName'] == 'cpu-high':
        instance_id = alarm_data['Trigger']['Dimensions'][0]['value']
        
        # インスタンスの詳細取得
        response = ec2.describe_instances(InstanceIds=[instance_id])
        instance = response['Reservations'][0]['Instances'][0]
        
        # 自動スケールアップ判定
        current_type = instance['InstanceType']
        
        # より大きなインスタンスタイプにアップグレード
        upgrade_map = {
            't3.micro': 't3.small',
            't3.small': 't3.medium',
            't3.medium': 't3.large'
        }
        
        if current_type in upgrade_map:
            new_type = upgrade_map[current_type]
            
            # インスタンス停止→タイプ変更→起動
            ec2.stop_instances(InstanceIds=[instance_id])
            
            waiter = ec2.get_waiter('instance_stopped')
            waiter.wait(InstanceIds=[instance_id])
            
            ec2.modify_instance_attribute(
                InstanceId=instance_id,
                InstanceType={'Value': new_type}
            )
            
            ec2.start_instances(InstanceIds=[instance_id])
            
            return f"Upgraded {instance_id} from {current_type} to {new_type}"
        
    return "No action taken"

実践チェックリスト

クラウド基本診断チェック

  • 共有責任モデルに基づいて責任範囲を明確化した
  • リージョン・AZ レベルでの障害影響を評価した
  • プロバイダーのService Health Dashboardを確認した
  • API制限と課金状況を監視している

プロバイダー別診断チェック

  • AWS: CloudWatch、X-Ray、VPC Flow Logsを活用した
  • Azure: Azure Monitor、Application Insightsを活用した
  • GCP: Cloud Monitoring、Cloud Loggingを活用した
  • 複数プロバイダー環境での統合監視を実装した

サーバーレス・コンテナ診断チェック

  • Lambda/Function のコールドスタート問題を分析した
  • コンテナのライフサイクルと性能を監視した
  • Kubernetesクラスタの健全性を確認した
  • コンテナセキュリティ設定を検証した

コスト最適化チェック

  • 未使用リソースを定期的に検出・削除している
  • リソースサイジングを継続的に最適化している
  • Reserved Instance/Savings Plansを効果的に活用している
  • 自動化によるコスト制御を実装している

クラウド診断フローチャート

クラウド問題発生
    ↓
責任範囲確認(共有責任モデル)
    ↓
プロバイダー側 ← → 利用者側
    ↓              ↓
Service Health    [環境別診断]
Dashboard確認     ├─IaaS: OS・アプリ
    ↓             ├─PaaS: アプリ・データ  
API/課金状況確認   └─SaaS: 設定・使用方法
    ↓
[アーキテクチャ別診断]
├─従来型: VM・ネットワーク
├─サーバーレス: Function・イベント
└─コンテナ: Pod・クラスタ
    ↓
統合監視ツール活用
├─AWS: CloudWatch・X-Ray
├─Azure: Monitor・App Insights  
└─GCP: Monitoring・Logging
    ↓
根本原因特定・対策実施

重要コマンドリファレンス

AWS診断

# EC2インスタンス状態
aws ec2 describe-instances
# CloudWatchメトリクス
aws cloudwatch get-metric-statistics
# VPC情報
aws ec2 describe-vpcs
# コスト情報
aws ce get-cost-and-usage

Azure診断

# VM状態確認
az vm list --output table
# メトリクス確認
az monitor metrics list
# ログ確認
az monitor log-analytics query

GCP診断

# インスタンス確認
gcloud compute instances list
# ログ確認
gcloud logging read
# モニタリング
gcloud monitoring metrics list

Kubernetes診断

# クラスタ状態
kubectl cluster-info
# ポッド状態
kubectl get pods --all-namespaces
# ログ確認
kubectl logs pod-name
# リソース使用量
kubectl top nodes

重要用語集

共有責任モデル: クラウドプロバイダーと利用者間での運用責任分担の概念

リージョン/AZ: クラウドサービスの地理的・物理的な配置単位

サーバーレス: サーバー管理が不要なコンピューティングモデル

コンテナオーケストレーション: コンテナの配置・管理・スケーリングの自動化

Infrastructure as Code: インフラ構成をコードとして管理する手法

API レート制限: API呼び出し頻度の制限機能

コールドスタート: サーバーレス関数の初回実行時の初期化遅延


次章への接続

第5章で習得したクラウド環境での診断技術を基に、第6章では継続的な学習と改善のプロセスを学びます。インシデントから得られた知見を組織的な資産として蓄積し、将来の問題を予防する仕組みの構築方法を習得します。