CloudFormation のトラブルシューティング - AWS CloudFormation

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

AWS CloudFormation を使用すると、CloudFormation スタックを作成、更新、または削除する際に問題が発生する場合があります。以降のセクションは、発生する可能性のある一般的な問題のトラブルシューティングに役立ちます。

CloudFormation に関する一般的な質問については、「AWS CloudFormation のよくある質問」を参照してください。また、AWS CloudFormation フォーラムで回答を検索したり、質問を投稿したりすることもできます。

トラブルシューティングガイド

AWS CloudFormation でのスタックの作成、更新、または削除に失敗した場合、問題に関する詳細情報の入手に役立つエラーメッセージやログを確認できます。ここでは、CloudFormation の問題をトラブルシューティングするための一般的な方法について説明します。特定のエラーと解決方法については、「 に関連するエラーのトラブルシューティング」セクションを参照してください。

  • CloudFormation コンソールを使用して、スタックのステータスを表示します。コンソールには、スタックを作成、更新、または削除する際のスタックイベントのリストを表示できます。このリストから失敗イベントを探して、そのイベントのステータスの理由を確認します。ステータスの理由には、AWS CloudFormation または問題のトラブルシューティングに役立つ特定のサービスからのエラーメッセージが含まれている可能性があります。スタックイベントの表示の詳細については、「AWS Management Console での AWS CloudFormation スタックデータとリソースの表示」を参照してください。

  • Amazon EC2 の問題については、cloud-init および cfn のログを参照してください。これらのログは、/var/log/ ディレクトリの Amazon EC2 インスタンスに発行されます。ログには、AWS CloudFormation がインスタンスをセットアップする際のプロセスとコマンドの出力がキャプチャされます。Windows の場合、%ProgramFiles%\Amazon\EC2ConfigService で EC2Configure サービス、%ProgramData%\Amazon\EC2-Windows\Launch\Logs で EC2 Launch、%ProgramData%\Amazon\EC2Launch\log で EC2 Launch v2、C:\cfn\log で cfn ログを表示します。

    また、AWS CloudFormation テンプレートの設定により、ログを Amazon CloudWatch に発行させることも可能です。この場合、ログは AWS Management Console に表示されるため、Amazon EC2 インスタンスに接続する必要がありません。詳細については、アプリケーション管理ブログの View CloudFormation logs in the console を参照してください。

に関連するエラーのトラブルシューティング

以下に挙げる AWS CloudFormation スタックに関するエラーが発生した場合に、問題の原因を特定して解決するのに役立つ解決方法を紹介します。

スタックの削除の失敗

この状況を解決するには、以下の手順を実行します。

  • 一部のリソースは、削除する前に空にしなければなりません。たとえば、バケットまたはセキュリティグループを削除するには、Amazon S3 バケットのすべてのオブジェクト、または Amazon EC2 セキュリティグループのすべてのインスタンスを削除する必要があります。

  • スタックのリソースを削除するのに必要な IAM アクセス権限があることを確認します。AWS CloudFormation のアクセス許可に加えて、Amazon S3 や Amazon EC2 などの基盤となるサービスを使用する権限を持っている必要があります。

  • AWS CloudFormation で削除できなかったリソースがあったためにスタックが DELETE_FAILED 状態である場合は、RetainResources パラメータを使用して AWS CloudFormation が削除できない当該リソースを指定し、削除を再実行します。AWS CloudFormation は、保持されたリソースを残してスタックを削除します。残したいオブジェクトを含む S3 バケットなど、リソースは削除できないが、スタックは削除したい場合に便利です。

    スタックを削除した後で、リソースに関連した AWS サービスを使用して、残したリソースを手動で削除できます。

  • 削除保護を有効にしているスタックを削除することはできません。削除保護を有効にした状態でスタックを削除しようとすると、削除は失敗し、ステータスを含め、スタックが変更されることはありません。スタックの削除保護を無効にし、削除オペレーションを再度行います。

    これには、ルートスタックの削除保護が有効になっている「ネストされたスタック」が含まれます。ルートスタックの削除保護を無効にし、削除オペレーションを再度行います。ネストされたスタックは直接削除しないことが推奨されていますが、ルートスタックとそのリソースを削除する場合のみ削除します。

    詳細については、「スタックの削除保護」を参照してください。

  • AWS Support がある場合は、その他すべての問題について、AWS Support ケースを作成できます。「 Support へのお問い合わせ」を参照してください。

