如何保护特定 Pulumi 堆栈中的资源不被删除 选项 1选项 2

问题描述

我使用 Pulumi 在 GCP 中启动我的基础设施。 Pulumi 具有堆栈功能,可帮助您构建相同类型 Pulumi 代码的多个副本。

所以我有与我们拥有的每个环境相对应的 dev/stage/prod 堆栈。

我想知道是否有一种方法可以保护生产堆栈,以便任何人都无法删除其中的任何资源。

我知道关于保护位标志,但这将适用于我不想要的所有堆栈。

解决方法

有几个选项可以实现这一点:

选项 1

一种选择是限制对 Pulumi 状态文件的访问,这样只有特权用户或实体(例如 continuous delivery pipeline)才能读取和写入{{1}状态,因此能够执行可能会破坏资源的操作。 Pulumi 控制台后端通过 stack permissions 在粒度级别支持此功能,并且可以通过特定提供商(例如 AWS IAM)的 IAM 功能限制其他状态后端的访问。

选项 2

另一个选项(可以与第一个选项结合使用)是根据堆栈名称以编程方式设置 protect 标志。以下是 Python 中的示例,但相同的概念适用于所有语言:

prod

您需要在堆栈中的每个资源上设置 import pulumi from pulumi_aws import s3 # only set `protect=True` for "prod" stacks prod_protected = False if "prod" == pulumi.get_stack(): prod_protected = True bucket = s3.Bucket("my-bucket",opts=pulumi.ResourceOptions( protect=prod_protected,# use `prod_protected` flag ),) 以保护 protect=... 堆栈中的所有资源。 Pulumi SDK 提供了一种通过堆栈转换在所有资源上一次设置此设置的方法。有一个执行堆栈转换以在资源 here 上设置标签的示例。