引入用于提供者凭证的 envVarMappings

发布: (2026年2月12日 GMT+8 08:00)
5 分钟阅读

抱歉,我需要您提供要翻译的具体文本内容(除了已给出的来源链接之外)。请把文章的正文粘贴过来,我就可以为您完成简体中文翻译。

使用不同凭证运行多个提供程序

提供程序传统上依赖固定的环境变量名称(例如 AWS_ACCESS_KEY_IDARM_CLIENT_SECRET)。这导致在单个 Pulumi 程序中使用环境变量时,难以配置同类型的两个提供程序——比如针对不同账户的两个 AWS 提供程序。

Pulumi v3.220.0 引入了 envVarMappings,这是一项新的资源选项,允许您将提供程序的环境变量重新映射到自定义键,从而解决了此限制。

身份验证选项

在配置 Pulumi 提供程序时,您有两种主要方式来提供凭证:

1. Pulumi 配置(存储在 Pulumi.yaml 中)

pulumi config set azure-native:clientSecret  --secret

2. 环境变量

export ARM_CLIENT_SECRET=1234567

环境变量在 CI 流水线中尤其方便,或者当您不想将密钥写入状态文件(即使已加密)时也很有用。然而,提供程序要求的硬编码变量名在多种情形下可能会导致问题。

当内置变量不足时

  • 需要不同凭证的多个提供程序实例但共享相同变量名。
    例如,使用两个显式的 Azure 提供程序针对不同订阅时,无法通过独立的环境变量进行配置。唯一的替代方案是将凭证写入提供程序配置,这会将密钥写入状态,并在令牌轮换时产生大量噪声差异。

使用 envVarMappings 重新映射环境变量

envVarMappings 允许您告诉提供者从自定义定义的环境变量读取其期望的变量。

概念:

“对于我的 Pulumi 提供者期望的任何环境变量,我想能够告诉提供者使用自定义定义的环境变量的值。”

示例

假设提供者期望 ARM_CLIENT_SECRET,但您希望它使用在 CUSTOM_ARM_CLIENT_SECRET 中定义的不同值。

export CUSTOM_ARM_CLIENT_SECRET=7654321

然后使用映射配置提供者:

TypeScript

import * as pulumi from "@pulumi/pulumi";
import * as command from "@pulumi/command";

const provider = new command.Provider("command-provider", {}, {
    envVarMappings: {
        // If CUSTOM_ARM_CLIENT_SECRET exists, provider sees the value as ARM_CLIENT_SECRET
        "CUSTOM_ARM_CLIENT_SECRET": "ARM_CLIENT_SECRET",
    },
});

Python

import pulumi
import pulumi_command as command

provider = command.Provider("command-provider",
    opts=pulumi.ResourceOptions(
        env_var_mappings={
            # If CUSTOM_ARM_CLIENT_SECRET exists, provider sees the value as ARM_CLIENT_SECRET
            "CUSTOM_ARM_CLIENT_SECRET": "ARM_CLIENT_SECRET",
        }
    )
)

Go

provider, err := command.NewProvider(ctx,
    "command-provider",
    &command.ProviderArgs{},
    pulumi.EnvVarMappings(map[string]string{
        // If CUSTOM_ARM_CLIENT_SECRET exists, provider sees the value as ARM_CLIENT_SECRET
        "CUSTOM_ARM_CLIENT_SECRET": "ARM_CLIENT_SECRET",
    }),
)
if err != nil {
    return err
}

C#

var provider = new Command.Provider("command-provider",
    new Command.ProviderArgs(),
    new CustomResourceOptions
    {
        EnvVarMappings = new Dictionary
        {
            // If CUSTOM_ARM_CLIENT_SECRET exists, provider sees the value as ARM_CLIENT_SECRET
            { "CUSTOM_ARM_CLIENT_SECRET", "ARM_CLIENT_SECRET" }
        }
    });

Java

var provider = new Provider("command-provider",
    ProviderArgs.Empty,
    CustomResourceOptions.builder()
        .envVarMappings(Map.of(
            // If CUSTOM_ARM_CLIENT_SECRET exists, provider sees the value as ARM_CLIENT_SECRET
            "CUSTOM_ARM_CLIENT_SECRET", "ARM_CLIENT_SECRET"))
        .build());

YAML (Pulumi YAML)

resources:
  command-provider:
    type: pulumi:providers:command
    options:
      envVarMappings:
        # If CUSTOM_ARM_CLIENT_SECRET exists, provider sees the value as ARM_CLIENT_SECRET
        CUSTOM_ARM_CLIENT_SECRET: ARM_CLIENT_SECRET

使用 envVarMappings,每个提供者都可以从唯一命名的环境变量读取其所需的变量,从而在同一程序中启用多个凭据集。

今天就尝试

使用 Pulumi v3.220.0 或更高版本,并在任何支持它的提供程序中添加 envVarMappings。完整参考,请参阅官方 envVarMappings 文档

祝编码愉快!

0 浏览
Back to Blog

相关文章

阅读更多 »

我的第一次成功的 CICD 部署

我刚开始我的 DevOps 学习之旅,已经掌握了 JavaScript、Git、GitHub Actions,稍微了解 Docker、构建工具和测试。我已经…