AWS CloudFormation でスタックを作成または更新しようとするときに発生する、「内部エラー」のエラーを解決するにはどうすればよいですか?
最終更新日: 2021 年 2 月 18 日
AWS CloudFormation の「内部エラー」のエラーを解決したいと考えています。
簡単な説明
AWS CloudFormation スタックを作成または更新する場合、リソースに対するオペレーションが失敗すると、「内部エラー」のエラーが発生することがあります。このエラーは、スタックのデプロイに失敗した場合にも表示されます。
リソースに対するオペレーションは、以下のシナリオで失敗することがあります。
- リソースまたはプロパティに設定された値が正しくない。この問題を解決するには、「テストスタックをデプロイして、リソースまたはプロパティの正しくない値を確認する」のセクションの手順を実行します。
- 内部ワークフローが失敗した。AWS CloudTrail を使用してこの問題を解決するには、「CloudTrail イベントログで失敗した API オペレーションを確認する」セクションの手順を実行します。
最後に、AWS CloudFormation テンプレートの [出力] セクションに正しくない値を渡すと、スタックのデプロイに失敗することがあります。このエラーを解決するには、「AWS CloudFormation テンプレートの [出力] セクションを確認する」のセクションの手順を実行します。
注: 次の手順は、AWS CloudFormation でスタックを作成または更新しようとしたときに発生する「内部エラー」のエラーにのみ適用されます。
解決方法
テストスタックをデプロイして、リソースまたはプロパティの正しくない値を確認する
リソースのプロパティまたは属性の正しくない値を確認するには、失敗したリソースのみを含む AWS CloudFormation テンプレートを使用してテストスタックをデプロイします。
テストスタックが正常にデプロイされたら、「CloudTrail イベントログで失敗した API オペレーションを確認する」のセクションの手順に従います。
テストスタックのデプロイが失敗した場合は、正しくない値が見つかるまで、テストスタックから不要なプロパティと属性を除外し続けます。
次のサンプルシナリオでは、AWS 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. [時間範囲] で、失敗した API 呼び出しを分離する時間範囲を入力し、[適用] をクリックします。
ヒント: [開始] の時間には、AWS CloudFormation スタックでリソースが CREATE_IN_PROGRESS または UPDATE_IN_PROGRESS ステータスになった時刻を入力します。[終了] の時間には、API 呼び出しが失敗した時刻を入力します。
4. 失敗の根本原因を特定するには、返されたイベントのエラーメッセージを確認します。
注意: 一部の API オペレーションの失敗では、元の AWS CloudFormation テンプレートを更新してから、テストデプロイを実行してエラーが解決されたことを確認する必要があります。
AWS CloudFormation テンプレートの [出力] セクションを確認する
AWS CloudFormation テンプレートで、[出力] セクションの値に構文エラーが含まれていないことを確認します。例えば、末尾のスペースを削除します。
動的参照を使用してリソース属性を取得する場合は、スタックのデプロイ中に属性が使用可能であることを確認する必要があります。これを AWS CloudFormation の外部でシミュレートするには、以下を実行します。
1. 失敗した属性のリソースタイプに対して Create* または Update* API 呼び出しを実行します (作成または変更するため)。
2. Describe* API 呼び出しを実行して、スタックの作成または更新のプロセス中にリソースの現在の属性を取得します。
次のサンプルシナリオは、AWS::DMS::ReplicationInstance リソースの ReplicationInstancePrivateIpAddresses 属性が [出力] に渡されたときにスタックによって返される内部エラーを示しています。
次のサンプルでは、インスタンスのプライベート IP 属性は、 ReplicationInstance リソースのステータスが available に切り替えられた後でのみ使用できます。スタックが [出力] を実行するまでに 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