AWS CloudFormation の「内部エラー」のエラーを解決したいと考えています。
簡単な説明
CloudFormation スタックを作成または更新する場合、リソースに対するオペレーションが失敗すると、「内部エラー」のエラーが発生することがあります。このエラーは、スタックのデプロイに失敗した場合にも表示されます。
リソースに対するオペレーションは、以下のシナリオで失敗することがあります。
- リソースまたはプロパティに設定された値が正しくない。この問題を解決するには、「テストスタックをデプロイして、リソースまたはプロパティの正しくない値を確認する」のセクションの手順を実行します。
- 内部ワークフローが失敗した。AWS CloudTrail を使用してこの問題を解決するには、CloudTrail イベントログで失敗した API オペレーションを確認するのセクションの手順を実行します。
最後に、CloudFormation テンプレートの [Outputs] (出力) セクションに正しくない値を渡すと、スタックのデプロイに失敗することがあります。このエラーを解決するには、CloudFormation テンプレートの [Outputs] (出力) セクションを確認するのセクションの手順を実行します。
注: 次の手順は、CloudFormation でスタックを作成または更新しようとしたときに発生する「内部エラー」のエラーにのみ適用されます。
解決方法
テストスタックをデプロイして、リソースまたはプロパティの正しくない値を確認する
リソースのプロパティまたは属性の正しくない値を確認するには、失敗したリソースのみを含む CloudFormation テンプレートを使用してテストスタックをデプロイします。
テストスタックが正常にデプロイされたら、CloudTrail イベントログで失敗した API オペレーションを確認するのセクションの手順に従います。
テストスタックのデプロイが失敗した場合は、正しくない値が見つかるまで、テストスタックから不要なプロパティと属性を削除し続けます。
次のサンプルシナリオでは、CloudFormation が AWS Config で AWS::Config::ConformancePack リソースを作成しようとすると、「内部エラー」のエラーが表示されます。DeliveryS3Bucket プロパティの構文が正しくないため、エラーが表示されます。DeliveryS3Bucket プロパティは、バケット名を値としてのみ受け取ります (例: bucketname)。バケット名を含むファイルパスは、許容される値ではありません (例: s3://bucketname)。
AWSTemplateFormatVersion: 2010-09-09
Resources:
CloudFormationCanaryPack:
Type: AWS::Config::ConformancePack
Properties:
ConformancePackName: ConformancePackName
DeliveryS3Bucket: s3://bucketname # Incorrect value for DeliveryS3Bucket
TemplateS3Uri: s3://bucketname/prefix
CloudTrail イベントログで失敗した API オペレーションを確認する
1. CloudTrail コンソールを開きます。
2. ナビゲーションペインで [イベント履歴] をクリックします。
3. [Time range] (時間範囲) で、失敗した API 呼び出しを分離する時間範囲を入力し、[Apply] (適用) を選択します。
ヒント: [From] (開始) の時間には、CloudFormation スタックでリソースが CREATE_IN_PROGRESS または UPDATE_IN_PROGRESS ステータスになった時刻を入力します。[To] (終了) の時間には、API 呼び出しが失敗した時刻を入力します。
4. [Event history] (イベント履歴) のデフォルトのイベント表示を超えて検索するには、属性の [filters] (フィルター) を使用します。
注: デフォルトでは、[Event history] (イベント履歴) は false に設定されている [Read-only] (読み取り専用) フィルターを使用します。[Read-only] (読み取り専用) フィルターの結果は、API アクティビティの書き込みイベントのみを表示し、表示されるイベントのリストから読み取り専用イベントを除外します。
EventName を使用すると、返されるイベントの名前でフィルタリングできます。リソースの作成または更新に使用される API アクションがわかっている場合は、特定の API 呼び出しに対して EventName フィルターを使用できます。例えば、CloudFormation スタックは、AWS::Config::ConformancePack リソースを作成するときに、AWS Config API アクション PutConformancePack を使用します。つまり、PutConformancePack API についてのみフィルタリングできます。EventSource を使用して、API リクエストを実行した AWS のサービスでフィルタリングできます。つまり、イベントソースのリストをスクロールして、CloudFormation テンプレートで使用する適切なリソースを選択できます。
5. 失敗の根本原因を特定するには、返されたイベントのエラーメッセージを確認します。
注: 一部の API オペレーションの失敗では、元の CloudFormation テンプレートを更新してから、テストデプロイを実行してエラーが解決されたことを確認する必要があります。
CloudFormation テンプレートの [Outputs] (出力) セクションを確認する
CloudFormation テンプレートで、[Outputs] (出力) セクションの値に構文エラーが含まれていないことを確認します。例えば、末尾のスペースを削除します。
動的参照を使用してリソース属性を取得する場合は、スタックのデプロイ中に属性が使用可能であることを確認する必要があります。これを CloudFormation の外部でシミュレートするには、以下を実行します。
1. 失敗した属性のリソースタイプに対して Create* または Update* API 呼び出しを実行します (作成または変更するため)。
2. Describe* API 呼び出しを実行して、スタックの作成または更新のプロセス中にリソースの現在の属性を取得します。
次のサンプルシナリオは、AWS::DMS::ReplicationInstance リソースの ReplicationInstancePrivateIpAddresses 属性が [出力] に渡されたときにスタックによって返される内部エラーを示しています。
次のサンプルでは、インスタンスのプライベート IP 属性は、 ReplicationInstance リソースのステータスが available に切り替えられた後でのみ使用できます。スタックが [Outputs] (出力) を処理するまでに ReplicationInstance リソースが available ステータスになっていない場合、AWS CloudFormation はプライベート IP 属性を取得できません。その後、デプロイは失敗します。
AWSTemplateFormatVersion: 2010-09-09
Resources:
BasicReplicationInstance:
Type: AWS::DMS::ReplicationInstance
Properties:
ReplicationInstanceClass: dms.t2.small
Outputs:
DmsInstanceIP:
Value: !GetAtt BasicReplicationInstance.ReplicationInstancePrivateIpAddresses
関連情報
AWS CloudFormation のトラブルシューティング
CloudTrail イベント履歴でのイベントの表示