依存関係のエラー

依存関係のエラーを解決するには、テンプレート内の他のリソースに依存するリソースに DependsOn 属性を追加します。場合によっては、AWS CloudFormation が正しい順序でリソースを作成または削除できるように、依存関係を明示的に宣言する必要があります。たとえば、同じスタック内に Elastic IP およびインターネットゲートウェイを持つ VPC を作成する場合、Elastic IP はインターネットゲートウェイのアタッチメントに依存させる必要があります。詳細については、「DependsOn 属性」を参照してください。

リストを渡す際のパラメーター解析エラー

AWS Command Line Interface または AWS CloudFormation を使用してリストを渡す場合、各カンマの前にエスケープ文字 (\) を追加します。次の例は、AWS CLI を使用する場合に入力パラメータを指定する方法を示しています。

ParameterKey=CIDR,ParameterValue='10.10.0.0/16\,10.10.0.0/24\,10.10.1.0/24'

IAM アクセス権限の不足

AWS CloudFormation スタックを使用して作業する場合、AWS CloudFormation を使用するアクセス権限に加えて、テンプレートに記述されている基盤となるサービスを使用する権限を持っている必要があります。たとえば、Amazon S3 バケットを作成する場合や、Amazon EC2 インスタンスを開始する場合には、Amazon S3 または Amazon EC2 に対するアクセス権限が必要となります。AWS CloudFormation スタックの作業を行う前には IAM ポリシーを見直して、必要なアクセス権限があることを確認します。詳細については、「AWS Identity and Access Management によるアクセスの制御」を参照してください。

値が無効またはリソースのプロパティがサポートされていない

AWS CloudFormation スタックを作成または更新しようとすると、入力パラメーターが無効であるか、リソースのプロパティ名がサポートされていないか、リソースのプロパティ値がサポートされていないために、その作業が失敗する場合があります。入力パラメーターについては、そのリソースが存在することを確認します。たとえば、Amazon EC2 キーペアまたは VPC ID を指定する場合、リソースはアカウント内およびスタックを作成/更新しているリージョンに存在している必要があります。確実に有効な値を使用するには、AWS 固有のパラメータ型を使用できます。

リソースのプロパティ名と値については、テンプレートを更新して有効な名前と値を使用するようにしてください。すべてのリソースとそのプロパティ名のリストについては、「AWS リソースおよびプロパティタイプのリファレンス」を参照してください。

リソースクォータ

リソースクォータに達していないことを確認します。例えば、起動できる Amazon EC2 オンデマンドインスタンスのデフォルトの最大数は 5 です。アカウントクォータよりも多くの Amazon EC2 オンデマンドインスタンスを作成しようとすると、インスタンスの作成が失敗し、エラー Status=start_failed が返されます。サービスごとのデフォルト AWS クォータを表示するには、「AWS 全般のリファレンス」の「AWS サービスクォータ」を参照してください。

AWS CloudFormation クォータと調整戦略については、「AWS CloudFormation のクォータ」を参照してください。

さらに、更新中にリソースが置き換えられた場合、AWS CloudFormation は古いリソースを削除する前に新しいリソースを作成します。このリソースの置換によってリソースクォータに達してしまい、更新が失敗する場合があります。過剰なリソースを削除するか、[quota increase] (クォータの増加) をリクエストすることができます。

ネストされたスタックは UPDATE_COMPLETE_CLEANUP_IN_PROGRESSUPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS または UPDATE_ROLLBACK_IN_PROGRESS 状態にあります。

