43.7. メッセージヘッダー
Google Secret Manager コンポーネントは、以下の 3 つのメッセージヘッダーをサポートしています。
| 名前 | 説明 | デフォルト | タイプ |
|---|---|---|---|
| GoogleSecretManagerOperation (producer) 定数: OPERATION | 実行する操作。 列挙値:
| GoogleSecretManagerOperations | |
| CamelGoogleSecretManagerSecretId (producer) 定数: SECRET_ID | シークレットの ID。 | String | |
| CamelGoogleSecretManagerVersionId (producer) 定数: VERSION_ID | シークレットのバージョン。 | latest | String |
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 のデフォルトのクライアントインスタンス を使用する場合は、次の環境変数を指定する必要があります。
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 オプションを使用する場合は、GCP サービスに接続するための通常のオプションを指定する必要があります。
この時点で、{{}} 構文で gcp: を接頭辞として使用することで、次のようにプロパティーを参照できます。
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{gcp:route}}"/>
</route>
</camelContext>
ここで、route は GCP Secret Manager サービスに保存されているシークレットの名前になります。
GCP Secret Manager にシークレットが存在しない場合は、デフォルト値を指定できます。
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{gcp:route:default}}"/>
</route>
</camelContext>
この場合、シークレットが存在しなければプロパティーの値は default にフォールバックします。
また、たとえば次の形式の database という名前のシークレットがある場合、シークレットの特定のフィールドを取得できます。
{
"username": "admin",
"password": "password123",
"engine": "postgres",
"host": "127.0.0.1",
"port": "3128",
"dbname": "db"
}
ルート内で 1 つのシークレット値を取得できます。以下はその例です。
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{gcp:database/username}}"/>
</route>
</camelContext>
または、エンドポイントの一部としてプロパティーを再利用します。
GCP Secret Manager に特定のシークレットフィールドが存在しない場合は、デフォルト値を指定できます。
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{gcp:database/username:admin}}"/>
</route>
</camelContext>
この場合、シークレットが存在しないか、シークレットは存在するがユーザー名フィールドがシークレットの一部ではない場合、プロパティーは値として "admin" にフォールバックします。
フィールド/デフォルト値を指定して、またはシークレットのみを使用して、両方のアプローチでシークレットの特定のバージョンを取得するための構文もあります。
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{gcp:route@1}}"/>
</route>
</camelContext>
このアプローチでは、バージョン '1' の RAW ルートシークレットが返されます。
<camelContext>
<route>
<from uri="direct:start"/>
<to uri="{{gcp:route:default@1}}"/>
</route>
</camelContext>
このアプローチでは、シークレットが存在しない場合、またはバージョンが存在しない場合、バージョン '1' またはデフォルト値のルートシークレット値が返されます。
<camelContext>
<route>
<from uri="direct:start"/>
<log message="Username is {{gcp:database/username:admin@1}}"/>
</route>
</camelContext>
このアプローチでは、データベースシークレットのユーザー名フィールドがバージョン '1' で返されます。あるいは、シークレットが存在しない場合、またはバージョンが存在しない場合は、admin が返されます。
要件は 2 つだけです。
-
Camel アプリケーションに
camel-google-secret-managerJAR を追加します。 - サービスアカウントに、シークレット管理レベルでの操作を実行するための権限を付与します (たとえば、シークレットペイロードにアクセスする、シークレットマネージャーサービスの管理者になるなど)。
43.7.2. シークレット更新時の CamelContext の自動リロード リンクのコピーリンクがクリップボードにコピーされました!
Secret の更新時に 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 は更新イベントの 2 つの異なるチェック間の時間間隔で、camel.vault.gcp.secrets は更新を追跡するシークレットを表す正規表現です。
camel.vault.gcp.secrets は必須ではないことに注意してください。指定されていない場合、更新イベントのチェックを担当するタスクは、gcp: 接頭辞が付いたプロパティーを考慮します。
camel.vault.gcp.subscriptionName は、追跡されたシークレットに関連付けられた Google PubSub トピックに関連して作成されたサブスクリプション名です。
このメカニズムは、Google Secret Manager に関連する通知システムを利用します。この機能により、すべてのシークレットを 1 個から 10 個までの Google Pubsub トピックに関連付けることができます。これらのトピックは、シークレットのライフサイクルに関連するイベントを受け取ります。
要件は 2 つだけです。
-
Camel アプリケーションに
camel-google-secret-managerJAR を追加します。 - サービスアカウントに、シークレット管理レベルで操作を実行するための権限を付与します (たとえば、シークレットペイロードにアクセスする、シークレットマネージャーサービスの管理者になる、Pubsub サービスに対する権限を持つ、など)。
43.7.3. シークレット更新時の CamelContext の自動リロード - 必要なインフラストラクチャーの作成 リンクのコピーリンクがクリップボードにコピーされました!
https://cloud.google.com/sdk/docs/install から gcloud cli をインストールする必要があります。Cli がインストールされたら、ログインして次のコマンドでプロジェクトをセットアップできます。
gcloud auth login
および
gcloud projects create <projectId> --name="GCP Secret Manager Refresh"
プロジェクトでは、シークレットマネージャーサービスを使用するためにサービスアイデンティティーが必要になります。これは次のコマンドで取得できます。
gcloud beta services identity create --service "secretmanager.googleapis.com" --project <project_id>
次のコマンドで、エクスポートする必要があるサービスアカウント名を取得できます。
export SM_SERVICE_ACCOUNT="service-...."
Google Pubsub トピックを通じて特定のシークレットに関連するイベントの通知を受け取るには、そのためのトピックを次のコマンドを使用して作成する必要があります。
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 も有効にします。
次に、トピック通知を指定してシークレットを作成します。
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 ファイルを使用してシークレットを回復できるようになりました。
43.7.4. Google Secret Manager Producer の操作 リンクのコピーリンクがクリップボードにコピーされました!
Google Functions コンポーネントは、producer 側で次の操作を提供します。
-
createSecret -
getSecretVersion -
deleteSecret -
listSecrets
デフォルトで操作を指定しない場合、producer は createSecret 操作を使用します。
43.7.5. Google Secret Manager Producer の操作例 リンクのコピーリンクがクリップボードにコピーされました!
-
createSecret: この操作は、Secret Manager サービスにシークレットを作成します。
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 サービス内の最新バージョンのシークレット値を取得します。
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: この操作は、シークレットを削除します
from("direct:start")
.setHeader("GoogleSecretManagerConstants.SECRET_ID, constant("test"))
.to("google-functions://myProject?serviceAccountKey=/home/user/Downloads/my-key.json&operation=deleteSecret")
-
listSecrets: この操作は、プロジェクト myProject のシークレットのリストを返します。
from("direct:start")
.setHeader("GoogleSecretManagerConstants.SECRET_ID, constant("test"))
.to("google-functions://myProject?serviceAccountKey=/home/user/Downloads/my-key.json&operation=listSecrets")