Skip to content

Commit 55703e4

Browse files
authored
Merge branch 'main' into release-please--branches--main
2 parents 67eca17 + fef864f commit 55703e4

File tree

5 files changed

+107
-42
lines changed

5 files changed

+107
-42
lines changed

docs/configuration.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ To be able to support a number of use-cases, the module has quite a lot of confi
1919

2020
The module uses the AWS System Manager Parameter Store to store configuration for the runners, as well as registration tokens and secrets for the Lambdas. Paths for the parameters can be configured via the variable `ssm_paths`. The location of the configuration parameters is retrieved by the runners via the instance tag `ghr:ssm_config_path`. The following default paths will be used. Tokens or JIT config stored in the token path will be deleted after retrieval by instance, data not deleted after a day will be deleted by a SSM housekeeper lambda.
2121

22+
Furthermore, to accommodate larger JIT configurations or other stored values, the module implements automatic tier selection for SSM parameters:
23+
24+
- **Parameter Tiering**: If the size of a parameter's value exceeds 4KB (specifically, 4000 bytes), the module will automatically use the 'Advanced' tier for that SSM parameter. Values smaller than this threshold will use the 'Standard' tier.
25+
- **Cost Implications**: While the 'Standard' tier is generally free for a certain number of parameters and operations, the 'Advanced' tier incurs costs. These costs are typically pro-rated per hour for each parameter stored using the Advanced tier. For detailed and up-to-date pricing, please refer to the [AWS Systems Manager Pricing page](https://aws.amazon.com/systems-manager/pricing/#Parameter_Store).
26+
- **Housekeeping Recommendation**: The last sentence of the "AWS SSM Parameters" section already mentions that "data not deleted after a day will be deleted by a SSM housekeeper lambda." It is crucial to ensure this or a similar housekeeping mechanism is active and correctly configured, especially considering the potential costs associated with 'Advanced' tier parameters. This utility should identify and delete any orphaned parameters to help manage costs and maintain a clean SSM environment.
27+
2228
| Path | Description |
2329
| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2430
| `ssm_paths.root/var.prefix?/app/` | App secrets used by Lambda's |

lambdas/libs/aws-ssm-util/src/index.test.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'aws-sdk-client-mock-jest/vitest';
99
import { mockClient } from 'aws-sdk-client-mock';
1010
import nock from 'nock';
1111

12-
import { getParameter, putParameter } from '.';
12+
import { getParameter, putParameter, SSM_ADVANCED_TIER_THRESHOLD } from '.';
1313
import { describe, it, expect, beforeEach, vi } from 'vitest';
1414

1515
const mockSSMClient = mockClient(SSMClient);
@@ -139,4 +139,30 @@ describe('Test getParameter and putParameter', () => {
139139
// Act
140140
await expect(getParameter(parameterName)).rejects.toThrow(`Parameter ${parameterName} not found`);
141141
});
142+
143+
it.each([
144+
['a'.repeat(SSM_ADVANCED_TIER_THRESHOLD - 1), 'Standard'],
145+
['a'.repeat(SSM_ADVANCED_TIER_THRESHOLD), 'Advanced'],
146+
['a'.repeat(SSM_ADVANCED_TIER_THRESHOLD + 1), 'Advanced'],
147+
])('Puts parameters with value and sets correct SSM tier based on size and threshold', async (data, expectedTier) => {
148+
// Arrange
149+
const parameterValue = data;
150+
const parameterName = 'testParamSmall';
151+
const secure = false;
152+
const output: PutParameterCommandOutput = {
153+
$metadata: { httpStatusCode: 200 },
154+
};
155+
mockSSMClient.on(PutParameterCommand).resolves(output);
156+
157+
// Act
158+
await putParameter(parameterName, parameterValue, secure);
159+
160+
// Assert
161+
expect(mockSSMClient).toHaveReceivedCommandWith(PutParameterCommand, {
162+
Name: parameterName,
163+
Value: parameterValue,
164+
Type: 'String',
165+
Tier: expectedTier,
166+
});
167+
});
142168
});

lambdas/libs/aws-ssm-util/src/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,26 @@ export async function getParameter(parameter_name: string): Promise<string> {
1717
return result;
1818
}
1919