ネストされたスタックがロールバックに失敗しました。ネストされたスタック間で使用可能なリソースの依存性により、すべてのスタックがアップデートされるかロールバックされるまで、AWS CloudFormation はネストされたスタックのクリーンアップを開始しません。ネストされたスタックがロールバックに失敗した場合、AWS CloudFormation は、その他のスタックの現状態に関係なく、すべてのオペレーションをキャンセルします。その他のネストされたスタックがロールバックに失敗していると、アップデートやロールバックを完了したネストスタックも AWS CloudFormation から信号を受け取らずに、UPDATE_COMPLETE_CLEANUP_IN_PROGRESS または UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS 状態になります。アップデートに失敗してもロールバックを開始する信号が届かないネストスタックは、UPDATE_ROLLBACK_IN_PROGRESS の状態になります。

スタックテンプレートがこのスタックの状態を正確に反映していない場合、AWS CloudFormation の外部における変更により、ネストされたスタックのロールバックが失敗することがあります。また、Auto Scaling グループが作成またはアップデートされた際に、このグループのネストスタックに限定時間内のリソースが不足していると、ネストされたスタックが失敗することもあります。

スタックを修正するには、AWS Support に連絡してください。

実行する更新がない

AWS CloudFormation スタックを更新するには、テンプレートまたはパラメータの値の変更を AWS CloudFormation に送信する必要があります。ただし、削除のポリシー、更新ポリシー、条件の宣言、または出力の宣言に対する変更など、テンプレートに対する変更の一部は、AWS CloudFormation によって更新として認識されません。他の変更を行わずにこのような変更を加える必要がある場合は、リソースの メタデータ属性を追加または変更します。

更新中のテンプレートの変更の詳細については、「スタックテンプレートの変更」を参照してください。

スタックの作成、更新、または削除オペレーションの際、リソースが安定しない

オペレーションが AWS CloudFormation タイムアウト期間を超えたか、AWS のサービスが中断されたため、リソースが応答しませんでした。サービス中断の場合は、関連する AWS サービスが実行中であることを確認し、次にスタックオペレーションを再試行します。

AWS サービスが正常に実行中であれば、スタックに以下のリソースの 1 つが含まれているかどうかを確認してください。

  • AWS::AutoScaling::AutoScalingGroup 作成、更新、削除オペレーション

  • AWS::CertificateManager::Certificate 作成オペレーション

  • AWS::CloudFormation::Stack 作成、更新、削除オペレーション

  • AWS::ElasticSearch::Domain 更新オペレーション

  • AWS::RDS::DBCluster 作成および更新オペレーション

  • AWS::RDS::DBInstance 作成、更新、削除オペレーション

  • AWS::Redshift::Cluster 更新オペレーション

これらのリソースのオペレーションは、デフォルトのタイムアウト期間以上の時間がかかる場合があります。タイムアウト期間は、リソースと使用する認証情報によって異なります。タイムアウト期間を延長するには、スタックオペレーションを実行する際にサービスロールを指定します。すでにサービスロールを使用しているか、またはスタックにリストにないリソースが含まれている場合、AWS Support にお問い合わせください。

スタックが UPDATE_ROLLBACK_FAILED という状態の場合、「更新のロールバックの失敗」を参照してください。

セキュリティグループが VPC 内に存在しない

セキュリティグループが指定した VPC に存在していることを確認します。セキュリティグループが存在する場合、セキュリティグループの名前ではなく、セキュリティグループの ID を指定していることを確認します。たとえば、AWS::EC2::SecurityGroupIngress リソースには、SourceSecurityGroupName プロパティと SourceSecurityGroupId プロパティがあります。VPC セキュリティグループについては、SourceSecurityGroupId を使用し、プロパティとセキュリティグループ ID を指定する必要があります。

更新のロールバックの失敗

