AWSトラブルシューティングワークフローを習得するためのエキスパートガイド
CloudWatch、CloudTrail、VPCフローログ、AWS Config、Systems Managerを使用した反復可能なAWSトラブルシューティングワークフローを活用します。
AWSトラブルシューティングワークフローを習得するためのエキスパートガイド
AWSのトラブルシューティングは、毎回同じワークフロー(症状の定義、範囲の絞り込み、最近の変更の確認、ログとメトリクスの調査、一度に一つの原因をテスト)に従うことで容易になります。その構造がなければ、CloudWatch、IAM、VPC設定、アプリケーションログを行き来しても何も証明できずに終わりがちです。
このガイドでは、実践的なAWSトラブルシューティングワークフローを提供し、CloudWatch、CloudTrail、AWS Config、VPCフローログ、Systems Managerがどこに適合するかを示します。
コアとなるAWSトラブルシューティングワークフロー
効果的なトラブルシューティングワークフローは、ランダムな一連のアクションではなく、問題の発見から解決、予防へと導く構造化された方法論です。反復可能なプロセスを採用することで、一貫性が確保され、ストレスが軽減され、インシデント解決が加速されます。
1. 問題の定義:初期情報の収集
最初のステップは、何が起こっているかを明確に理解することです。仮定を立てるのは避けてください。可能な限り多くの客観的な情報を収集します。
- 症状:何が正確に失敗しているか、または予期しない動作をしているか?(例:「APIコールがタイムアウトしている」「ウェブサイトが5xxエラーを返している」「EC2インスタンスに到達できない」)
- 範囲:問題はどの程度広範囲に及んでいるか?(例:単一インスタンス、特定のアプリケーション、リージョン全体、特定のユーザー)。本番環境、ステージング環境、開発環境のいずれに影響しているか?
- 影響:ビジネスへの影響は何か?(例:収益の損失、顧客の不満、セキュリティリスク)
- 最後に正常だった状態:最後に正常に動作していたのはいつか?
- エラーメッセージ:アプリケーション、ブラウザコンソール、またはAWSサービスからの直接の応答から、エラーメッセージを収集します。
ヒント:ユーザーやシステムに、具体的なエラーメッセージとタイムスタンプを提供するよう促します。このデータは非常に貴重です。
2. 範囲の確認:影響を受けるコンポーネントの特定
問題が定義されたら、潜在的な影響範囲を絞り込みます。これにより、調査の取り組みに集中できます。
- AWS Health:アカウントのAWS Healthと公開AWSステータスページで、進行中のリージョン問題を確認します。広範囲にわたるサービスイベントは、多くの症状を説明できることがよくあります。
- リソースの分離:Webサーバーがダウンしている場合、それは1つのEC2インスタンスだけですか、それともすべてですか?データベースは他のインスタンスから到達可能ですか?
- 再現性:問題は一貫して再現できますか?可能な場合、どのような条件下で?
3. 最近の変更の確認:潜在的なトリガーの特定
ほとんどの問題は変更によって引き起こされます。これは多くの場合、解決への最も迅速な道筋です。
- デプロイメントの変更:新しいコードデプロイ、Infrastructure as Code(IaC)の更新。
- 設定の変更:セキュリティグループの変更、IAMポリシーの更新、ロードバランサーの設定、データベースパラメータグループ。
- スケーリングイベント:Auto Scalingアクティビティ、サービスの手動スケーリング。
- AWS CloudFormation / Terraform:最近のスタック更新やリソース変更を確認します。
ツールのハイライト:AWS CloudTrailはここでの主要なツールであり、誰が、何を、いつ、どこから行ったかを示します。
4. AWS監視ツールの活用:データへの深掘り
ここでは、AWSのネイティブな可観測性ツールを活用して、経験的証拠を収集します。
- Amazon CloudWatch:メトリクス、ログ、アラーム用。
- AWS CloudTrail:APIアクティビティと変更履歴用。
- VPCフローログ:ネットワークトラフィック分析用。
- AWS Config:設定履歴とコンプライアンス用。
- アプリケーションログ:EC2、ECS、Lambdaなどで実行されているアプリケーションからのログ。
5. 仮説の立案とテスト:理論の開発と検証
収集したデータに基づいて、根本原因に関する1つ以上の仮説を立てます。次に、それぞれを体系的にテストします。
- 仮説の例:「EC2インスタンスに到達できないのは、セキュリティグループがインバウンドSSHトラフィックを許可していないためです。」
- テスト:セキュリティグループのルールを確認します。必要に応じて、注意して(ロールバック計画を立てて)一時的に変更し、接続が復元されるかどうかを確認します。
6. 解決策の実装と検証:修正の適用と解決の確認
仮説が確認されたら、修正を適用します。慎重に行い、可能であれば最初に管理された環境で行います。
- 修正:IAMポリシーの更新、セキュリティグループの再設定、コードデプロイのロールバック、サービスのスケールアップ。
- 検証:元の症状がなくなり、新しい問題が発生していないことを確認します。修正後に関連するメトリクスとログを監視します。
7. 文書化と学習:将来のトラブルシューティングの改善
すべてのインシデントは学習の機会です。問題、調査手順、解決策、予防策を文書化することが重要です。
- インシデントレポート:タイムライン、症状、根本原因、解決策、学んだ教訓を詳細に記した簡単なレポートを作成します。
- ナレッジベース:将来の参照のためにチームのナレッジベースに追加します。
- 予防策:再発を防ぐための監視、アラーム、またはアーキテクチャの変更を実装します。
- ポストモーテム:非難のないポストモーテムを実施して、システムの弱点を特定します。
主要なAWSトラブルシューティングツールの詳細
AWSは、トラブルシューティングを支援する強力なツールスイートを提供しています。それぞれの強みを理解することが重要です。
Amazon CloudWatch
CloudWatchは、ログ、メトリクス、イベントの形式で監視および運用データを収集します。AWSリソースとアプリケーションの健全性とパフォーマンスを理解するために不可欠です。
- メトリクス:パフォーマンスデータ(CPU使用率、ネットワークI/O、ディスク操作、データベース接続、Lambda呼び出し/エラー)を可視化します。アプリケーション用のカスタムメトリクスを作成します。
- ログ:EC2インスタンス(CloudWatchエージェント)、Lambda関数、VPCフローログ、CloudTrailログなどからのログを一元化します。CloudWatch Logs Insightsを使用して強力なクエリを実行します。
- アラーム:メトリクスにしきい値を設定して、問題発生時に通知(SNS、Lambda)をトリガーします。
実践例:応答しないEC2インスタンスの調査
- EC2インスタンスのステータスチェックを確認:EC2コンソールで、インスタンスのステータスチェック(システムステータスとインスタンスステータス)を確認します。いずれかが失敗した場合、それは強力な指標です。
- CloudWatchメトリクス:インスタンスのCloudWatchメトリクスに移動します。
CPUUtilization:CPUが常に100%ですか?NetworkIn/NetworkOut:予期しないトラフィックや突然の低下がありますか?DiskReadOps/DiskWriteOps:ディスクI/Oが飽和していますか?StatusCheckFailed_Instance/StatusCheckFailed_System:チェックが失敗した場合、これらのメトリクスは1になります。
- CloudWatchログ:CloudWatchエージェントが設定されている場合、
/aws/ec2/instance_id/でアプリケーションまたはシステムログ(例:syslog、nginx_access_log)を確認します。CloudWatch Logs Insightsを使用して、エラーや特定のイベントをクエリします。
# EC2インスタンスのログでエラーを検索するCloudWatch Logs Insightsクエリの例
fields @timestamp, @message
| sort @timestamp desc
| filter @message like /ERROR|FAIL|EXCEPTION/ and @logStream = 'i-0abcdef1234567890'
| limit 50
AWS CloudTrail
CloudTrailは、AWSアカウント内で行われたAPI呼び出しを記録し、ユーザー、ロール、またはAWSサービスによって実行されたアクションの履歴を提供します。セキュリティ監査、コンプライアンス、そして最も重要な変更のトラブルシューティングにとって重要です。
- イベント履歴:管理イベント(例:
RunInstances、AuthorizeSecurityGroupIngress、UpdateFunctionConfiguration)の履歴を表示します。 - データイベント:S3オブジェクト、Lambda関数の呼び出しなどのデータプレーン操作をログに記録するように証跡を設定します。
実践例:IAM権限エラー(Access Denied)の診断
アプリケーションまたはユーザーがAWSアクション(例:s3:GetObject)の実行時に「Access Denied」エラーを受け取ります。
- 失敗したアクションを特定:どの特定のAWS API呼び出しが失敗しましたか?
- CloudTrailイベント履歴に移動:イベントを次の条件でフィルタリングします。
- イベント名:正確なAPI呼び出し(例:
GetObject)。 - ユーザー名:呼び出しを行ったIAMユーザーまたはロール。
- イベントソース:関係するAWSサービス(例:
s3.amazonaws.com)。 - 時間範囲:エラーが発生した時間帯。
- イベント名:正確なAPI呼び出し(例:
- イベントの詳細を確認:
errorCode: "AccessDenied"のイベントを探します。errorMessageフィールドは、欠落している特定の権限やリソースポリシー違反に関する手がかりを提供することがよくあります。requestParametersフィールドは、S3バケットやキーなど、渡された引数を示します。userIdentityフィールドは、誰がアクションを試みたかを確認します。
これにより、どのユーザーまたはロールがどのリソースに対してどのアクションを試み、権限のために失敗したかが正確に特定され、関連するIAMポリシーまたはリソースポリシーを変更できるようになります。
AWS Config
AWS Configは、AWSリソース、その設定、および時間の経過に伴う変化の詳細なインベントリを提供します。設定変更を望ましい設定と照らし合わせて評価できます。
- 設定履歴:リソースの設定がどのように変更されたかを確認します(例:セキュリティグループルールが追加または削除されたとき、S3バケットポリシーが変更されたとき)。
- コンプライアンス:リソース設定をベストプラクティスや規制要件と照らし合わせてチェックするルールを定義します。
ユースケース:アプリケーションが突然データベースにアクセスできなくなった場合、AWS Configを使用してデータベースのセキュリティグループが最近変更され、アプリケーションのインスタンスへのアクセスが取り消された可能性があるかどうかを確認できます。
VPCフローログ
VPCフローログは、VPC内のネットワークインターフェイスとの間のIPトラフィックに関する情報をキャプチャします。ネットワーク接続の問題に非常に役立ちます。
- トラフィック分析:ブロックされたトラフィック(REJECTアクション)、予期しない接続、特定のIPとの間の大量のトラフィックを特定します。
- 接続のトラブルシューティング:セキュリティグループ、NACL、またはルートテーブルが正当なトラフィックをブロックしているかどうかを判断します。
ユースケース:EC2インスタンスが外部APIに接続できません。フローログで、インスタンスのENIからAPIのIPアドレスへのREJECTエントリを確認します。これは、制限的なセキュリティグループまたはNACLを示している可能性があります。
AWS Systems Manager
Systems Managerは、複数のAWSサービスからの運用データを表示し、運用タスクを自動化するための統一されたインターフェースを提供します。トラブルシューティングのための主要なコンポーネントは次のとおりです。
- Session Manager:インバウンドポート(SSHポート22など)を開かずにEC2インスタンスに安全にシェルアクセスでき、セキュリティリスクを低減し、アクセスを簡素化します。
- Run Command:EC2インスタンスでリモートでスクリプトやコマンドを実行して、診断データを収集したり、修正を適用したりします(例:サービスの再起動、ログの取得)。
- Automation:一般的なトラブルシューティングと修復手順を自動化するためのランブックを作成します。
一般的なAWSトラブルシューティングシナリオと解決策
接続の問題
接続の問題は頻繁に発生し、さまざまなネットワークコンポーネントに起因する可能性があります。
- セキュリティグループ:EC2インスタンスの仮想ファイアウォールとして機能します。必要なポートとIP範囲のインバウンドおよびアウトバウンドルールを確認します。
- ネットワークアクセスコントロールリスト(NACL):サブネットレベルでのステートレスファイアウォール。インバウンドおよびアウトバウンドルールを確認し、ルールの順序と明示的な
DENYルールに注意します。 - ルートテーブル:トラフィックが宛先に到達するための適切なルートが存在することを確認します(例:パブリックトラフィック用のインターネットゲートウェイ、インターネットにアクセスするプライベートインスタンス用のNATゲートウェイ、VPC間通信用のVPCピアリング)。
- DNS解決:インスタンスがホスト名を解決できることを確認します。VPC DNS設定とカスタムDNSサーバーを確認します。
- サブネットCIDRの重複:VPCピアリングまたはVPNを使用する場合、重複するCIDRブロックがないことを確認します。
権限エラー(Access Denied)
これらのエラーは、IAMプリンシパル(ユーザー、ロール)が必要な権限なしにアクションを試みたときに発生します。
- IAMポリシー:最も一般的な原因。ユーザーまたはロールにアタッチされたIAMポリシーを確認します。IAMポリシーシミュレーターを使用して、特定のアクションとリソースをテストします。
- リソースポリシー:S3、SQS、KMS、ECRなどのサービスの場合、リソースポリシーは誰がリソースにアクセスできるかを定義します。呼び出し元のプリンシパルがここでアクセスを許可されていることを確認します。
- サービスコントロールポリシー(SCP):AWS Organizationsを使用している場合、SCPがアカウントまたはOUレベルでアクションを制限している可能性があります。
- アクセス許可の境界:IAMエンティティが持つことができる最大権限を制限できる高度なIAM機能。
- セッションポリシー:IDの実効権限を上書きまたは制限できる一時的なポリシー。
サービス制限とスロットリング
AWSサービスにはソフトリミットとハードリミットがあります。これらの制限に達すると、サービスの低下や障害が発生する可能性があります。
- 制限の監視:AWS Service Quotasコンソールを使用して、サービス割り当てを定期的に確認します。重要な制限に近づいているメトリクスに対してCloudWatchアラームを作成します。
- 増加のリクエスト:ほとんどのソフトリミットは、AWSにサポートチケットを送信することで増加できます。
- スロットリング:Lambda、DynamoDB、API Gatewayなどのサービスは、コールレートがプロビジョニングされた容量またはバースト制限を超えると、リクエストをスロットルできます。ログで
TooManyRequestsExceptionまたはThrottlingExceptionエラーを探します。 - スケーリング:Auto Scalingグループ、ECSサービス、またはデータベースのリードレプリカが需要に応じて適切にスケーリングするように設定されていることを確認します。
プロアクティブなトラブルシューティングのためのベストプラクティス
予防は常に治療に勝ります。これらのプラクティスを実装して、インシデントを最小限に抑え、解決を迅速化します。
- 堅牢な監視とアラートの実装:重要なメトリクス、システムの健全性、アプリケーションエラーに対してCloudWatchアラームを設定します。通知システム(SNS、Slack、PagerDuty)と統合します。
- 集中ログ管理:すべてのアプリケーションとインフラストラクチャのログをCloudWatch Logsまたは専用のログソリューション(例:EC2/ECS上のELKスタック、Datadog、Splunk)に統合します。
- Infrastructure as Code(IaC):CloudFormation、Terraform、またはCDKを使用してインフラストラクチャを管理します。これにより、バージョン管理が提供され、ロールバックが簡素化されます。
- 最小権限の原則:ユーザーとロールに必要な権限のみを付与します。これにより、潜在的なセキュリティインシデントの影響範囲が減少し、権限のトラブルシューティングが簡素化されます。
- IAMポリシーの定期的なレビュー:過度に寛容なステートメントや未使用の権限がないか、IAMポリシーを定期的に監査します。
- サービス制限の理解:リージョンとアカウントのデフォルトのサービス割り当てを把握します。予想される成長に備えて、プロアクティブに増加をリクエストします。
- 一般的なタスクの自動化:AWS Systems Manager AutomationまたはLambda関数を使用して、繰り返し発生する問題の診断チェックと修復を自動化します。
- タグ付け戦略:すべてのリソースに一貫したタグ付け戦略を実装します。これは、整理、コスト配分、トラブルシューティング中のリソースのフィルタリングに役立ちます。
- インシデント対応の練習:重大なインシデントに対して定期的な訓練を実施します。これにより、チームはプレッシャー下でもワークフローとツールに慣れることができます。
重要なポイント
優れたAWSトラブルシューティングは、規律正しく、慌てふためくものではありません。問題を定義し、範囲と最近の変更を確認し、適切なAWSデータソースを使用し、修正を文書化して、次のインシデントをより迅速に解決できるようにします。