使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

在我没有更改任何 IAM 策略的情况下为资源添加标签后,为什么我的 CloudFormation 堆栈操作会失败?

2 分钟阅读
0

我在将资源标签应用到 AWS CloudFormation 堆栈时收到错误消息,但我没有更新我的 Identity and Access Management (IAM) 主体。

解决方法

在新的 AWS 账户中,如果您在没有正确标注权限的情况下创建、更新或删除 CloudFormation 堆栈中的资源标签,则堆栈操作将失败。

在 2024 年 2 月 29 日之前,现有账户不受此新堆栈操作行为的约束。

为防止服务中断,请向您的 IAM 主体授予必要的标注权限。如果您的 IAM 主体无法管理资源标签,则 CloudFormation 执行堆栈操作时将不会更改任何资源标签。因此,堆栈标签可能与资源标签不匹配。要解决此问题,您必须在 CloudFormation 模板中同步资源标签。

**重要事项:**在以下解决方法中,有些可选步骤对于您的用例而言可能不一定要执行。

向 IAM 主体添加缺失的权限

按照以下步骤,在现有或新的账户中使用 CloudFormation 管理您的资源标签。

查找用于标注操作的 IAM 主体

要查找您想要用来标注资源的 IAM 主体,请完成以下步骤:

  1. 打开 CloudFormation 控制台
  2. 在导航窗格中,选择 Stacks(堆栈)。
  3. 选择您的堆栈名称,然后复制堆栈 ID。
  4. 打开 AWS CloudTrail 控制台
  5. 在导航窗格中,选择 Event history(事件历史记录)。
  6. 对于 Lookup attributes(查找属性),选择 Resource name(资源名称 )。然后在搜索框中输入堆栈 ID,并运行搜索。
    注意:****事件历史记录包括过去 90 天的事件。如果您的堆栈 ID 搜索未显示任何事件,则更新堆栈。堆栈更新记录在 CloudTrail 事件历史记录中。记录更新后,您可以检索 IAM 主体。
  7. 选择 Event history list(事件历史列表)的第一个事件名称,然后查看事件记录。
  8. 在事件有效负载中找到 IAM 主体。
  9. 搜索“requestParameters”以查看 roleArn 属性。如果有 roleArn,则字符串值是 IAM 主体。
  10. 如果没有 roleArn,则搜索“userIdentity”以查看 principalId 值。

在 IAM 策略中授予标注权限

基础设施即代码 (IaC) 服务管理 IAM 主体时,您必须更新相同的 IaC 服务的 IAM 策略。要使用 AWS 管理控制台来授予标注权限,请创建新策略更新现有策略。您还可以在 AWS 命令行界面 (AWS CLI) 中运行 put-role-policy 来配置 IAM 主体的标注权限。

有关更多信息,请参阅如何解决 CloudFormation 堆栈中的标注权限错误?

**重要事项:**要在新账户中部署 CloudFormation 堆栈,请跳过以下部分。

(可选)在现有账户中的 CloudFormation 堆栈之间同步资源标签

当您为 CloudFormation 堆栈配置标注权限时,您的资源标签可能与 CloudFormation 模板中的标签不匹配。要将您的模板标签与资源标签相匹配,请完成以下步骤。

检查受影响的堆栈是否存在偏差

要检查受影响的堆栈是否存在偏差,请完成以下步骤:

  1. 打开您的 AWS Health Dashboard 以获取受影响的资源数据。
  2. 检测您的 CloudFormation 堆栈上是否存在偏差并查看偏差结果。
    **注意:**有关偏差检测的更多信息,请参阅支持导入和偏差检测操作的资源检测各个堆栈资源上的偏差
  3. 当资源的偏差状态为 IN_SYNC 且资源支持偏差检测时,表明资源配置正确。
  4. 当资源的偏差状态为 MODIFIED(已修改)时,选取该资源并选择 View drift details(查看偏差详细信息)以查看差异。
  5. 根据您遇到的偏差场景,完成以下部分中的步骤。

将支持偏差检测的资源标签与 CloudFormation 模板同步

