Skip to content
This repository was archived by the owner on Jul 26, 2022. It is now read-only.

Commit 865caeb

Browse files
authored
BREAKING: feat: GCP Secret Manager Backend Enhancements (#347)
BREAKING CHANGES: Changes how keys are specified for external secrets using GCP Secret manager backend. `projects/111122223333/secrets/my-secret/versions/latest` -> `my-secret`
1 parent 002536a commit 865caeb

File tree

7 files changed

+43
-13
lines changed

7 files changed

+43
-13
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -475,4 +475,4 @@ Add secrets using the AWS cli (example)
475475

476476
```sh
477477
AWS_ACCESS_KEY_ID=foobar AWS_SECRET_ACCESS_KEY=foobar aws --region=us-west-2 --endpoint-url=http://localhost:4584 secretsmanager create-secret --name hello-service/password --secret-string "1234"
478-
```
478+
```

charts/kubernetes-external-secrets/templates/deployment.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,4 @@ spec:
8686
secret:
8787
secretName: {{ $value.secret }}
8888
{{- end }}
89-
{{- end }}
89+
{{- end }}

charts/kubernetes-external-secrets/values.yaml

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ env:
99
LOG_LEVEL: info
1010
METRICS_PORT: 3001
1111
VAULT_ADDR: http://127.0.0.1:8200
12-
# GOOGLE_APPLICATION_CREDENTIALS: /app/gcp-creds.json
12+
GOOGLE_APPLICATION_CREDENTIALS: /app/gcp-creds/gcp-creds.json
1313

1414
# Create environment variables from existing k8s secrets
1515
# envVarsFromSecret:
@@ -33,7 +33,7 @@ env:
3333
# filesFromSecret:
3434
# gcp-creds:
3535
# secret: gcp-creds
36-
# mountPath: /app/gcp-creds.json
36+
# mountPath: /app/gcp-creds
3737

3838
rbac:
3939
# Specifies whether RBAC resources should be created
@@ -86,4 +86,4 @@ affinity: {}
8686
serviceMonitor:
8787
enabled: false
8888
interval: "30s"
89-
namespace:
89+
namespace:

examples/gcpsecretsmanager-example copy.yaml examples/hello-service-external-secret-gcp.yml

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ metadata:
44
name: gcp-secrets-manager-example
55
spec:
66
backendType: gcpSecretsManager
7+
gcpProjectId: hello-service-project-id
78
data:
8-
- key: projects/111122223333/secrets/my-secret/versions/latest
9+
- key: hello-service-password
910
name: password
1011
property: value
12+
version: 1

lib/backends/gcp-secrets-manager-backend.js

+27-5
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,38 @@ class GCPSecretsManagerBackend extends KVBackend {
1414
this._client = client
1515
}
1616

17+
/**
18+
* Gets the project id from auth object from the GCP Secret Manager Client
19+
*/
20+
_getProjectId () {
21+
return this._client.auth._cachedProjectId
22+
}
23+
1724
/**
1825
* Get secret property value from GCP Secrets Manager.
19-
* @param {string} key - Key used to store secret property value in GCP Secrets Manager.
20-
* @param {boolean} keyOptions.isBinary - Is the secret base64 encoded? Set to true to handle as binary.
26+
* @param {string} key - Key used to store secret property value in Azure Key Vault.
27+
* @param {string} specOptions.projectId - Id of the gcp project, if not passed, this will be fetched from the client auth
28+
* @param {string} keyOptions.version - If version is passed then fetch that version, else fetch the latest version
2129
* @returns {Promise} Promise object representing secret property value.
2230
*/
23-
async _get ({ key, keyOptions }) {
24-
this._logger.info(`fetching secret ${key} from GCP Secret Manager`)
31+
async _get ({ key, keyOptions, specOptions: { projectId } }) {
32+
if (!projectId) {
33+
// get the project id from client
34+
projectId = this._getProjectId()
35+
}
36+
37+
let secretVersion
38+
if (!keyOptions || !keyOptions.version) {
39+
// get the latest version
40+
secretVersion = 'latest'
41+
} else {
42+
secretVersion = keyOptions.version
43+
}
44+
45+
this._logger.info(`fetching secret ${key} from GCP Secret for project ${projectId} with version ${secretVersion}`)
46+
2547
const version = await this._client.accessSecretVersion({
26-
name: key
48+
name: 'projects/' + projectId + '/secrets/' + key + '/versions/' + secretVersion
2749
})
2850
const secret = { value: version[0].payload.data.toString('utf8') }
2951
// Handle binary files - this is useful when you've stored a base64 encoded string

lib/backends/gcp-secrets-manager-backend.test.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,18 @@ describe('GCPSecretsManagerBackend', () => {
2424
logger: loggerMock,
2525
client: clientMock
2626
})
27+
28+
gcpSecretsManagerBackend._getProjectId = sinon.stub().returns('111122223333')
2729
})
2830

2931
describe('_get', () => {
3032
it('returns secret property value', async () => {
3133
const secretPropertyValue = await gcpSecretsManagerBackend._get({
32-
key: key
34+
key: key,
35+
keyOptions: { version: 1 },
36+
specOptions: {
37+
projectId: '111122223333'
38+
}
3339
})
3440
expect(secretPropertyValue).equals(secret)
3541
})

package-lock.json

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)