20+
export const SSM_ADVANCED_TIER_THRESHOLD = 4000;
21+
2022
export async function putParameter(
2123
parameter_name: string,
2224
parameter_value: string,
2325
secure: boolean,
2426
options: { tags?: Tag[] } = {},
2527
): Promise<void> {
2628
const client = getTracedAWSV3Client(new SSMClient({ region: process.env.AWS_REGION }));
29+
30+
// Determine tier based on parameter_value size
31+
const valueSizeBytes = Buffer.byteLength(parameter_value, 'utf8');
32+
2733
await client.send(
2834
new PutParameterCommand({
2935
Name: parameter_name,
3036
Value: parameter_value,
3137
Type: secure ? 'SecureString' : 'String',
3238
Tags: options.tags,
39+
Tier: valueSizeBytes >= SSM_ADVANCED_TIER_THRESHOLD ? 'Advanced' : 'Standard',
3340
}),
3441
);
3542
}

lambdas/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
"@typescript-eslint/parser": "^8.31.0",
3434
"@vitest/coverage-v8": "^3.0.8",
3535
"chalk": "^5.4.1",
36-
"eslint": "^9.27.0",
37-
"eslint-plugin-prettier": "5.4.0",
36+
"eslint": "^9.29.0",
37+
"eslint-plugin-prettier": "5.4.1",
3838
"nx": "20.6.4",
3939
"prettier": "^3.5.3",
4040
"ts-node": "^10.9.2",

lambdas/yarn.lock

Lines changed: 65 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2985,14 +2985,14 @@ __metadata:
29852985
languageName: node
29862986
linkType: hard
29872987

2988-
"@eslint/config-array@npm:^0.20.0":
2989-
version: 0.20.0
2990-
resolution: "@eslint/config-array@npm:0.20.0"
2988+
"@eslint/config-array@npm:^0.20.1":
2989+
version: 0.20.1
2990+
resolution: "@eslint/config-array@npm:0.20.1"
29912991
dependencies:
29922992
"@eslint/object-schema": "npm:^2.1.6"
29932993
debug: "npm:^4.3.1"
29942994
minimatch: "npm:^3.1.2"
2995-
checksum: 10c0/94bc5d0abb96dc5295ff559925242ff75a54eacfb3576677e95917e42f7175e1c4b87bf039aa2a872f949b4852ad9724bf2f7529aaea6b98f28bb3fca7f1d659
2995+
checksum: 10c0/709108c3925d83c2166024646829ab61ba5fa85c6568daefd32508899f46ed8dc36d7153042df6dcc7e58ad543bc93298b646575daecb5eb4e39a43d838dab42
29962996
languageName: node
29972997
linkType: hard
29982998

@@ -3029,10 +3029,10 @@ __metadata:
30293029
languageName: node
30303030
linkType: hard
30313031

3032-
"@eslint/js@npm:9.27.0":
3033-
version: 9.27.0
3034-
resolution: "@eslint/js@npm:9.27.0"
3035-
checksum: 10c0/79b219ceda79182732954b52f7a494f49995a9a6419c7ae0316866e324d3706afeb857e1306bb6f35a4caaf176a5174d00228fc93d36781a570d32c587736564
3032+
"@eslint/js@npm:9.29.0":
3033+
version: 9.29.0
3034+
resolution: "@eslint/js@npm:9.29.0"
3035+
checksum: 10c0/d0ccf37063fa27a3fae9347cb044f84ca10b5a2fa19ffb2b3fedf3b96843ac1ff359ea9f0ab0e80f2f16fda4cb0dc61ea0fed0375090f050fe0a029e7d6de3a3
30363036
languageName: node
30373037
linkType: hard
30383038

@@ -3954,10 +3954,10 @@ __metadata:
39543954
languageName: node
39553955
linkType: hard
39563956

3957-
"@pkgr/core@npm:^0.2.3":
3958-
version: 0.2.4
3959-
resolution: "@pkgr/core@npm:0.2.4"
3960-
checksum: 10c0/2528a443bbbef5d4686614e1d73f834f19ccbc975f62b2a64974a6b97bcdf677b9c5e8948e04808ac4f0d853e2f422adfaae2a06e9e9f4f5cf8af76f1adf8dc1
3957+
"@pkgr/core@npm:^0.2.4":
3958+
version: 0.2.7
3959+
resolution: "@pkgr/core@npm:0.2.7"
3960+
checksum: 10c0/951f5ebf2feb6e9dbc202d937f1a364d60f2bf0e3e53594251bcc1d9d2ed0df0a919c49ba162a9499fce73cf46ebe4d7959a8dfbac03511dbe79b69f5fedb804
39613961
languageName: node
39623962
linkType: hard
39633963

@@ -5833,6 +5833,15 @@ __metadata:
58335833
languageName: node
58345834
linkType: hard
58355835