在以下场景中,对支持偏差检测的资源标签进行同步:

  • 资源的偏差状态为 MODIFIED(已修改),且资源支持偏差检测。
  • 所有资源都使用 REMOVE 差异类型状态码进行了标签更改。
  • 资源的标签更改未标记为 REMOVE,且 Actual(实际)中的每个标签键都在 Expected(预期)范围内。

重要事项:这些步骤会暂时从其他资源中移除堆栈级标签。如果您的任何服务依赖堆栈级标签,请参阅修复资源本身的标签以避免中断。

要将您的资源标签与 CloudFormation 模板同步,请完成以下步骤:

  1. 保存您的原始 CloudFormation 模板的副本。
  2. 在复制的 CloudFormation 模板中,移除所有标记为 REMOVE 的标签。
  3. 使用新模板更新堆栈,然后移除所有标记为 REMOVE 的堆栈级标签。
    **警告:**标签将从堆栈中的所有资源中移除。务必重新应用失败的标签。
  4. 恢复到原始模板,然后重新部署模板,将所有堆栈级标签添加回来。
    **注意:**这些更新会重新应用之前您在没有足够权限时未能应用的所有标签。

修复资源上的标签

在以下场景中,修复资源上的标签:

  • 资源的标签更改标记为 REMOVE。资源的标签更改表明,在 Actual(实际)状态下缺少处于 Expected(预期)状态的标签键。
  • 资源的标签更改未标记为 REMOVE。标签键处于 Expected(预期)和 Actual(实际)状态,但值不同。

查看资源上的以下偏差详细信息:

  • 记下在 Expected(预期)下列出但在 Actual(实际)中缺失的每个标签键/值。您必须添加这些标签。
  • 记下在 Actual(实际)下列出但在 Expected(预期)中缺失的每个标签键/值。您必须移除这些标签。
  • 请注意,在 Expected(预期)和 Actual(实际)下列出的每个标签键都有不同的值。您必须将这些标签更新为 Expected(预期)。

要修复资源上的标签,请完成以下步骤:

  1. 打开 CloudFormation 控制台
  2. 在导航窗格中,选择 Stacks(堆栈)。
  3. 选择受影响的堆栈。
  4. 选择 Resources(资源),然后选择受影响资源的 Physical ID(物理 ID)链接。
  5. 在资源的 Tags(标签)部分中,手动添加、移除或更新每个标签。标签必须与偏差详细信息中 Expected(预期)下列出的状态相匹配。
  6. 选择 Save(保存)。

要验证堆栈和资源是否同步,最佳实践是再次执行偏差检测操作。要进行验证,请完成检查受影响的堆栈是否存在偏差部分中的步骤。

对不支持偏差检测的资源标签进行同步

当资源的偏差状态为 IN_SYNC 且资源不支持偏差检测时,对不支持偏差检测的资源标签进行同步。

**注意:**以下更新重新应用了在您没有足够权限时未能应用的所有标签。

如果您的资源不支持偏差检测,则使用 CloudFormation 模板来解决不一致问题并验证 CloudFormation 是否管理资源。

完成以下步骤:

  1. 保存您的原始 CloudFormation 模板的副本。
  2. 在复制的 CloudFormation 模板中,将资源标签与已部署的资源进行比较。
  3. 根据您遇到的标签,完成适用于您的情况的步骤。

如果您的资源中没有指定标签,并且在 CloudFormation 模板中定义了标签,则完成以下步骤:

  1. 从 CloudFormation 模板中移除所有标签。
  2. 应用新的 CloudFormation 模板来更新堆栈。然后移除所有堆栈级标签。
  3. 恢复到原始 CloudFormation 模板,然后重新部署模板,将所有堆栈级标签添加回来。

如果部署的资源中指定的标签与堆栈中的标签不匹配,请完成以下步骤:

  1. 移除所有堆栈级标签以更新堆栈。
  2. 在 CloudFormation 模板中,修改所有标签,使其与部署的资源相匹配。
  3. 使用新的 CloudFormation 模板来更新堆栈。务必包含所有先前关联的堆栈级标签。
AWS 官方
AWS 官方已更新 1 年前