Skip to content

Commit 5eba149

Browse files
author
Alexander Schueren
authored
chore(parameters): apply UA to AWS SDK clients used by Parameters (#1577)
* add user agent to appconfig parameters * add user agent to dynamodb provider * add user agent to secrets provider * add user agent to ssm provider
1 parent bba1c01 commit 5eba149

File tree

8 files changed

+92
-1
lines changed

8 files changed

+92
-1
lines changed

packages/parameters/src/appconfig/AppConfigProvider.ts

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type {
1010
AppConfigGetOptions,
1111
AppConfigGetOutput,
1212
} from '../types/AppConfigProvider';
13+
import { addUserAgentMiddleware } from '@aws-lambda-powertools/commons';
1314

1415
/**
1516
* ## Intro
@@ -210,6 +211,8 @@ class AppConfigProvider extends BaseProvider {
210211
this.client = new AppConfigDataClient(options.clientConfig || {});
211212
}
212213

214+
addUserAgentMiddleware(this.client, 'parameters');
215+
213216
this.application =
214217
options?.application || this.envVarsService.getServiceName();
215218
if (!this.application || this.application.trim().length === 0) {

packages/parameters/src/dynamodb/DynamoDBProvider.ts

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import type {
1818
} from '@aws-sdk/client-dynamodb';
1919
import type { PaginationConfiguration } from '@aws-sdk/types';
2020
import type { JSONValue } from '@aws-lambda-powertools/commons';
21+
import { addUserAgentMiddleware } from '@aws-lambda-powertools/commons';
2122

2223
/**
2324
* ## Intro
@@ -266,6 +267,8 @@ class DynamoDBProvider extends BaseProvider {
266267
this.client = new DynamoDBClient(clientConfig);
267268
}
268269

270+
addUserAgentMiddleware(this.client, 'parameters');
271+
269272
this.tableName = config.tableName;
270273
if (config.keyAttr) this.keyAttr = config.keyAttr;
271274
if (config.sortAttr) this.sortAttr = config.sortAttr;

packages/parameters/src/secrets/SecretsProvider.ts

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import type {
99
SecretsGetOptions,
1010
SecretsGetOutput,
1111
} from '../types/SecretsProvider';
12+
import { addUserAgentMiddleware } from '@aws-lambda-powertools/commons';
1213

1314
/**
1415
* ## Intro
@@ -171,6 +172,8 @@ class SecretsProvider extends BaseProvider {
171172
const clientConfig = config?.clientConfig || {};
172173
this.client = new SecretsManagerClient(clientConfig);
173174
}
175+
176+
addUserAgentMiddleware(this.client, 'parameters');
174177
}
175178

176179
/**

packages/parameters/src/ssm/SSMProvider.ts

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import type {
2727
SSMGetParametersByNameFromCacheOutputType,
2828
} from '../types/SSMProvider';
2929
import type { PaginationConfiguration } from '@aws-sdk/types';
30+
import { addUserAgentMiddleware } from '@aws-lambda-powertools/commons';
3031

3132
/**
3233
* ## Intro
@@ -290,6 +291,8 @@ class SSMProvider extends BaseProvider {
290291
const clientConfig = config?.clientConfig || {};
291292
this.client = new SSMClient(clientConfig);
292293
}
294+
295+
addUserAgentMiddleware(this.client, 'parameters');
293296
}
294297

295298
/**

packages/parameters/tests/unit/AppConfigProvider.test.ts

+24-1
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import { ExpirableValue } from '../../src/base/ExpirableValue';
88
import { AppConfigProviderOptions } from '../../src/types/AppConfigProvider';
99
import {
1010
AppConfigDataClient,
11-
StartConfigurationSessionCommand,
1211
GetLatestConfigurationCommand,
12+
StartConfigurationSessionCommand,
1313
} from '@aws-sdk/client-appconfigdata';
1414
import { Uint8ArrayBlobAdapter } from '@aws-sdk/util-stream';
1515
import { mockClient } from 'aws-sdk-client-mock';
16+
import * as UserAgentMiddleware from '@aws-lambda-powertools/commons/lib/userAgentMiddleware';
1617
import 'aws-sdk-client-mock-jest';
1718

1819
describe('Class: AppConfigProvider', () => {
@@ -34,6 +35,11 @@ describe('Class: AppConfigProvider', () => {
3435
environment: 'MyAppProdEnv',
3536
};
3637

38+
const userAgentSpy = jest.spyOn(
39+
UserAgentMiddleware,
40+
'addUserAgentMiddleware'
41+
);
42+
3743
// Act
3844
const provider = new AppConfigProvider(options);
3945

@@ -43,6 +49,8 @@ describe('Class: AppConfigProvider', () => {
4349
serviceId: 'AppConfigData',
4450
})
4551
);
52+
53+
expect(userAgentSpy).toHaveBeenCalled();
4654
});
4755

4856
test('when the user provides a client config in the options, the class instantiates a new client with client config options', async () => {
@@ -55,6 +63,11 @@ describe('Class: AppConfigProvider', () => {
5563
},
5664
};
5765

66+
const userAgentSpy = jest.spyOn(
67+
UserAgentMiddleware,
68+
'addUserAgentMiddleware'
69+
);
70+
5871
// Act
5972
const provider = new AppConfigProvider(options);
6073

@@ -64,6 +77,8 @@ describe('Class: AppConfigProvider', () => {
6477
serviceId: 'with-client-config',
6578
})
6679
);
80+
81+
expect(userAgentSpy).toHaveBeenCalled();
6782
});
6883

6984
test('when the user provides an SDK client in the options, the class instantiates with it', async () => {
@@ -78,6 +93,11 @@ describe('Class: AppConfigProvider', () => {
7893
awsSdkV3Client: awsSdkV3Client,
7994
};
8095

96+
const userAgentSpy = jest.spyOn(
97+
UserAgentMiddleware,
98+
'addUserAgentMiddleware'
99+
);
100+
81101
// Act
82102
const provider = new AppConfigProvider(options);
83103

@@ -87,6 +107,8 @@ describe('Class: AppConfigProvider', () => {
87107
serviceId: 'with-custom-sdk-client',
88108
})
89109
);
110+
111+
expect(userAgentSpy).toHaveBeenCalledWith(awsSdkV3Client, 'parameters');
90112
});
91113

92114
test('when the user provides NOT an SDK client in the options, it throws an error', async () => {
@@ -187,6 +209,7 @@ describe('Class: AppConfigProvider', () => {
187209
public _addToStore(key: string, value: string): void {
188210
this.configurationTokenStore.set(key, value);
189211
}
212+
190213
public _storeHas(key: string): boolean {
191214
return this.configurationTokenStore.has(key);
192215
}

packages/parameters/tests/unit/DynamoDBProvider.test.ts

+21
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type {
1515
} from '@aws-sdk/client-dynamodb';
1616
import type { DynamoDBProviderOptions } from '../../src/types/DynamoDBProvider';
1717
import { marshall } from '@aws-sdk/util-dynamodb';
18+
import * as UserAgentMiddleware from '@aws-lambda-powertools/commons/lib/userAgentMiddleware';
1819
import { mockClient } from 'aws-sdk-client-mock';
1920
import 'aws-sdk-client-mock-jest';
2021

@@ -30,6 +31,11 @@ describe('Class: DynamoDBProvider', () => {
3031
tableName: 'test-table',
3132
};
3233

34+
const userAgentSpy = jest.spyOn(
35+
UserAgentMiddleware,
36+
'addUserAgentMiddleware'
37+
);
38+
3339
// Act
3440
const provider = new DynamoDBProvider(options);
3541

@@ -39,6 +45,8 @@ describe('Class: DynamoDBProvider', () => {
3945
serviceId: 'DynamoDB',
4046
})
4147
);
48+
49+
expect(userAgentSpy).toHaveBeenCalled();
4250
});
4351

4452
test('when the user provides a client config in the options, the class instantiates a new client with client config options', async () => {
@@ -50,6 +58,11 @@ describe('Class: DynamoDBProvider', () => {
5058
},
5159
};
5260

61+
const userAgentSpy = jest.spyOn(
62+
UserAgentMiddleware,
63+
'addUserAgentMiddleware'
64+
);
65+
5366
// Act
5467
const provider = new DynamoDBProvider(options);
5568

@@ -59,6 +72,8 @@ describe('Class: DynamoDBProvider', () => {
5972
serviceId: 'with-client-config',
6073
})
6174
);
75+
76+
expect(userAgentSpy).toHaveBeenCalled();
6277
});
6378

6479
test('when the user provides an SDK client in the options, the class instantiates with it', async () => {
@@ -67,6 +82,11 @@ describe('Class: DynamoDBProvider', () => {
6782
serviceId: 'with-custom-sdk-client',
6883
});
6984

85+
const userAgentSpy = jest.spyOn(
86+
UserAgentMiddleware,
87+
'addUserAgentMiddleware'
88+
);
89+
7090
const options: DynamoDBProviderOptions = {
7191
tableName: 'test-table',
7292
awsSdkV3Client: awsSdkV3Client,
@@ -81,6 +101,7 @@ describe('Class: DynamoDBProvider', () => {
81101
serviceId: 'with-custom-sdk-client',
82102
})
83103
);
104+
expect(userAgentSpy).toHaveBeenCalledWith(awsSdkV3Client, 'parameters');
84105
});
85106

86107
test('when the user provides NOT an SDK client in the options, it throws an error', async () => {

packages/parameters/tests/unit/SSMProvider.test.ts

+16
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import type {
2222
} from '../../src/types/SSMProvider';
2323
import { ExpirableValue } from '../../src/base/ExpirableValue';
2424
import { toBase64 } from '@aws-sdk/util-base64';
25+
import * as UserAgentMiddleware from '@aws-lambda-powertools/commons/lib/userAgentMiddleware';
2526

2627
const encoder = new TextEncoder();
2728

@@ -37,6 +38,10 @@ describe('Class: SSMProvider', () => {
3738
test('when the class instantiates without SDK client and client config it has default options', async () => {
3839
// Prepare
3940
const options: SSMProviderOptions = {};
41+
const userAgentSpy = jest.spyOn(
42+
UserAgentMiddleware,
43+
'addUserAgentMiddleware'
44+
);
4045

4146
// Act
4247
const provider = new SSMProvider(options);
@@ -47,6 +52,7 @@ describe('Class: SSMProvider', () => {
4752
serviceId: 'SSM',
4853
})
4954
);
55+
expect(userAgentSpy).toHaveBeenCalled();
5056
});
5157

5258
test('when the user provides a client config in the options, the class instantiates a new client with client config options', async () => {
@@ -56,6 +62,10 @@ describe('Class: SSMProvider', () => {
5662
serviceId: 'with-client-config',
5763
},
5864
};
65+
const userAgentSpy = jest.spyOn(
66+
UserAgentMiddleware,
67+
'addUserAgentMiddleware'
68+
);
5969

6070
// Act
6171
const provider = new SSMProvider(options);
@@ -66,6 +76,7 @@ describe('Class: SSMProvider', () => {
6676
serviceId: 'with-client-config',
6777
})
6878
);
79+
expect(userAgentSpy).toHaveBeenCalled();
6980
});
7081

7182
test('when the user provides an SDK client in the options, the class instantiates with it', async () => {
@@ -77,6 +88,10 @@ describe('Class: SSMProvider', () => {
7788
const options: SSMProviderOptions = {
7889
awsSdkV3Client: awsSdkV3Client,
7990
};
91+
const userAgentSpy = jest.spyOn(
92+
UserAgentMiddleware,
93+
'addUserAgentMiddleware'
94+
);
8095

8196
// Act
8297
const provider = new SSMProvider(options);
@@ -87,6 +102,7 @@ describe('Class: SSMProvider', () => {
87102
serviceId: 'with-custom-sdk-client',
88103
})
89104
);
105+
expect(userAgentSpy).toHaveBeenCalledWith(awsSdkV3Client, 'parameters');
90106
});
91107

92108
test('when the user provides NOT an SDK client in the options, it throws an error', async () => {

packages/parameters/tests/unit/SecretsProvider.test.ts

+19
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type { GetSecretValueCommandInput } from '@aws-sdk/client-secrets-manager
1212
import type { SecretsProviderOptions } from '../../src/types/SecretsProvider';
1313
import { mockClient } from 'aws-sdk-client-mock';
1414
import 'aws-sdk-client-mock-jest';
15+
import * as UserAgentMiddleware from '@aws-lambda-powertools/commons/lib/userAgentMiddleware';
1516

1617
const encoder = new TextEncoder();
1718

@@ -27,6 +28,11 @@ describe('Class: SecretsProvider', () => {
2728
// Prepare
2829
const options: SecretsProviderOptions = {};
2930

31+
const userAgentSpy = jest.spyOn(
32+
UserAgentMiddleware,
33+
'addUserAgentMiddleware'
34+
);
35+
3036
// Act
3137
const provider = new SecretsProvider(options);
3238

@@ -36,6 +42,7 @@ describe('Class: SecretsProvider', () => {
3642
serviceId: 'Secrets Manager',
3743
})
3844
);
45+
expect(userAgentSpy).toHaveBeenCalled();
3946
});
4047

4148
test('when the user provides a client config in the options, the class instantiates a new client with client config options', async () => {
@@ -46,6 +53,11 @@ describe('Class: SecretsProvider', () => {
4653
},
4754
};
4855

56+
const userAgentSpy = jest.spyOn(
57+
UserAgentMiddleware,
58+
'addUserAgentMiddleware'
59+
);
60+
4961
// Act
5062
const provider = new SecretsProvider(options);
5163

@@ -55,6 +67,7 @@ describe('Class: SecretsProvider', () => {
5567
serviceId: 'with-client-config',
5668
})
5769
);
70+
expect(userAgentSpy).toHaveBeenCalled();
5871
});
5972

6073
test('when the user provides an SDK client in the options, the class instantiates with it', async () => {
@@ -67,6 +80,11 @@ describe('Class: SecretsProvider', () => {
6780
awsSdkV3Client: awsSdkV3Client,
6881
};
6982

83+
const userAgentSpy = jest.spyOn(
84+
UserAgentMiddleware,
85+
'addUserAgentMiddleware'
86+
);
87+
7088
// Act
7189
const provider = new SecretsProvider(options);
7290

@@ -76,6 +94,7 @@ describe('Class: SecretsProvider', () => {
7694
serviceId: 'with-custom-sdk-client',
7795
})
7896
);
97+
expect(userAgentSpy).toHaveBeenCalledWith(awsSdkV3Client, 'parameters');
7998
});
8099

81100
test('when the user provides NOT an SDK client in the options, it throws an error', async () => {

0 commit comments

Comments
 (0)