我在将资源标签应用到 AWS CloudFormation 堆栈时收到错误消息,但我没有更新我的 Identity and Access Management (IAM) 主体。
解决方法
在新的 AWS 账户中,如果您在没有正确标注权限的情况下创建、更新或删除 CloudFormation 堆栈中的资源标签,则堆栈操作将失败。
在 2024 年 2 月 29 日之前,现有账户不受此新堆栈操作行为的约束。
为防止服务中断,请向您的 IAM 主体授予必要的标注权限。如果您的 IAM 主体无法管理资源标签,则 CloudFormation 执行堆栈操作时将不会更改任何资源标签。因此,堆栈标签可能与资源标签不匹配。要解决此问题,您必须在 CloudFormation 模板中同步资源标签。
**重要事项:**在以下解决方法中,有些可选步骤对于您的用例而言可能不一定要执行。
向 IAM 主体添加缺失的权限
按照以下步骤,在现有或新的账户中使用 CloudFormation 管理您的资源标签。
查找用于标注操作的 IAM 主体
要查找您想要用来标注资源的 IAM 主体,请完成以下步骤:
- 打开 CloudFormation 控制台。
- 在导航窗格中,选择 Stacks(堆栈)。
- 选择您的堆栈名称,然后复制堆栈 ID。
- 打开 AWS CloudTrail 控制台。
- 在导航窗格中,选择 Event history(事件历史记录)。
- 对于 Lookup attributes(查找属性),选择 Resource name(资源名称 )。然后在搜索框中输入堆栈 ID,并运行搜索。
注意:****事件历史记录包括过去 90 天的事件。如果您的堆栈 ID 搜索未显示任何事件,则更新堆栈。堆栈更新记录在 CloudTrail 事件历史记录中。记录更新后,您可以检索 IAM 主体。
- 选择 Event history list(事件历史列表)的第一个事件名称,然后查看事件记录。
- 在事件有效负载中找到 IAM 主体。
- 搜索“requestParameters”以查看 roleArn 属性。如果有 roleArn,则字符串值是 IAM 主体。
- 如果没有 roleArn,则搜索“userIdentity”以查看 principalId 值。
在 IAM 策略中授予标注权限
当基础设施即代码 (IaC) 服务管理 IAM 主体时,您必须更新相同的 IaC 服务的 IAM 策略。要使用 AWS 管理控制台来授予标注权限,请创建新策略或更新现有策略。您还可以在 AWS 命令行界面 (AWS CLI) 中运行 put-role-policy 来配置 IAM 主体的标注权限。
有关更多信息,请参阅如何解决 CloudFormation 堆栈中的标注权限错误?
**重要事项:**要在新账户中部署 CloudFormation 堆栈,请跳过以下部分。
(可选)在现有账户中的 CloudFormation 堆栈之间同步资源标签
当您为 CloudFormation 堆栈配置标注权限时,您的资源标签可能与 CloudFormation 模板中的标签不匹配。要将您的模板标签与资源标签相匹配,请完成以下步骤。
检查受影响的堆栈是否存在偏差
要检查受影响的堆栈是否存在偏差,请完成以下步骤:
- 打开您的 AWS Health Dashboard 以获取受影响的资源数据。
- 检测您的 CloudFormation 堆栈上是否存在偏差并查看偏差结果。
**注意:**有关偏差检测的更多信息,请参阅支持导入和偏差检测操作的资源和检测各个堆栈资源上的偏差。
- 当资源的偏差状态为 IN_SYNC 且资源支持偏差检测时,表明资源配置正确。
- 当资源的偏差状态为 MODIFIED(已修改)时,选取该资源并选择 View drift details(查看偏差详细信息)以查看差异。
- 根据您遇到的偏差场景,完成以下部分中的步骤。
将支持偏差检测的资源标签与 CloudFormation 模板同步
在以下场景中,对支持偏差检测的资源标签进行同步:
- 资源的偏差状态为 MODIFIED(已修改),且资源支持偏差检测。
- 所有资源都使用 REMOVE 差异类型状态码进行了标签更改。
- 资源的标签更改未标记为 REMOVE,且 Actual(实际)中的每个标签键都在 Expected(预期)范围内。
重要事项:这些步骤会暂时从其他资源中移除堆栈级标签。如果您的任何服务依赖堆栈级标签,请参阅修复资源本身的标签以避免中断。
要将您的资源标签与 CloudFormation 模板同步,请完成以下步骤:
- 保存您的原始 CloudFormation 模板的副本。
- 在复制的 CloudFormation 模板中,移除所有标记为 REMOVE 的标签。
- 使用新模板更新堆栈,然后移除所有标记为 REMOVE 的堆栈级标签。
**警告:**标签将从堆栈中的所有资源中移除。务必重新应用失败的标签。
- 恢复到原始模板,然后重新部署模板,将所有堆栈级标签添加回来。
**注意:**这些更新会重新应用之前您在没有足够权限时未能应用的所有标签。
修复资源上的标签
在以下场景中,修复资源上的标签:
- 资源的标签更改标记为 REMOVE。资源的标签更改表明,在 Actual(实际)状态下缺少处于 Expected(预期)状态的标签键。
- 资源的标签更改未标记为 REMOVE。标签键处于 Expected(预期)和 Actual(实际)状态,但值不同。
查看资源上的以下偏差详细信息:
- 记下在 Expected(预期)下列出但在 Actual(实际)中缺失的每个标签键/值。您必须添加这些标签。
- 记下在 Actual(实际)下列出但在 Expected(预期)中缺失的每个标签键/值。您必须移除这些标签。
- 请注意,在 Expected(预期)和 Actual(实际)下列出的每个标签键都有不同的值。您必须将这些标签更新为 Expected(预期)。
要修复资源上的标签,请完成以下步骤:
- 打开 CloudFormation 控制台。
- 在导航窗格中,选择 Stacks(堆栈)。
- 选择受影响的堆栈。
- 选择 Resources(资源),然后选择受影响资源的 Physical ID(物理 ID)链接。
- 在资源的 Tags(标签)部分中,手动添加、移除或更新每个标签。标签必须与偏差详细信息中 Expected(预期)下列出的状态相匹配。
- 选择 Save(保存)。
要验证堆栈和资源是否同步,最佳实践是再次执行偏差检测操作。要进行验证,请完成检查受影响的堆栈是否存在偏差部分中的步骤。
对不支持偏差检测的资源标签进行同步
当资源的偏差状态为 IN_SYNC 且资源不支持偏差检测时,对不支持偏差检测的资源标签进行同步。
**注意:**以下更新重新应用了在您没有足够权限时未能应用的所有标签。
如果您的资源不支持偏差检测,则使用 CloudFormation 模板来解决不一致问题并验证 CloudFormation 是否管理资源。
完成以下步骤:
- 保存您的原始 CloudFormation 模板的副本。
- 在复制的 CloudFormation 模板中,将资源标签与已部署的资源进行比较。
- 根据您遇到的标签,完成适用于您的情况的步骤。
如果您的资源中没有指定标签,并且在 CloudFormation 模板中定义了标签,则完成以下步骤:
- 从 CloudFormation 模板中移除所有标签。
- 应用新的 CloudFormation 模板来更新堆栈。然后移除所有堆栈级标签。
- 恢复到原始 CloudFormation 模板,然后重新部署模板,将所有堆栈级标签添加回来。
如果部署的资源中指定的标签与堆栈中的标签不匹配,请完成以下步骤:
- 移除所有堆栈级标签以更新堆栈。
- 在 CloudFormation 模板中,修改所有标签,使其与部署的资源相匹配。
- 使用新的 CloudFormation 模板来更新堆栈。务必包含所有先前关联的堆栈级标签。