ロールバックが失敗するため (UPDATE_ROLLBACK_FAILED 状態)、依存リソースを元の状態に戻すことはできません。例えば、AWS CloudFormation の外部で削除された古いデータベースのインスタンスのロールバックするスタックがある場合などです。AWS CloudFormation にはデータベースが削除されたことがわからないため、データベースインスタンスがまだ存在する前提でそれにロールバックしようとし、更新のロールバックが失敗します。

失敗の原因によっては、エラーを手動で修正してロールバックを続けることができます。ロールバックを続けることで、スタックを動作状態 (UPDATE_ROLLBACK_COMPLETE 状態) に戻し、スタックの更新を再度試みることができます。次のリストでは、更新のロールバック失敗の原因となる一般的なエラーに対する解決策について説明します。

  • 必要なシグナルの数の受け取りに失敗した

    signal-resource コマンドを使用し、必要な数の成功シグナルを待機中のリソースに手動で送信した後、更新のロールバックを続けます。たとえば、更新のロールバック中、Auto Scaling グループ内のインスタンスが指定されたタイムアウト期間内に成功のシグナルの送信に失敗する可能性があります。Auto Scaling グループに成功シグナルを手動で送信します。更新のロールバックを続けると、AWS CloudFormation がシグナルを確認し、ロールバックを続けます。

  • リソースに対する変更が AWS CloudFormation 外で加えられた

    元のスタックテンプレートと一致するようにリソースを手動で同期した後、更新のロールバックを続けます。たとえば、AWS CloudFormation がロールバックしようとしているリソースを手動で削除した場合、元のスタックで使用していたのと同じ名前およびプロパティを使用してそのリソースを手動で作成する必要があります。

  • アクセス権限の不足

    リソースを変更する IAM アクセス権限が十分にあることを確認し、更新のロールバックを続けます。たとえば、IAM ポリシーで S3 バケットの作成が許可されるが、バケットの変更は許可されないことがあります。ポリシーに変更アクションを追加します。

  • 無効なセキュリティトークン

    AWS CloudFormation には、認証情報の新しいセットが必要です。変更は必要ありません。更新のロールバックを続けると、認証情報が更新されます。

  • 制限エラー

    不要なリソースを削除するか、[quota increase] (クォータの増加) をリクエストし、更新のロールバックを続けます。例えば、EC2 オンデマンドインスタンス数のアカウントクォータが 5 で、更新のロールバックがそのクォータを超えた場合、失敗します。

  • リソースが安定しませんでした

    オペレーションが AWS CloudFormation タイムアウト期間を超えたか、AWS のサービスが中断されたため、リソースが応答しませんでした。変更は必要ありません。リソース操作が完了するか、AWS サービスが実行状態に戻ったら、更新のロールバックを続けてください。

更新のロールバックを続けるには、AWS CloudFormation コンソールまたは AWS コマンドラインインターフェース (AWS CLI) を使用します。詳細については、「更新のロールバックを続ける」を参照してください。

これらのソリューションがどれもうまくいかない場合、AWS CloudFormation が正常にロールバックできないリソースはスキップすることができます。詳細については、「AWS CloudFormation API リファレンス」の「ContinueUpdateRollback API 操作用 ResourcesToSkip パラメータ」を参照してください。AWS CloudFormation は指定されたリソースのステータスを UPDATE_COMPLETE に設定し、引き続きスタックをロールバックします。ロールバックが完了したら、スキップされたリソースのステータスはスタックテンプレートのリソースのステータスと一致しません。別のスタックの更新を実行する前に、リソースを変更するか、またはスタックを更新して、整合性を取る必要があります。そうしないと、以降のスタックの更新は失敗し、スタックは回復不可能になる可能性があります。

待機条件が Amazon EC2 インスタンスから所定の数のシグナルを受け取らなかった

