Skip to content

Commit 0faa76a

Browse files
committed
chore: refactor changes
1 parent ac67ec4 commit 0faa76a

File tree

4 files changed

+58
-56
lines changed

4 files changed

+58
-56
lines changed

packages/backend/src/engine/backend-secret/backend_secret.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ export class CfnTokenBackendSecret implements BackendSecret {
1818
constructor(
1919
private readonly secretName: string,
2020
private readonly secretResourceFactory: BackendSecretFetcherFactory
21-
) {
22-
BackendSecretFetcherFactory.registerSecret(secretName);
23-
}
21+
) {}
2422
/**
2523
* Get a reference to the value within a CDK scope.
2624
*/
@@ -30,7 +28,8 @@ export class CfnTokenBackendSecret implements BackendSecret {
3028
): SecretValue => {
3129
const secretResource = this.secretResourceFactory.getOrCreate(
3230
scope,
33-
backendIdentifier
31+
backendIdentifier,
32+
this.secretName
3433
);
3534

3635
const val = secretResource.getAttString(`${this.secretName}`);

packages/backend/src/engine/backend-secret/backend_secret_fetcher_factory.test.ts

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { App, Stack } from 'aws-cdk-lib';
2-
import { beforeEach, describe, it } from 'node:test';
2+
import { describe, it } from 'node:test';
33
import { BackendSecretFetcherProviderFactory } from './backend_secret_fetcher_provider_factory.js';
44
import { Template } from 'aws-cdk-lib/assertions';
55
import assert from 'node:assert';
@@ -22,20 +22,14 @@ const backendId: BackendIdentifier = {
2222
};
2323

2424
void describe('getOrCreate', () => {
25-
const providerFactory = new BackendSecretFetcherProviderFactory();
26-
const resourceFactory = new BackendSecretFetcherFactory(providerFactory);
27-
28-
beforeEach(() => {
29-
BackendSecretFetcherFactory.clearRegisteredSecrets();
30-
});
31-
3225
void it('create different secrets', () => {
3326
const app = new App();
3427
const stack = new Stack(app);
28+
const providerFactory = new BackendSecretFetcherProviderFactory();
29+
const resourceFactory = new BackendSecretFetcherFactory(providerFactory);
3530
stack.node.setContext('secretLastUpdated', secretLastUpdated);
36-
BackendSecretFetcherFactory.registerSecret(secretName1);
37-
BackendSecretFetcherFactory.registerSecret(secretName2);
38-
resourceFactory.getOrCreate(stack, backendId);
31+
resourceFactory.getOrCreate(stack, backendId, secretName1);
32+
resourceFactory.getOrCreate(stack, backendId, secretName2);
3933

4034
const template = Template.fromStack(stack);
4135
// only one custom resource is created that fetches all secrets
@@ -64,18 +58,12 @@ void describe('getOrCreate', () => {
6458
void it('does not create duplicate resource for the same secret name', () => {
6559
const app = new App();
6660
const stack = new Stack(app);
67-
// ensure only 1 secret name is registered if they are duplicates
68-
BackendSecretFetcherFactory.registerSecret(secretName1);
69-
BackendSecretFetcherFactory.registerSecret(secretName1);
70-
assert.equal(BackendSecretFetcherFactory.secretNames.size, 1);
71-
assert.equal(
72-
Array.from(BackendSecretFetcherFactory.secretNames)[0],
73-
secretName1
74-
);
61+
const providerFactory = new BackendSecretFetcherProviderFactory();
62+
const resourceFactory = new BackendSecretFetcherFactory(providerFactory);
7563

7664
// ensure only 1 resource is created even if this is called twice
77-
resourceFactory.getOrCreate(stack, backendId);
78-
resourceFactory.getOrCreate(stack, backendId);
65+
resourceFactory.getOrCreate(stack, backendId, secretName1);
66+
resourceFactory.getOrCreate(stack, backendId, secretName1);
7967

8068
const template = Template.fromStack(stack);
8169
template.resourceCountIs(secretResourceType, 1);
Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Construct } from 'constructs';
22
import { BackendSecretFetcherProviderFactory } from './backend_secret_fetcher_provider_factory.js';
3-
import { CustomResource } from 'aws-cdk-lib';
3+
import { CustomResource, CustomResourceProps, Lazy } from 'aws-cdk-lib';
44
import { BackendIdentifier } from '@aws-amplify/plugin-types';
55
import { SecretResourceProps } from './lambda/backend_secret_fetcher_types.js';
66

@@ -9,6 +9,25 @@ import { SecretResourceProps } from './lambda/backend_secret_fetcher_types.js';
99
*/
1010
export const SECRET_RESOURCE_PROVIDER_ID = 'SecretFetcherResourceProvider';
1111

12+
class SecretFetcherCustomResource extends CustomResource {
13+
private secrets: Set<string>;
14+
constructor(
15+
scope: Construct,
16+
id: string,
17+
props: CustomResourceProps,
18+
secrets: Set<string>
19+
) {
20+
super(scope, id, {
21+
...props,
22+
});
23+
this.secrets = secrets;
24+
}
25+
26+
public addSecret = (secretName: string) => {
27+
this.secrets.add(secretName);
28+
};
29+
}
30+
1231
/**
1332
* Type of the backend custom CFN resource.
1433
*/
@@ -18,46 +37,33 @@ const SECRET_RESOURCE_TYPE = `Custom::SecretFetcherResource`;
1837
* The factory to create backend secret-fetcher resource.
1938
*/
2039
export class BackendSecretFetcherFactory {
21-
static secretNames: Set<string> = new Set<string>();
22-
2340
/**
2441
* Creates a backend secret-fetcher resource factory.
2542
*/
2643
constructor(
27-
private readonly secretProviderFactory: BackendSecretFetcherProviderFactory
44+
private secretProviderFactory: BackendSecretFetcherProviderFactory
2845
) {}
2946

30-
/**
31-
* Register secrets that to be fetched by the BackendSecretFetcher custom resource.\
32-
* @param secretName the name of the secret
33-
*/
34-
static registerSecret = (secretName: string): void => {
35-
BackendSecretFetcherFactory.secretNames.add(secretName);
36-
};
37-
38-
/**
39-
* Clear registered secrets that will be fetched by the BackendSecretFetcher custom resource.
40-
*/
41-
static clearRegisteredSecrets = (): void => {
42-
BackendSecretFetcherFactory.secretNames.clear();
43-
};
44-
4547
/**
4648
* Returns a resource if it exists in the input scope. Otherwise,
4749
* creates a new one.
4850
*/
4951
getOrCreate = (
5052
scope: Construct,
51-
backendIdentifier: BackendIdentifier
52-
): CustomResource => {
53+
backendIdentifier: BackendIdentifier,
54+
secretName: string
55+
): SecretFetcherCustomResource => {
5356
const secretResourceId = `SecretFetcherResource`;
5457
const existingResource = scope.node.tryFindChild(
5558
secretResourceId
56-
) as CustomResource;
59+
) as SecretFetcherCustomResource;
5760

5861
if (existingResource) {
62+
existingResource.addSecret(secretName);
5963
return existingResource;
6064
}
65+
const secrets: Set<string> = new Set();
66+
secrets.add(secretName);
6167

6268
const provider = this.secretProviderFactory.getOrCreateInstance(
6369
scope,
@@ -75,16 +81,25 @@ export class BackendSecretFetcherFactory {
7581
namespace: backendIdentifier.namespace,
7682
name: backendIdentifier.name,
7783
type: backendIdentifier.type,
78-
secretNames: Array.from(BackendSecretFetcherFactory.secretNames),
84+
secretNames: Lazy.list({
85+
produce: () => {
86+
return Array.from(secrets);
87+
},
88+
}),
7989
};
8090

81-
return new CustomResource(scope, secretResourceId, {
82-
serviceToken: provider.serviceToken,
83-
properties: {
84-
...customResourceProps,
85-
secretLastUpdated, // this property is only to trigger resource update event.
91+
return new SecretFetcherCustomResource(
92+
scope,
93+
secretResourceId,
94+
{
95+
serviceToken: provider.serviceToken,
96+
properties: {
97+
...customResourceProps,
98+
secretLastUpdated, // this property is only to trigger resource update event.
99+
},
100+
resourceType: SECRET_RESOURCE_TYPE,
86101
},
87-
resourceType: SECRET_RESOURCE_TYPE,
88-
});
102+
secrets
103+
);
89104
};
90105
}

packages/backend/src/secret.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { BackendSecret } from '@aws-amplify/plugin-types';
22
import { CfnTokenBackendSecret } from './engine/backend-secret/backend_secret.js';
3-
import { BackendSecretFetcherProviderFactory } from './engine/backend-secret/backend_secret_fetcher_provider_factory.js';
43
import { BackendSecretFetcherFactory } from './engine/backend-secret/backend_secret_fetcher_factory.js';
4+
import { BackendSecretFetcherProviderFactory } from './engine/backend-secret/backend_secret_fetcher_provider_factory.js';
55

66
/**
77
* Use a secret from AWS Systems Manager (SSM) Parameter Store

0 commit comments

Comments
 (0)