43.7. 消息标头


Google Secret Manager 组件支持 3 个消息标头,如下是/are:

Expand
Name描述默认值类型

GoogleSecretManagerOperation (producer)

常量: OPERATION

要执行的操作。

Enum 值:

  • createSecret
  • getSecretVersion
  • deleteSecret
  • listSecrets
 

GoogleSecretManagerOperations

CamelGoogleSecretManagerSecretId (producer)

常数: SECRET_ID

secret 的 id。

 

字符串

CamelGoogleSecretManagerVersionId (producer)

常数: VERSION_ID

secret 的版本。

latest

字符串

43.7.1. 使用 GCP Secret Manager 属性源

要使用 GCP Secret Manager,您需要提供 serviceAccountKey 文件和 GCP projectId。这可以通过在启动应用程序前使用环境变量完成:

export $CAMEL_VAULT_GCP_SERVICE_ACCOUNT_KEY=file://path/to/service.accountkey
export $CAMEL_VAULT_GCP_PROJECT_ID=projectId

您还可以在 application.properties 文件中配置凭证,如下所示:

camel.vault.gcp.serviceAccountKey = serviceAccountKey
camel.vault.gcp.projectId = projectId

如果要使用 GCP 默认客户端实例,您需要提供以下 env 变量:

export $CAMEL_VAULT_GCP_USE_DEFAULT_INSTANCE=true
export $CAMEL_VAULT_GCP_PROJECT_ID=projectId

您还可以在 application.properties 文件中配置凭证,如下所示:

camel.vault.gcp.useDefaultInstance = true
camel.vault.gcp.projectId = region
注意

camel.vault.gcp 配置只适用于 Google Secret Manager 属性功能(例如,当解析属性时)。当使用 operation 选项创建、获取、列出 secret 等时,您应该提供连接到 GCP Services 的常规选项。

此时,您可以使用 gcp: 作为 {{ }} 语法中的 prefix 来引用属性:

<camelContext>
    <route>
        <from uri="direct:start"/>
        <to uri="{{gcp:route}}"/>
    </route>
</camelContext>

其中 route 是存储在 GCP Secret Manager Service 中的 secret 的名称。

如果 GCP Secret Manager 上不存在 secret,您可以指定一个默认值:

<camelContext>
    <route>
        <from uri="direct:start"/>
        <to uri="{{gcp:route:default}}"/>
    </route>
</camelContext>

在这种情况下,如果 secret 不存在,属性将回退到 default 作为值。

另外,如果您有一个名为 database 的 secret,您可以获取 secret 的特定字段:

{
  "username": "admin",
  "password": "password123",
  "engine": "postgres",
  "host": "127.0.0.1",
  "port": "3128",
  "dbname": "db"
}

您可以在路由中获取单个 secret 值,例如:

<camelContext>
    <route>
        <from uri="direct:start"/>
        <log message="Username is {{gcp:database/username}}"/>
    </route>
</camelContext>

或重新使用属性作为端点的一部分。

如果 GCP Secret Manager 上不存在 secret 的特定字段,您可以指定一个默认值:

<camelContext>
    <route>
        <from uri="direct:start"/>
        <log message="Username is {{gcp:database/username:admin}}"/>
    </route>
</camelContext>

在这种情况下,如果 secret 不存在或 secret 存在,但 username 字段不是 secret 的一部分,则属性将回退到 "admin" 作为值。

另外,还提供了为这两种方法获取 secret 的特定版本的语法,指定了字段/默认值,或仅使用 secret:

<camelContext>
    <route>
        <from uri="direct:start"/>
        <to uri="{{gcp:route@1}}"/>
    </route>
</camelContext>

此方法将返回带有版本 '1' 的 RAW 路由 secret。

<camelContext>
    <route>
        <from uri="direct:start"/>
        <to uri="{{gcp:route:default@1}}"/>
    </route>
</camelContext>

如果 secret 不存在或者版本不存在,此方法将返回带有版本 '1' 或默认值的路由 secret 值。

<camelContext>
    <route>
        <from uri="direct:start"/>
        <log message="Username is {{gcp:database/username:admin@1}}"/>
    </route>
</camelContext>

如果 secret 不存在或者版本不存在,此方法将返回数据库 secret 的用户名字段,其版本为 '1' 或 admin。

只有两个要求:

  • camel-google-secret-manager JAR 添加到 Camel 应用程序。
  • 授予服务帐户在 secret 管理级别执行操作的权限,例如,访问 secret 有效负载或 secret manager 服务的 admin。)

43.7.2. 自动 CamelContext 重新加载 Secret Refresh

可以在 Secret Refresh 上重新加载 Camel 上下文,方法是指定常规凭证(与 Google Secret Manager 属性功能相同)。

使用环境变量:

export $CAMEL_VAULT_GCP_USE_DEFAULT_INSTANCE=true
export $CAMEL_VAULT_GCP_PROJECT_ID=projectId

或者作为普通 Camel 主属性:

camel.vault.gcp.useDefaultInstance = true
camel.vault.gcp.projectId = projectId

或者指定服务帐户密钥文件的路径,而不是使用默认实例。

要启用自动刷新,您需要设置附加属性:

camel.vault.gcp.projectId= projectId
camel.vault.gcp.refreshEnabled=true
camel.vault.gcp.refreshPeriod=60000
camel.vault.gcp.secrets=hello*
camel.vault.gcp.subscriptionName=subscriptionName
camel.main.context-reload-enabled = true

