问题描述
我使用 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 上设置标签的示例。