如何让Pulumi函数仅在pulumi up实际部署时运行而非预览阶段?
在Pulumi中仅在实际部署阶段执行自定义代码
核心解决方案:利用pulumi.runtime.isDryRun()
Pulumi提供pulumi.runtime.isDryRun()方法判断当前是否处于Dry Run模式——该模式包含pulumi preview命令,以及pulumi up执行过程中用户确认前的规划阶段。只有当用户确认部署、开始实际向云端创建/修改资源时,isDryRun()才会返回false,此时可执行你的自定义AWS SDK代码。
直接修改代码如下:
const pulumi = require("@pulumi/pulumi"); // 仅在实际部署阶段执行资源策略操作 if (!pulumi.runtime.isDryRun()) { myAwsModule.putResourcePolicy({ policyName: "AWSLogDeliveryWrite20150319", // 补充其他必要参数 }); }
替代方案:使用@pulumi/command资源
如果需要更严格的执行控制(比如确保代码执行的幂等性或依赖其他资源状态),可将自定义代码封装成脚本,通过@pulumi/command的LocalCommand资源执行。该资源默认不会在Dry Run阶段运行,仅在实际部署时触发:
- 创建单独的脚本文件
set-resource-policy.js:
// set-resource-policy.js const myAwsModule = require("./path-to-your-aws-module"); async function run() { // 可添加前置检查逻辑(如判断策略是否已存在)保证幂等性 await myAwsModule.putResourcePolicy({ policyName: "AWSLogDeliveryWrite20150319", // 其他参数 }); } module.exports = { run };
- 在Pulumi栈文件中调用该脚本:
const command = require("@pulumi/command"); new command.local.Command("apply-log-delivery-policy", { create: "node -e \"require('./set-resource-policy.js').run()\"", // 可选:设置触发器,确保仅在必要时重新执行 triggers: [Date.now().toString()], });
注意事项
- 这类命令式代码脱离了Pulumi的声明式状态管理,需自行处理幂等性(比如先检查资源策略是否存在,再决定是否执行
put操作),避免重复执行导致异常。 - 确保执行代码的环境拥有足够的AWS权限,且与Pulumi栈使用的身份一致。
内容的提问来源于stack exchange,提问作者Lazaro
相关产品推荐
相关产品推荐

