使用 Pulumi 管理基础设施
Pulumi 是一个管理云基础设施的平台。它与 Terraform、OpenTofu类似,都是通过代码来管理基础设施,实现了 IaC(Infrastructure as Code)。在定义基础设施时,Terraform 使用了专有的 HCL 语言,而 Pulumi 允许开发者使用常用的编程语言,比如 Python、Go、NodeJS、Java、.NET,以及YAML文件。本文给出简要的快速入门。
安装 Pulumi 🔗
Pulumi 官网上的《Download & install Pulumi》 列出了在不同平台上的安装方式。可以通过软件包管理器安装,也可以下载二进制文件压缩包,手动安装。
手动安装二进制文件 🔗
如果选择手动安装可执行文件,那么下载二进制文件的压缩包后,就会发现,Pulumi 包含了如下程序:
$ ls -1 pulumi
pulumi
pulumi-analyzer-policy
pulumi-analyzer-policy-python
pulumi-language-dotnet
pulumi-language-go
pulumi-language-java
pulumi-language-nodejs
pulumi-language-python
pulumi-language-python-exec
pulumi-language-yaml
pulumi-resource-pulumi-nodejs
pulumi-resource-pulumi-python
pulumi-watch
可以看到,除了 pulumi
程序外,还包括不同语言的程序。将这些文件添加到系统路径的某个目录下即可完成安装。
如果在 MacOS 系统上手动安装,那么系统出于安全要求不允许其运行。可通过 xattr
移除隔离标识。比如将 pulumi 的可执行文件都放在系统路径后,再移除其 com.apple.quarantine
标识:
xattr -d com.apple.quarantine $(dirname $(which pulumi))/pulumi*
实战经验 🔗
在使用代码管理基础设施时,通常通过一个“状态”(State)文件保存基础设施的元数据,具体见文档Managing state & backend options 。默认情况下,pulumi
命令使用 Pulumi Cloud 保存状态文件。但也可以将状态文件保存到本地文件系统、云服务器上的对象存储等作为状态存储的后端。在真实项目中,通常会将状态保存到云服务器上,并且进行加密(因为里边可能包含了密钥)。
Pulumi 官网的 《Get started with Pulumi & Azure 》 介绍了如何使用 Pulumi 管理 Azure 上的基础设施,可作为参考。下面简述一些针对 Azure 的实践。
设置状态存储 🔗
在把状态保存到云服务器的对象存储时,需要与云服务器进行认证。对于 Azure 而言,需要设置 AZURE_STORAGE_ACCOUNT
,以及 AZURE_STORAGE_KEY
和AZURE_STORAGE_SAS_TOKEN
之一。比如使用 AZURE_STORAGE_KEY
:
export AZURE_STORAGE_ACCOUNT=xxx
export AZURE_STORAGE_KEY=xxx
然后验证:
pulumi whoami -v
具体参见文档《Azure Blob Storage 》。
设置 Stack 的 Secret Provider 🔗
Pulumi 的状态中包含了配置和敏感信息,因此 Pulumi 会对敏感信息进行保护。具体如何保护敏感信息,可在初始化项目时,通过 --secrets-provider
选项指定“秘密提供者”。当使用本地或者对象存储时,其默认值为 passphrase
,即通过密码保护。除此之外,还可以通过云厂商的密钥服务进行加密,比如 AWS 的KMS(awskms
)、Azure 的 Key Vault(azurekeyvault
) 等,这是真实项目的基本操作。
因此,在使用 Azure 时,那应该使用 azurekeyvault
。在创建好了 Key Vault 并设置好权限后,可使用如下命令初始化项目:
pulumi stack init --secrets-provider="azurekeyvault://mykeyvaultname.vault.azure.net/keys/mykeyname"
初始化项目的文档详见《pulumi stack init》。