43.7. 消息标头
Google Secret Manager 组件支持 3 个消息标头,如下是/are:
| Name | 描述 | 默认值 | 类型 |
|---|---|---|---|
| GoogleSecretManagerOperation (producer) 常量: OPERATION | 要执行的操作。 Enum 值:
| 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-managerJAR 添加到 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-managerJAR 添加到 Camel 应用程序。 - 授予服务帐户在 secret 管理级别上执行操作的权限,例如,访问 secret 有效负载或 secret manager 服务的 admin,并对 Pubsub 服务具有权限。
43.7.3. 自动 CamelContext 重新加载 Secret Refresh - 所需的基础架构创建 复制链接链接已复制到粘贴板!
您需要从 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")