AWS CloudFormation スタックにリソースタグを適用するとエラーが発生しますが、AWS Identity and Access Management (IAM) プリンシパルの更新は行っていません。
解決策
新しい AWS アカウントでは、適切なタグ付けアクセス許可を持たずに CloudFormation スタックのリソースタグを作成、更新、または削除すると、スタックの操作が失敗します。
既存のアカウントは、2024 年 2 月 29 日まで新しいスタック操作の動作対象外となります。
サービスの中断を防ぐために、必要なタグ付けアクセス許可を IAM プリンシパルに付与してください。IAM プリンシパルがリソースタグを管理できない場合、CloudFormation がスタック操作を実行しても、リソースタグが変更されません。その結果、スタックタグがリソースタグと一致しなくなる場合があります。この問題を解決するには、CloudFormation テンプレート内のリソースタグを同期する必要があります。
重要: 次の解決策は、ユースケースによっては一部の手順を省略できる場合があります。
不足しているアクセス許可を IAM プリンシパルに追加する
既存または新規のアカウントで CloudFormation を使用してリソースタグを管理するには、以下の手順を実行します。
タグ付け操作で使用される IAM プリンシパルを特定する
リソースのタグ付けに使用する IAM プリンシパルを特定するには、次の手順を実行します。
- CloudFormation コンソールを開きます。
- ナビゲーションペインで、[スタック] を選択します。
- スタック名を選択し、スタック ID をコピーします。
- AWS CloudTrail コンソールを開きます。
- ナビゲーションペインで [イベント履歴] を選択します。
- [ルックアップ属性] で [リソース名] を選択します。次に、検索ボックスにスタック ID を入力し、検索を実行します。
注: [イベント履歴] には、過去 90 日間のイベントが含まれます。スタック ID 検索でイベントが表示されない場合は、スタックを更新してください。スタックの更新が CloudTrail のイベント履歴に記録されます。更新が記録されると、IAM プリンシパルを取得できます。
- イベント履歴リストで最初のイベント名を選択し、イベントのレコードを確認します。
- イベントのペイロードで IAM プリンシパルを検索します。
- "requestParameters" を検索し、roleArn プロパティを確認します。roleArn がある場合、文字列値が IAM プリンシパルです。
- roleArn がない場合は、"userIdentity" を検索し、principalId 値を確認します。
IAM ポリシーでタグ付けアクセス許可を付与する
Infrastructure as Code (IaC) サービスが IAM プリンシパルを管理している場合、関連する IAM ポリシーを同じ IaC サービスで更新する必要があります。AWS マネジメントコンソールを使用してタグ付けアクセス許可を付与するには、新しいポリシーを作成するか、既存のポリシーを更新します。AWS コマンドラインインターフェイス (AWS CLI) で put-role-policy を実行して IAM プリンシパルのタグ付けアクセス許可を設定することもできます。
詳細については、「CloudFormation スタックでタグ付けアクセス許可エラーを解決する方法を教えてください」を参照してください。
重要: CloudFormation スタックを新しいアカウントにデプロイするには、次のセクションをスキップしてください。
(オプション) 既存のアカウントの CloudFormation スタック全体でリソースタグを同期する
CloudFormation スタックにタグ付けアクセス許可を設定すると、リソースタグが CloudFormation テンプレートのタグと一致しなくなる場合があります。テンプレートタグをリソースタグと一致させるには、次の手順を実行します。
影響を受けるスタックのドリフトを確認する
影響を受けるスタックのドリフトを確認するには、次の手順を実行します。
- AWS Health Dashboard を開き、影響を受けるリソースのデータを取得します。
- CloudFormation スタックのドリフトを検出し、ドリフトの結果を確認します。
注: ドリフト検出の詳細については、「インポートとドリフト検出操作をサポートするリソース」と「個々のスタックリソースでドリフトを検出する」を参照してください。
- リソースのドリフトステータスが IN_SYNC で、リソースがドリフト検出をサポートしている場合、リソースは正しく構成されています。
- リソースのドリフトステータスが MODIFIED の場合は、リソースを選択し、[ドリフトの詳細を表示] を選択して差分を確認します。
- 発生するドリフトシナリオに応じて、次のセクションの手順を実行します。
ドリフト検出をサポートするリソースタグを CloudFormation テンプレートと同期する
次のシナリオでは、ドリフト検出をサポートするリソースタグを同期します。
- リソースのドリフトステータスが MODIFIED で、そのリソースはドリフト検出をサポートしています。
- すべてのリソースには、差分タイプのステータスコードが REMOVE であるタグ変更があります。
- リソースにおいて、REMOVE ラベルではないタグ変更があり、現在にある各タグキーが 予定に含まれています。
重要: これらの手順を実行すると、他のリソースからスタックレベルのタグが一時的に削除されます。スタックレベルのタグに依存しているサービスがある場合は、「リソース自体のタグを修正する」を参照し、中断を防ぎます。
リソースタグを CloudFormation テンプレートと同期するには、次の手順を実行します。
- 元の CloudFormation テンプレートのコピーを保存します。
- コピーした CloudFormation テンプレートで、REMOVE ラベルの付いたすべてのタグを削除します。
- 新しいテンプレートでスタックを更新したら、REMOVE ラベルの付いたすべてのスタックレベルのタグを削除します。
警告: タグはスタック内のすべてのリソースから削除されます。必ず、適用に失敗したタグを再適用してください。
- 元のテンプレートに戻した後に、すべてのスタックレベルのタグを再度追加してテンプレートを再デプロイします。
注: これらの更新により、十分なアクセス許可がなかったため適用できなかったすべてのタグが再適用されます。
リソースのタグを修正する
次のシナリオでは、リソースのタグを修正します。
- リソースで、REMOVE ラベルの付いたタグ変更が行われます。リソースのタグ変更は、予定状態にあるタグキーが 現在の状態にはないことを示しています。
- リソースに REMOVE ラベルではないタグ変更があります。タグキーは予定状態と現在状態の両方にありますが、値は異なります。
リソースに関する次のドリフトの詳細を確認してください。
- 予定の一覧にあり、現在の一覧にはない各タグキー/値を書き留めます。これらのタグを追加する必要があります。
- 現在の一覧にあり、予定の一覧にはない各タグキーを書き留めます。これらのタグは削除する必要があります。
- 予定および現在の一覧にあり、値が異なっている各タグキーを書き留めます。これらのタグは、予定の値に更新する必要があります。
リソースのタグを修正するには、次の手順を実行します。
- CloudFormation コンソールを開きます。
- ナビゲーションペインで、[スタック] を選択します。
- 影響を受けているスタックを選択します。
- [リソース] を選択し、影響を受けているリソースの [物理 ID] リンクを選択します。
- リソースの [タグ] セクションで、各タグを手動で追加、削除、または更新します。タグは、ドリフトの詳細の予定内の一覧が示す状態と一致する必要があります。
- [保存] を選択します。
スタックとリソースが同期していることを確認するには、ドリフト検出操作を再度実行するのがベストプラクティスです。確認するには、「影響を受けるスタックのドリフトを確認する」セクションの手順を実行します。
ドリフト検出をサポートしていないリソースタグを同期する
リソースのドリフトステータスが IN_SYNC で、リソースがドリフト検出をサポートしていない場合、ドリフト検出をサポートしていないリソースタグを同期します。
注: 次の更新では、十分なアクセス許可がなかったため適用に失敗したすべてのタグが再適用されます。
リソースがドリフト検出をサポートしていない場合は、CloudFormation テンプレートを使用して不整合に対処し、CloudFormation がリソースを管理していることを確認します。
次の手順を実行します。
- 元の CloudFormation テンプレートのコピーを保存します。
- コピーした CloudFormation テンプレートで、リソースタグをデプロイされたリソースと比較します。
- 表示されるタグに応じて、状況に応じた手順を実行します。
リソースにタグが指定されておらず、CloudFormation テンプレートではタグが定義されている場合は、次の手順を実行します。
- CloudFormation テンプレートからすべてのタグを削除します。
- 新しい CloudFormation テンプレートを適用してスタックを更新します。次に、スタックレベルのタグをすべて削除します。
- 元の CloudFormation テンプレートに戻し、すべてのスタックレベルのタグを追加してテンプレートを再デプロイします。
デプロイされたリソースで指定されたタグがスタック内のタグと一致していない場合は、次の手順を実行します。
- スタックレベルのタグをすべて削除して、スタックを更新します。
- CloudFormation テンプレートで、デプロイされたリソースと一致するようにすべてのタグを変更します。
- 新しい CloudFormation テンプレートを使用してスタックを更新します。上記で関連付けられたスタックレベルのタグがすべて含まれていることを確認してください。