はじめに
エンタープライズクラウド部 工藤です。
2025年11月18日、AWS CloudFormation に新機能「ドリフト認識変更セット(Drift-aware Change Sets)」がサポートされました。 早速この機能を検証環境で試していたところ、特定の条件下でスタックの更新が失敗し、さらにロールバックも失敗してスタックが停止するという事象に遭遇しました。(UPDATE_ROLLBACK_FAILED)
今回は、この事象の概要と、スタックが停止してしまった場合の復旧手順について共有します。
11/26追記:26日現在、この事象は再現しません。おそらくAWSによって修正されたようです。
新機能「ドリフト認識変更セット」の概要
まず、今回利用した機能について簡単に触れます。
従来、CloudFormation外で行われたリソースの変更(ドリフト)がある状態で変更セットでスタックを更新しようとしても、ドリフトは検出されずにそのまま新しいテンプレートでリソースが上書きされます。 今回リリースされた「ドリフト認識変更セット(Drift-aware Change Sets)」は、作成時にドリフトを検出し、ドリフトしてることをコンソール上で確認しながら変更セットを作成できる機能です。

どんなエラーが出たか
この新機能を利用してスタック更新を行った際、テンプレートを更新していないリソース でエラーが発生し、更新自体が失敗してロールバックが始まりました。
そのロールバック処理中に以下のエラーが発生し、スタックが UPDATE_ROLLBACK_FAILED 状態で停止しました。
私のケースでは、更新後のテンプレートにおいてサブネットのルート部分しか変更していないにもかかわらず、まったく手を入れていないElastic IP アドレスでエラーが発生しています。

- エラーが発生したリソース: Elastic IP アドレス
- エラーが発生したリソースのステータス: UPDATE_FAILED
発生したエラーメッセージ:
Invalid request provided: aws: prefixed tag key names are not allowed for external use
状況:
テンプレート上では既存の状態から変更を加えていないはずのリソースに対して上記のエラーが発生しました。
エラー内容を見ると、「aws: というプレフィックスが付いたタグは外部利用(ユーザーによる操作)が許可されていない」という旨のメッセージです。これは AWS が内部管理用に付与するタグであり、通常ユーザーが操作するものではありません。
復旧手順
もし同様の状態(UPDATE_ROLLBACK_FAILED)に陥った場合、以下の手順で復旧が可能です。
CloudFormation が正常にロールバックできないリソース(今回の場合は Elastic IP アドレス)をスキップすることで、スタックを正常な状態に戻します。
- AWS マネジメントコンソールの CloudFormation 画面を開く
- 対象のスタックを選択し、スタックアクションから 「更新ロールバックを続ける (Continue update rollback)」 を選択

- 「高度なトラブルシューティング」 を開く
- 「スキップするリソース」 の項目で、エラーが発生しているリソースにチェックを入れる
- ロールバックを実行する
- この操作を行っても、今回予期せないエラーが発生したElastic IP アドレスには変更は加えられませんでした。

- この操作を行っても、今回予期せないエラーが発生したElastic IP アドレスには変更は加えられませんでした。
これでスタックのステータスが UPDATE_ROLLBACK_COMPLETE に戻ります。

新機能「ドリフト認識変更セット(Drift-aware Change Sets)」を利用して発生したUPDATE_ROLLBACK_FAILEDエラーに限らず、他のことが起因で発生したUPDATE_ROLLBACK_FAILEDエラーも同じ手順で復旧が可能です。
事象の再現手順
このエラーの詳細な発生条件は今のところ不明ですが、私のケースでは以下の手順で発生しました。
- 既存のテンプレートに含まれないリソースをマネジメントコンソールから手動で追加している
- このとき追加したのは、予期しないエラーが発生したElastic IP アドレスとは関係のないリソースです
- ケース例:緊急対応などでルートテーブルにマネジメントコンソールから手動でルートを追加した。
- 1.で追加したリソースの定義を含むテンプレートを利用している
- ケース例:手動で追加したリソースの削除をし忘れて同じリソースをテンプレートで流そうとしている。つまり、
AlreadyExistsエラーの発生が見込まれる状況である。※1
- ケース例:手動で追加したリソースの削除をし忘れて同じリソースをテンプレートで流そうとしている。つまり、
- 「Drift-aware Change Sets」を使用して更新を実行する
- 更新処理の一部が失敗し、ロールバックが発生する
- 今回のケースでは、ルート追加のリソース(AWS::EC2::Route)が
AlreadyExistsエラーとなり失敗します(AlreadyExistsエラー自体は期待通りの動作)。
- 今回のケースでは、ルート追加のリソース(AWS::EC2::Route)が
- スタック内の変更を加えていないElastic IP アドレスでエラーが発生
なお、標準の変更セットを使用した場合は、同じテンプレート・同じ状況でもこのエラーは発生せず、AlreadyExists だけが発生し正常にロールバックが完了します。
※1 テンプレート外のリソースをテンプレートに取り込みたいときはリソースのインポート機能を使いましょう
まとめ
もし「Drift-aware Change Sets」を利用して aws: prefixed tag... のエラーでスタックが停止してしまった場合は、慌てずに「リソースのスキップ」機能を使用してロールバックを完了させてください。
同じ事象で困っている方の参考になれば幸いです。