5836+
"acorn@npm:^8.15.0":
5837+
version: 8.15.0
5838+
resolution: "acorn@npm:8.15.0"
5839+
bin:
5840+
acorn: bin/acorn
5841+
checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec
5842+
languageName: node
5843+
linkType: hard
5844+
58365845
"acorn@npm:^8.4.1":
58375846
version: 8.12.1
58385847
resolution: "acorn@npm:8.12.1"
@@ -7208,12 +7217,12 @@ __metadata:
72087217
languageName: node
72097218
linkType: hard
72107219

7211-
"eslint-plugin-prettier@npm:5.4.0":
7212-
version: 5.4.0
7213-
resolution: "eslint-plugin-prettier@npm:5.4.0"
7220+
"eslint-plugin-prettier@npm:5.4.1":
7221+
version: 5.4.1
7222+
resolution: "eslint-plugin-prettier@npm:5.4.1"
72147223
dependencies:
72157224
prettier-linter-helpers: "npm:^1.0.0"
7216-
synckit: "npm:^0.11.0"
7225+
synckit: "npm:^0.11.7"
72177226
peerDependencies:
72187227
"@types/eslint": ">=8.0.0"
72197228
eslint: ">=8.0.0"
@@ -7224,17 +7233,17 @@ __metadata:
72247233
optional: true
72257234
eslint-config-prettier:
72267235
optional: true
7227-
checksum: 10c0/50718d16266dfbe6909697f9d7c9188d2664f5be50fa1de4decc0c8236565570823fdf5973f89cd51254af5551b6160650e092716002a62aaa0f0b2c18e8fc3e
7236+
checksum: 10c0/bdd9e9473bf3f995521558eb5e2ee70dd4f06cb8b9a6192523cfed76511924fad31ec9af9807cd99f693dc59085e0a1db8a1d3ccc283e98ab30eb32cc7469649
72287237
languageName: node
72297238
linkType: hard
72307239

7231-
"eslint-scope@npm:^8.3.0":
7232-
version: 8.3.0
7233-
resolution: "eslint-scope@npm:8.3.0"
7240+
"eslint-scope@npm:^8.4.0":
7241+
version: 8.4.0
7242+
resolution: "eslint-scope@npm:8.4.0"
72347243
dependencies:
72357244
esrecurse: "npm:^4.3.0"
72367245
estraverse: "npm:^5.2.0"
7237-
checksum: 10c0/23bf54345573201fdf06d29efa345ab508b355492f6c6cc9e2b9f6d02b896f369b6dd5315205be94b8853809776c4d13353b85c6b531997b164ff6c3328ecf5b
7246+
checksum: 10c0/407f6c600204d0f3705bd557f81bd0189e69cd7996f408f8971ab5779c0af733d1af2f1412066b40ee1588b085874fc37a2333986c6521669cdbdd36ca5058e0
72387247
languageName: node
72397248
linkType: hard
72407249

@@ -7252,17 +7261,24 @@ __metadata:
72527261
languageName: node
72537262
linkType: hard
72547263

