1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWSで始める30日間CI/CDマスタープログラム - 25日目: パイプラインの障害対応とトラブルシューティング

Posted at

25日目: パイプラインの障害対応とトラブルシューティング

はじめに:問題は必ず起こる。いかに迅速に対処するか

皆さん、こんにちは!👋 これまで、私たちはCI/CDパイプラインを構築し、それを堅牢にするための様々なテクニックを学んできました。しかし、どんなに完璧に設計されたパイプラインでも、障害や予期せぬ問題は必ず発生します。ソースコードのバグ、環境設定の不一致、依存ライブラリの脆弱性、そしてAWSサービスの障害など、その原因は多岐にわたります。

重要なのは、問題が起こらないようにすることではなく、「問題が起こったときに、いかに迅速に原因を特定し、対処できるか」です。本記事では、CI/CDパイプラインの運用中に発生しうる障害とその対応方法、そしてAWS CodeFamilyのツールを使った効果的なトラブルシューティングの手法について解説します。


1. 障害発生時の基本的なアプローチ

パイプラインが失敗した場合、以下の手順で原因を特定していくのが一般的です。

  1. CodePipelineコンソールで全体像を把握する:
    まず、CodePipelineのコンソールで、どのステージ(例: SourceBuildDeploy)の、どのアクションが失敗したかを確認します。失敗したアクションは赤く表示されるため、一目でわかります。

  2. 失敗したアクションの詳細を確認する:
    失敗したアクションをクリックし、詳細画面に移動します。ここでは、CodeBuildやCodeDeployといった実行されたサービスのログへのリンクが表示されます。

  3. ログを深く掘り下げる:
    ログはトラブルシューティングの鍵です。CodeBuildやCodeDeployのログには、buildspec.ymlappspec.ymlのどのコマンドでエラーが発生したか、どのようなエラーメッセージが出力されたかが記録されています。これを手掛かりに、問題の原因を特定します。

このアプローチはシンプルですが、CI/CDのトラブルシューティングにおいて最も重要なステップです。


2. AWS CodeFamilyツールを使ったトラブルシューティング

CodeBuildのトラブルシューティング

CodeBuildでビルドが失敗する場合、主な原因は以下のいずれかです。

  • ビルド環境の問題:

    • 依存関係の不足: buildspec.ymlで指定したpip installコマンドが失敗している場合。ビルドログでインストール失敗のエラーメッセージを確認します。
    • Dockerのビルド失敗: Dockerfileの記述ミスや、ベースイメージの問題など。
  • buildspec.ymlの記述ミス:

    • コマンドのタイポ: 存在しないコマンドを実行しようとしている。
    • パスの不一致: ビルド成果物のパス(artifacts)が、実際にファイルが生成されたパスと異なっている。
    • フェーズの誤り: 実行すべきコマンドが間違ったフェーズ(例: installフェーズでテストを実行)に記述されている。

ログの活用:
CodeBuildのビルドログは、コンソールの「ビルドログ」タブで確認できます。このログは、installpre_buildbuildpost_buildといったフェーズごとに整理されているため、問題が発生したフェーズに絞って調査ができます。

CodeDeployのトラブルシューティング

CodeDeployでデプロイが失敗する場合、主な原因は以下のいずれかです。

  • appspec.ymlの記述ミス:

    • ファイルのパス: filesセクションで指定したファイルパスが正しくない。
    • フックのスクリプト: hooksセクションで指定したスクリプト(例: BeforeInstall.sh)が存在しないか、実行権限がない。
    • タイポ: ディレクティブ(fileshooks)のタイポ。
  • IAM権限の問題:

    • EC2インスタンスのIAMロール: CodeDeployエージェントが、S3バケットからデプロイバンドルを取得したり、他のAWSサービスにアクセスしたりするためのIAM権限がない。
    • CodeDeployサービスロール: CodeDeployがEC2インスタンスを管理したり、ロールバックを実行したりするための権限がない。

ログの活用:
CodeDeployのデプロイログは、EC2インスタンス上の特定のパスに保存されています。SSHでインスタンスに接続し、以下のログファイルを確認します。

  • /opt/codedeploy-agent/deployment-root/.../logs/scripts.log
  • /var/log/aws/codedeploy-agent/codedeploy-agent.log

共通のトラブルシューティング

  • IAMロール: 複数のAWSサービスが連携するCI/CDパイプラインでは、IAM権限が不適切に設定されていることが、最も一般的な失敗原因の一つです。
  • 環境変数の不一致: CodeBuildとCodeDeployで、同じ環境変数を使っているのに値が異なっている場合。
  • タイムアウト: 各アクションにはタイムアウト時間が設定されています。ビルドやデプロイに時間がかかりすぎる場合、タイムアウトによって強制的に失敗することがあります。

3. ロールバック:問題解決までの緊急避難

トラブルシューティングに時間がかかりそうな場合、問題のあるバージョンを放置することはできません。20日目で学んだロールバックを実行し、迅速に安定したバージョンに戻すことが最優先です。

  • CodeDeployコンソール: CodeDeployのデプロイメント履歴から、以前の成功したデプロイメントを選択し、「再デプロイ」を実行することで、簡単にロールバックできます。
  • ブルー/グリーンデプロイ: ブルー/グリーンデプロイ戦略を使っている場合、トラフィックを以前の安定した環境(ブルー)に戻すだけで、瞬時にロールバックできます。

ポイント:
ロールバックは、あくまで一時的な緊急避難です。根本的な原因を特定し、修正した上で、再度パイプラインを実行してデプロイすることが重要です。


まとめ:ログを読み解く力こそが鍵

本日は、CI/CDパイプラインの運用中に発生する障害とその対応方法、そしてAWS CodeFamilyのツールを使ったトラブルシューティングの手法について学びました。

  • 基本的なアプローチ: CodePipelineコンソールで全体像を把握し、CodeBuildやCodeDeployのログを深く掘り下げて原因を特定する流れを理解しました。
  • ログの重要性: ビルドログやデプロイログは、問題解決の最も重要な情報源であることを再確認しました。
  • ロールバック: 問題解決に時間がかかりそうな場合は、迅速にロールバックしてサービスへの影響を最小限に抑えることが最優先であると学びました。

CI/CDパイプラインの運用は、常にログと向き合い、問題を迅速に解決していく力が必要となります。グローバルなAI企業のような、高速で変化し続ける環境では、このトラブルシューティング能力が、システムの安定稼働を支える上で不可欠なスキルとなります。

次回は、CI/CDの新しいトレンドである「GitOps」について解説します。お楽しみに!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?