11import { Construct } from 'constructs' ;
22import { BackendSecretFetcherProviderFactory } from './backend_secret_fetcher_provider_factory.js' ;
3- import { CustomResource } from 'aws-cdk-lib' ;
3+ import { CustomResource , CustomResourceProps , Lazy } from 'aws-cdk-lib' ;
44import { BackendIdentifier } from '@aws-amplify/plugin-types' ;
55import { SecretResourceProps } from './lambda/backend_secret_fetcher_types.js' ;
66
@@ -9,6 +9,25 @@ import { SecretResourceProps } from './lambda/backend_secret_fetcher_types.js';
99 */
1010export 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 */
2039export 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}
0 commit comments