其中 camel.vault.gcp.refreshEnabled 将启用自动上下文重新加载,camel.vault.gcp.refreshPeriod 是更新事件的两个不同检查和 camel.vault.gcp.secrets 是代表我们要跟踪更新的 secret 的时间间隔。

请注意,camel.vault.gcp.secrets 不是强制的。如果没有指定负责检查更新事件的任务,则帐户或带有 gcp: 前缀的属性。

camel.vault.gcp.subscriptionName 是与跟踪的 secret 关联的 Google PubSub 主题创建的订阅名称。

在使用与 Google Secret Manager 相关的通知系统时,此机制:通过此功能,每个 secret 可以与最多 10 个 Google Pubsub Topic 关联。这些主题将收到与 secret 生命周期相关的事件。

只有两个要求:

  • camel-google-secret-manager JAR 添加到 Camel 应用程序。
  • 授予服务帐户在 secret 管理级别上执行操作的权限,例如,访问 secret 有效负载或 secret manager 服务的 admin,并对 Pubsub 服务具有权限。

您需要从 https://cloud.google.com/sdk/docs/install 安装 gcloud cli。安装 Cli 后,我们可以使用以下命令继续登录并设置项目:

gcloud auth login

and

gcloud projects create <projectId> --name="GCP Secret Manager Refresh"

该项目需要使用 secret Manager 服务的服务身份,您可以通过该命令获取:

gcloud beta services identity create --service "secretmanager.googleapis.com" --project <project_id>

以下命令提供我们需要导出的服务帐户名称:

export SM_SERVICE_ACCOUNT="service-...."

由于我们希望通过 Google Pubsub 主题就与特定 secret 相关的事件通知,因此我们需要使用以下命令为这一目的创建一个主题:

gcloud pubsub topics create "projects/<project_id>/topics/pubsub-gcp-sec-refresh"

服务帐户需要 Secret Manager 授权在刚刚创建的主题上发布信息,因此我们需要使用以下命令添加 iam 策略绑定:

gcloud pubsub topics add-iam-policy-binding pubsub-gcp-sec-refresh --member "serviceAccount:${SM_SERVICE_ACCOUNT}" --role "roles/pubsub.publisher" --project <project_id>

现在,我们需要创建一个刚刚创建的 pubsub-gcp-sec-refresh 的订阅,并使用以下命令调用 sub-gcp-sec-refresh

gcloud pubsub subscriptions create "projects/<project_id>/subscriptions/sub-gcp-sec-refresh" --topic "projects/<project_id>/topics/pubsub-gcp-sec-refresh"

现在,我们需要创建一个服务帐户来运行我们的应用程序:

gcloud iam service-accounts create gcp-sec-refresh-sa --description="GCP Sec Refresh SA" --project <project_id>

让我们为 SA 提供所有者角色:

gcloud projects add-iam-policy-binding <project_id> --member="serviceAccount:gcp-sec-refresh-sa@<project_id>.iam.gserviceaccount.com" --role="roles/owner"

现在,我们应该为只创建 SA 创建服务帐户密钥文件:

gcloud iam service-accounts keys create <project_id>.json --iam-account=gcp-sec-refresh-sa@<project_id>.iam.gserviceaccount.com

我们为我们的项目启用 Secret Manager API。

gcloud services enable secretmanager.googleapis.com --project <project_id>

另外,启用 PubSub API,如下所示:

gcloud services enable pubsub.googleapis.com --project <project_id>

如果需要,还要启用 Billing API。

现在是时候创建带有主题通知的 secret:

gcloud secrets create <secret_name> --topics=projects/<project_id>/topics/pubsub-gcp-sec-refresh --project=<project_id>

并添加值

gcloud secrets versions add <secret_name> --data-file=<json_secret> --project=<project_id>

现在,您可以使用 projectId 和服务帐户 json 文件恢复 secret。

43.7.4. Google Secret Manager Producer 操作

Google Functions 组件在制作者端提供以下操作:

  • createSecret
  • getSecretVersion
  • deleteSecret
  • listSecrets

如果您没有默认指定操作,则生成者将使用 createSecret 操作。

43.7.5. Google Secret Manager Producer 操作示例

  • createSecret :此操作将在 Secret Manager 服务中创建 secret
from("direct:start")
    .setHeader("GoogleSecretManagerConstants.SECRET_ID, constant("test"))
    .setBody(constant("hello"))
    .to("google-functions://myProject?serviceAccountKey=/home/user/Downloads/my-key.json&operation=createSecret")
    .log("body:${body}")
  • getSecretVersion: 此操作将使用 Secret Manager 服务中最新版本检索 secret 值
from("direct:start")
    .setHeader("GoogleSecretManagerConstants.SECRET_ID, constant("test"))
    .to("google-functions://myProject?serviceAccountKey=/home/user/Downloads/my-key.json&operation=getSecretVersion")
    .log("body:${body}")

这将记录机密"test"的值。

  • DeleteSecret :此操作将删除 secret
from("direct:start")
    .setHeader("GoogleSecretManagerConstants.SECRET_ID, constant("test"))
    .to("google-functions://myProject?serviceAccountKey=/home/user/Downloads/my-key.json&operation=deleteSecret")
  • listSecrets :此操作将返回 myProject 项目的 secret 列表
from("direct:start")
    .setHeader("GoogleSecretManagerConstants.SECRET_ID, constant("test"))
    .to("google-functions://myProject?serviceAccountKey=/home/user/Downloads/my-key.json&operation=listSecrets")
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部