为什么 Amazon 建议在 AWS IAM 资源名称中包含区域?

问题描述

IAM 资源是全球性的,这意味着它们不会被隔离在特定的 AWS 区域内。但是,IAM 角色的文档包括 warning:

重要

如果您在多个区域重复使用相同的模板,命名 IAM 资源可能会导致不可恢复的错误。为防止出现这种情况,我们建议使用 FN::Join 和 AWS::Region 创建特定于区域的名称,如下例所示...

他们在谈论什么样的“不可恢复的错误”? cloudformation 是只是无法创建资源,还是会陷入某种奇怪的状态?

我们拥有的包含 IAM 资源的堆栈包含 IAM 资源,因此我怀疑我可以忽略此警告。

解决方法

他们希望您注意的问题是 IAM 是一个全局命名空间,如果您不手动设置命名空间资源,这可能会导致问题。

这是一个例子:

  • eu-central-1 中的堆栈 1 创建了一个名为 AppAdmin 的角色
  • eu-west-1 中的堆栈 2 创建名为 AppAdmin 的角色 - 此堆栈将无法创建或更新

这种失败通常不会危及生命,只是意味着您的部署将被破坏。 如果是对现有堆栈的更新,则将执行回滚。 如果是新堆栈,则堆栈将无法创建,您需要在之后手动删除堆栈,然后再将其滚出(默认情况下,孤立的资源将被删除)。

您可以通过按照建议对资源进行命名空间来简单地避免此问题:

  • eu-central-1 中的堆栈 1 创建了一个名为 AppAdmin-eu-central-1 的角色
  • eu-west-1 中的堆栈 2 创建一个名为 AppAdmin-eu-west-1 的角色

现在大家都很开心!

(S3 Bucket 名称和其他具有全局命名空间的资源也是如此)