この状況を解決するには、以下の手順を実行します。

  • 使用している AMI に AWS CloudFormation ヘルパースクリプトがインストールされていることを確認します。AMI にヘルパースクリプトが含まれていない場合は、インスタンスにダウンロードすることもできます。詳細については、「CloudFormation ヘルパースクリプトリファレンス」を参照してください。

  • インスタンスで cfn-signal コマンドが正常に実行されたことを確認します。/var/log/cloud-init.log/var/log/cfn-init.log などのログを確認して、インスタンスの起動に関するデバッグに役立てることができます。ログはインスタンスへログインすることで取得できますが、障害発生時のロールバックを無効にしておく必要があります。無効にしないと、スタックの作成が失敗した場合に AWS CloudFormation によってそのインスタンスが削除されます。また、Amazon CloudWatch に対してログを発行することもできます。Windows の場合、C:\cfn\log および %ProgramFiles%\Amazon\EC2ConfigService に保存される cfn ログを確認できます。

  • インスタンスがインターネットに接続されていることを確認します。インスタンスが VPC 内に存在しており、プライベートサブネットにある場合は NAT デバイスを介して、パブリックサブネットにある場合はインターネットゲートウェイを介してインターネットに接続されます。インスタンスのインターネット接続をテストするには、http://aws.amazon.com などの公開ウェブページへアクセスしてください。たとえば、インスタンスで次のコマンドを実行すると、HTTP 200 ステータスコードが返されるはずです。

    curl -I https://aws.amazon.com

    NAT デバイスの設定の詳細については、「Amazon VPC ユーザーガイド」の「NAT」を参照してください。

リソースはスタックから削除されましたが、削除されてはいません。

スタックの更新中に、CloudFormation はスタックからリソースを削除しましたが、リソースは削除されませんでした。リソースはまだ存在しますが、CloudFormation からはアクセスできなくなります。これは、スタックの更新中に発生する可能性があります。

  • CloudFormation は既存のリソースを置き換える必要があるため、最初に新しいリソースを作成し、次に古いリソースを削除しようとします。

  • スタックテンプレートからリソースを削除したため、CloudFormation はスタックからリソースを削除しようとします。

ただし、CloudFormation がリソースを削除できない場合があります。例えば、特定のタイプのリソースを削除するためのアクセス権限がユーザーにない場合などです。

CloudFormation は、古いリソースを 3 回削除しようとします。CloudFormation が古いリソースを削除できない場合、古いリソースをスタックから削除し、スタックの更新を続行します。スタックの更新が完了すると、CloudFormation は UPDATE_COMPLETE スタックイベントを発行しますが、1 つ以上のリソースを削除できなかったことを示す StatusReason が含まれます。CloudFormation は、特定のリソースに対して DELETE_FAILED イベントを発行し、対応する StatusReason は CloudFormation がリソースの削除に失敗した理由の詳細を提供します。

この状況を解決するには、基盤となるサービスのコンソールまたは API を使用してリソースを直接削除します。

Support へのお問い合わせ

AWS Support がある場合は、https://console.aws.amazon.com/support/home#/ で技術サポートケースを作成できます。サポートへ連絡する前に、以下の情報を収集します。

  • スタックの ID。スタック ID は、AWS CloudFormation コンソール[Overview] (概要) タブに表示されます。詳細については、「AWS Management Console での AWS CloudFormation スタックデータとリソースの表示」を参照してください。

    重要

    スタックのリソースを AWS CloudFormation 以外の方法で変更しないでください。スタックのリソースを AWS CloudFormation 以外の方法で変更すると、復旧不可能な状態になる場合があります。

  • スタックのエラーメッセージ。スタックのエラーメッセージの表示については、「トラブルシューティングガイド」セクションを参照してください。

  • Amazon EC2 の問題については、cloud-init および cfn のログを収集してください。これらのログは、/var/log/ ディレクトリの Amazon EC2 インスタンスに発行されます。これらのログには、インスタンスのセットアップ中のプロセスおよびコマンドの出力がキャプチャされます。Windows の場合、%ProgramFiles%\Amazon\EC2ConfigService および C:\cfn\log に保存される EC2Configure サービスおよび cfn ログを収集してください。

また、AWS CloudFormation フォーラムで回答を検索したり、質問を投稿したりすることもできます。