7255-
"eslint@npm:^9.27.0":
7256-
version: 9.27.0
7257-
resolution: "eslint@npm:9.27.0"
7264+
"eslint-visitor-keys@npm:^4.2.1":
7265+
version: 4.2.1
7266+
resolution: "eslint-visitor-keys@npm:4.2.1"
7267+
checksum: 10c0/fcd43999199d6740db26c58dbe0c2594623e31ca307e616ac05153c9272f12f1364f5a0b1917a8e962268fdecc6f3622c1c2908b4fcc2e047a106fe6de69dc43
7268+
languageName: node
7269+
linkType: hard
7270+
7271+
"eslint@npm:^9.29.0":
7272+
version: 9.29.0
7273+
resolution: "eslint@npm:9.29.0"
72587274
dependencies:
72597275
"@eslint-community/eslint-utils": "npm:^4.2.0"
72607276
"@eslint-community/regexpp": "npm:^4.12.1"
7261-
"@eslint/config-array": "npm:^0.20.0"
7277+
"@eslint/config-array": "npm:^0.20.1"
72627278
"@eslint/config-helpers": "npm:^0.2.1"
72637279
"@eslint/core": "npm:^0.14.0"
72647280
"@eslint/eslintrc": "npm:^3.3.1"
7265-
"@eslint/js": "npm:9.27.0"
7281+
"@eslint/js": "npm:9.29.0"
72667282
"@eslint/plugin-kit": "npm:^0.3.1"
72677283
"@humanfs/node": "npm:^0.16.6"
72687284
"@humanwhocodes/module-importer": "npm:^1.0.1"
@@ -7274,9 +7290,9 @@ __metadata:
72747290
cross-spawn: "npm:^7.0.6"
72757291
debug: "npm:^4.3.2"
72767292
escape-string-regexp: "npm:^4.0.0"
7277-
eslint-scope: "npm:^8.3.0"
7278-
eslint-visitor-keys: "npm:^4.2.0"
7279-
espree: "npm:^10.3.0"
7293+
eslint-scope: "npm:^8.4.0"
7294+
eslint-visitor-keys: "npm:^4.2.1"
7295+
espree: "npm:^10.4.0"
72807296
esquery: "npm:^1.5.0"
72817297
esutils: "npm:^2.0.2"
72827298
fast-deep-equal: "npm:^3.1.3"
@@ -7298,11 +7314,11 @@ __metadata:
72987314
optional: true
72997315
bin:
73007316
eslint: bin/eslint.js
7301-
checksum: 10c0/135d301e37cd961000a9c1d3f0e1863bed29a61435dfddedba3db295973193024382190fd8790a8de83777d10f450082a29eaee8bc9ce0fb1bc1f2b0bb882280
7317+
checksum: 10c0/75e3f841e0f8b0fa93dbb2ba6ae538bd8b611c3654117bc3dadf90bb009923dfd2c15ec2948dc6e6b8b571317cc125c5cceb9255da8cd644ee740020df645dd8
73027318
languageName: node
73037319
linkType: hard
73047320

7305-
"espree@npm:^10.0.1, espree@npm:^10.3.0":
7321+
"espree@npm:^10.0.1":
73067322
version: 10.3.0
73077323
resolution: "espree@npm:10.3.0"
73087324
dependencies:
@@ -7313,6 +7329,17 @@ __metadata:
73137329
languageName: node
73147330
linkType: hard
73157331

7332+
"espree@npm:^10.4.0":
7333+
version: 10.4.0
7334+
resolution: "espree@npm:10.4.0"
7335+
dependencies:
7336+
acorn: "npm:^8.15.0"
7337+
acorn-jsx: "npm:^5.3.2"
7338+
eslint-visitor-keys: "npm:^4.2.1"
7339+
checksum: 10c0/c63fe06131c26c8157b4083313cb02a9a54720a08e21543300e55288c40e06c3fc284bdecf108d3a1372c5934a0a88644c98714f38b6ae8ed272b40d9ea08d6b
7340+
languageName: node
7341+
linkType: hard
7342+
73167343
"esprima@npm:^4.0.0":
73177344
version: 4.0.1
73187345
resolution: "esprima@npm:4.0.1"
@@ -8738,8 +8765,8 @@ __metadata:
87388765
"@typescript-eslint/parser": "npm:^8.31.0"
87398766
"@vitest/coverage-v8": "npm:^3.0.8"
87408767
chalk: "npm:^5.4.1"
8741-
eslint: "npm:^9.27.0"
8742-
eslint-plugin-prettier: "npm:5.4.0"
8768+
eslint: "npm:^9.29.0"
8769+
eslint-plugin-prettier: "npm:5.4.1"
87438770
nx: "npm:20.6.4"
87448771
prettier: "npm:^3.5.3"
87458772
ts-node: "npm:^10.9.2"
@@ -10819,13 +10846,12 @@ __metadata:
1081910846
languageName: node
1082010847
linkType: hard
1082110848

10822-
"synckit@npm:^0.11.0":
10823-
version: 0.11.4
10824-
resolution: "synckit@npm:0.11.4"
10849+
"synckit@npm:^0.11.7":
10850+
version: 0.11.8
10851+
resolution: "synckit@npm:0.11.8"
1082510852
dependencies:
10826-
"@pkgr/core": "npm:^0.2.3"
10827-
tslib: "npm:^2.8.1"
10828-
checksum: 10c0/dd2965a37c93c0b652bf07b1fd8d1639a803b65cf34c0cb1b827b8403044fc3b09ec87f681d922a324825127ee95b2e0394e7caccb502f407892d63e903c5276
10853+
"@pkgr/core": "npm:^0.2.4"
10854+
checksum: 10c0/a1de5131ee527512afcaafceb2399b2f3e63678e56b831e1cb2dc7019c972a8b654703a3b94ef4166868f87eb984ea252b467c9d9e486b018ec2e6a55c24dfd8
1082910855
languageName: node
1083010856
linkType: hard
1083110857

0 commit comments

Comments
 (0)