Skip to content
This repository was archived by the owner on Jan 16, 2025. It is now read-only.

Commit 97d5c73

Browse files
fix(lambda): bump @aws-sdk/client-ssm from 3.321.1 to 3.350.0 in /lambdas (#3319)
* fix(lambda): bump @aws-sdk/client-ssm in /lambdas Bumps [@aws-sdk/client-ssm](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-ssm) from 3.321.1 to 3.350.0. - [Release notes](https://github.com/aws/aws-sdk-js-v3/releases) - [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-ssm/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.350.0/clients/client-ssm) --- updated-dependencies: - dependency-name: "@aws-sdk/client-ssm" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> * fix: dependabot updates. * fix: tests. --------- Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Navdeep Gupta <[email protected]>
1 parent d0e8960 commit 97d5c73

File tree

11 files changed

+815
-702
lines changed

11 files changed

+815
-702
lines changed

Diff for: lambdas/functions/control-plane/package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,13 @@
3838
"ts-node-dev": "^2.0.0"
3939
},
4040
"dependencies": {
41-
"@aws-sdk/client-ec2": "^3.303.0",
41+
"@aws-sdk/client-ec2": "^3.350.0",
42+
"@aws-sdk/types": "^3.347.0",
4243
"@octokit/auth-app": "4.0.13",
4344
"@octokit/rest": "^19.0.7",
4445
"@octokit/types": "^9.0.0",
45-
"@terraform-aws-github-runner/aws-ssm-util": "*",
4646
"@terraform-aws-github-runner/aws-powertools-util": "*",
47+
"@terraform-aws-github-runner/aws-ssm-util": "*",
4748
"cron-parser": "^4.8.1",
4849
"typescript": "^5.0.4"
4950
}

Diff for: lambdas/functions/control-plane/src/aws/runners.ts

+9-10
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import {
77
FleetLaunchTemplateOverridesRequest,
88
TerminateInstancesCommand,
99
} from '@aws-sdk/client-ec2';
10-
import { SSM } from '@aws-sdk/client-ssm';
1110
import { createChildLogger } from '@terraform-aws-github-runner/aws-powertools-util';
11+
import { getParameter, putParameter } from '@terraform-aws-github-runner/aws-ssm-util';
1212
import moment from 'moment';
1313

1414
import ScaleError from './../scale-runners/ScaleError';
@@ -138,14 +138,13 @@ export async function createRunner(runnerParameters: Runners.RunnerInputParamete
138138
},
139139
});
140140

141-
const ec2Clinnt = new EC2Client({ region: process.env.AWS_REGION });
142-
const ssmClient = new SSM({ region: process.env.AWS_REGION });
141+
const ec2Client = new EC2Client({ region: process.env.AWS_REGION });
143142

144143
let amiIdOverride = undefined;
145144

146145
if (runnerParameters.amiIdSsmParameterName) {
147146
try {
148-
amiIdOverride = (await ssmClient.getParameter({ Name: runnerParameters.amiIdSsmParameterName })).Parameter?.Value;
147+
amiIdOverride = await getParameter(runnerParameters.amiIdSsmParameterName);
149148
logger.debug(`AMI override SSM parameter (${runnerParameters.amiIdSsmParameterName}) set to: ${amiIdOverride}`);
150149
} catch (e) {
151150
logger.error(
@@ -197,7 +196,7 @@ export async function createRunner(runnerParameters: Runners.RunnerInputParamete
197196
],
198197
Type: 'instant',
199198
});
200-
fleet = await ec2Clinnt.send(createFleetCommand);
199+
fleet = await ec2Client.send(createFleetCommand);
201200
} catch (e) {
202201
logger.warn('Create fleet request failed.', { error: e as Error });
203202
throw e;
@@ -239,11 +238,11 @@ export async function createRunner(runnerParameters: Runners.RunnerInputParamete
239238
const isDelay = instances.length >= ssmParameterStoreMaxThroughput ? true : false;
240239

241240
for (const instance of instances) {
242-
await ssmClient.putParameter({
243-
Name: `${runnerParameters.ssmTokenPath}/${instance}`,
244-
Value: runnerParameters.runnerServiceConfig.join(' '),
245-
Type: 'SecureString',
246-
});
241+
await putParameter(
242+
`${runnerParameters.ssmTokenPath}/${instance}`,
243+
runnerParameters.runnerServiceConfig.join(' '),
244+
true,
245+
);
247246

248247
if (isDelay) {
249248
// Delay to prevent AWS ssm rate limits by being within the max throughput limit

Diff for: lambdas/functions/control-plane/src/gh-auth/gh-auth.test.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { createAppAuth } from '@octokit/auth-app';
22
import { StrategyOptions } from '@octokit/auth-app/dist-types/types';
33
import { request } from '@octokit/request';
44
import { RequestInterface } from '@octokit/types';
5-
import { getParameterValue } from '@terraform-aws-github-runner/aws-ssm-util';
5+
import { getParameter } from '@terraform-aws-github-runner/aws-ssm-util';
66
import { mocked } from 'jest-mock';
77
import { MockProxy, mock } from 'jest-mock-extended';
88
import nock from 'nock';
@@ -18,7 +18,7 @@ const GITHUB_APP_ID = '1';
1818
const PARAMETER_GITHUB_APP_ID_NAME = `/actions-runner/${ENVIRONMENT}/github_app_id`;
1919
const PARAMETER_GITHUB_APP_KEY_BASE64_NAME = `/actions-runner/${ENVIRONMENT}/github_app_key_base64`;
2020

21-
const mockedGet = mocked(getParameterValue);
21+
const mockedGet = mocked(getParameter);
2222

2323
beforeEach(() => {
2424
jest.resetModules();
@@ -117,8 +117,8 @@ ${decryptedValue}`,
117117
const result = await createGithubAppAuth(installationId);
118118

119119
// Assert
120-
expect(getParameterValue).toBeCalledWith(PARAMETER_GITHUB_APP_ID_NAME);
121-
expect(getParameterValue).toBeCalledWith(PARAMETER_GITHUB_APP_KEY_BASE64_NAME);
120+
expect(getParameter).toBeCalledWith(PARAMETER_GITHUB_APP_ID_NAME);
121+
expect(getParameter).toBeCalledWith(PARAMETER_GITHUB_APP_KEY_BASE64_NAME);
122122

123123
expect(mockedCreatAppAuth).toBeCalledTimes(1);
124124
expect(mockedCreatAppAuth).toBeCalledWith(authOptions);
@@ -154,8 +154,8 @@ ${decryptedValue}`,
154154
const result = await createGithubAppAuth(installationId, githubServerUrl);
155155

156156
// Assert
157-
expect(getParameterValue).toBeCalledWith(PARAMETER_GITHUB_APP_ID_NAME);
158-
expect(getParameterValue).toBeCalledWith(PARAMETER_GITHUB_APP_KEY_BASE64_NAME);
157+
expect(getParameter).toBeCalledWith(PARAMETER_GITHUB_APP_ID_NAME);
158+
expect(getParameter).toBeCalledWith(PARAMETER_GITHUB_APP_KEY_BASE64_NAME);
159159

160160
expect(mockedCreatAppAuth).toBeCalledTimes(1);
161161
expect(mockedCreatAppAuth).toBeCalledWith(authOptions);
@@ -191,8 +191,8 @@ ${decryptedValue}`,
191191
const result = await createGithubAppAuth(installationId, githubServerUrl);
192192

193193
// Assert
194-
expect(getParameterValue).toBeCalledWith(PARAMETER_GITHUB_APP_ID_NAME);
195-
expect(getParameterValue).toBeCalledWith(PARAMETER_GITHUB_APP_KEY_BASE64_NAME);
194+
expect(getParameter).toBeCalledWith(PARAMETER_GITHUB_APP_ID_NAME);
195+
expect(getParameter).toBeCalledWith(PARAMETER_GITHUB_APP_KEY_BASE64_NAME);
196196

197197
expect(mockedCreatAppAuth).toBeCalledTimes(1);
198198
expect(mockedCreatAppAuth).toBeCalledWith(authOptions);

Diff for: lambdas/functions/control-plane/src/gh-auth/gh-auth.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { OctokitOptions } from '@octokit/core/dist-types/types';
1111
import { request } from '@octokit/request';
1212
import { Octokit } from '@octokit/rest';
1313
import { createChildLogger } from '@terraform-aws-github-runner/aws-powertools-util';
14-
import { getParameterValue } from '@terraform-aws-github-runner/aws-ssm-util';
14+
import { getParameter } from '@terraform-aws-github-runner/aws-ssm-util';
1515

1616
const logger = createChildLogger('gh-auth');
1717

@@ -45,11 +45,11 @@ export async function createGithubInstallationAuth(
4545
}
4646

4747
async function createAuth(installationId: number | undefined, ghesApiUrl: string): Promise<AuthInterface> {
48-
const appId = parseInt(await getParameterValue(process.env.PARAMETER_GITHUB_APP_ID_NAME));
48+
const appId = parseInt(await getParameter(process.env.PARAMETER_GITHUB_APP_ID_NAME));
4949
let authOptions: StrategyOptions = {
5050
appId,
5151
privateKey: Buffer.from(
52-
await getParameterValue(process.env.PARAMETER_GITHUB_APP_KEY_BASE64_NAME),
52+
await getParameter(process.env.PARAMETER_GITHUB_APP_KEY_BASE64_NAME),
5353
'base64',
5454
// replace literal \n characters with new lines to allow the key to be stored as a
5555
// single line variable. This logic should match how the GitHub Terraform provider

Diff for: lambdas/functions/gh-agent-syncer/package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@
3737
"typescript": "^5.0.3"
3838
},
3939
"dependencies": {
40-
"@aws-sdk/client-s3": "^3.315.0",
41-
"@aws-sdk/lib-storage": "^3.315.0",
40+
"@aws-sdk/client-s3": "^3.350.0",
41+
"@aws-sdk/lib-storage": "^3.350.0",
42+
"@aws-sdk/types": "^3.347.0",
4243
"@terraform-aws-github-runner/aws-powertools-util": "*",
4344
"axios": "^1.3.5"
4445
}

Diff for: lambdas/functions/webhook/src/webhook/handler.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Webhooks } from '@octokit/webhooks';
2-
import { getParameterValue } from '@terraform-aws-github-runner/aws-ssm-util';
2+
import { getParameter } from '@terraform-aws-github-runner/aws-ssm-util';
33
import { mocked } from 'jest-mock';
44
import nock from 'nock';
55

@@ -41,7 +41,7 @@ describe('handler', () => {
4141
jest.clearAllMocks();
4242
jest.resetAllMocks();
4343

44-
const mockedGet = mocked(getParameterValue);
44+
const mockedGet = mocked(getParameter);
4545
mockedGet.mockResolvedValueOnce(GITHUB_APP_WEBHOOK_SECRET);
4646
});
4747

Diff for: lambdas/functions/webhook/src/webhook/handler.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Webhooks } from '@octokit/webhooks';
22
import { CheckRunEvent, WorkflowJobEvent } from '@octokit/webhooks-types';
33
import { createChildLogger } from '@terraform-aws-github-runner/aws-powertools-util';
4-
import { getParameterValue } from '@terraform-aws-github-runner/aws-ssm-util';
4+
import { getParameter } from '@terraform-aws-github-runner/aws-ssm-util';
55
import { IncomingHttpHeaders } from 'http';
66

77
import { Response } from '../lambda';
@@ -99,7 +99,7 @@ async function verifySignature(githubEvent: string, headers: IncomingHttpHeaders
9999
return 500;
100100
}
101101

102-
const secret = await getParameterValue(process.env.PARAMETER_GITHUB_APP_WEBHOOK_SECRET);
102+
const secret = await getParameter(process.env.PARAMETER_GITHUB_APP_WEBHOOK_SECRET);
103103

104104
const webhooks = new Webhooks({
105105
secret: secret,

Diff for: lambdas/libs/aws-ssm-util/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"typescript": "^5.0.2"
3737
},
3838
"dependencies": {
39-
"@aws-sdk/client-ssm": "^3.321.1"
39+
"@aws-sdk/client-ssm": "^3.350.0",
40+
"@aws-sdk/types": "^3.347.0"
4041
}
4142
}

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

+96-11
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
1-
import { GetParameterCommandOutput, SSM } from '@aws-sdk/client-ssm';
1+
import {
2+
GetParameterCommand,
3+
GetParameterCommandOutput,
4+
PutParameterCommand,
5+
PutParameterCommandOutput,
6+
SSMClient,
7+
} from '@aws-sdk/client-ssm';
8+
import { mockClient } from 'aws-sdk-client-mock';
9+
import 'aws-sdk-client-mock-jest';
210
import nock from 'nock';
311

4-
import { getParameterValue } from '.';
5-
6-
jest.mock('@aws-sdk/client-ssm');
12+
import { getParameter, putParameter } from '.';
713

14+
const mockSSMClient = mockClient(SSMClient);
815
const cleanEnv = process.env;
916

1017
beforeEach(() => {
@@ -14,8 +21,8 @@ beforeEach(() => {
1421
nock.disableNetConnect();
1522
});
1623

17-
describe('Test getParameterValue', () => {
18-
test('Gets parameters and returns string', async () => {
24+
describe('Test getParameter and putParameter', () => {
25+
it('Gets parameters and returns string', async () => {
1926
// Arrange
2027
const parameterValue = 'test';
2128
const parameterName = 'testParam';
@@ -30,16 +37,94 @@ describe('Test getParameterValue', () => {
3037
},
3138
};
3239

33-
SSM.prototype.getParameter = jest.fn().mockResolvedValue(output);
40+
mockSSMClient.on(GetParameterCommand).resolves(output);
3441

3542
// Act
36-
const result = await getParameterValue(parameterName);
43+
const result = await getParameter(parameterName);
3744

3845
// Assert
3946
expect(result).toBe(parameterValue);
4047
});
4148

42-
test('Gets invalid parameters and returns string', async () => {
49+
it('Puts parameters and returns error on failure', async () => {
50+
// Arrange
51+
const parameterValue = 'test';
52+
const parameterName = 'testParam';
53+
const output: PutParameterCommandOutput = {
54+
$metadata: {
55+
httpStatusCode: 401,
56+
},
57+
};
58+
59+
mockSSMClient.on(PutParameterCommand).resolves(output);
60+
61+
// Act
62+
expect(putParameter(parameterName, parameterValue, true)).rejects;
63+
});
64+
65+
it('Puts parameters and returns success', async () => {
66+
// Arrange
67+
const parameterValue = 'test';
68+
const parameterName = 'testParam';
69+
const output: PutParameterCommandOutput = {
70+
$metadata: {
71+
httpStatusCode: 200,
72+
},
73+
};
74+
75+
mockSSMClient.on(PutParameterCommand).resolves(output);
76+
77+
// Act
78+
expect(putParameter(parameterName, parameterValue, true)).resolves;
79+
});
80+
81+
it('Puts parameters as String', async () => {
82+
// Arrange
83+
const parameterValue = 'test';
84+
const parameterName = 'testParam';
85+
const secure = false;
86+
const output: PutParameterCommandOutput = {
87+
$metadata: {
88+
httpStatusCode: 200,
89+
},
90+
};
91+
92+
mockSSMClient.on(PutParameterCommand).resolves(output);
93+
94+
// Act
95+
await putParameter(parameterName, parameterValue, secure);
96+
97+
expect(mockSSMClient).toHaveReceivedCommandWith(PutParameterCommand, {
98+
Name: parameterName,
99+
Value: parameterValue,
100+
Type: 'String',
101+
});
102+
});
103+
104+
it('Puts parameters as SecureString', async () => {
105+
// Arrange
106+
const parameterValue = 'test';
107+
const parameterName = 'testParam';
108+
const secure = true;
109+
const output: PutParameterCommandOutput = {
110+
$metadata: {
111+
httpStatusCode: 200,
112+
},
113+
};
114+
115+
mockSSMClient.on(PutParameterCommand).resolves(output);
116+
117+
// Act
118+
await putParameter(parameterName, parameterValue, secure);
119+
120+
expect(mockSSMClient).toHaveReceivedCommandWith(PutParameterCommand, {
121+
Name: parameterName,
122+
Value: parameterValue,
123+
Type: 'SecureString',
124+
});
125+
});
126+
127+
it('Gets invalid parameters and returns string', async () => {
43128
// Arrange
44129
const parameterName = 'invalid';
45130
const output: GetParameterCommandOutput = {
@@ -48,10 +133,10 @@ describe('Test getParameterValue', () => {
48133
},
49134
};
50135

51-
SSM.prototype.getParameter = jest.fn().mockResolvedValue(output);
136+
mockSSMClient.on(GetParameterCommand).resolves(output);
52137

53138
// Act
54-
const result = await getParameterValue(parameterName);
139+
const result = await getParameter(parameterName);
55140

56141
// Assert
57142
expect(result).toBe(undefined);

Diff for: lambdas/libs/aws-ssm-util/src/index.ts

+16-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
1-
import { SSM } from '@aws-sdk/client-ssm';
1+
import { GetParameterCommand, PutParameterCommand, SSMClient } from '@aws-sdk/client-ssm';
22

3-
export async function getParameterValue(parameter_name: string): Promise<string> {
4-
const client = new SSM({ region: process.env.AWS_REGION });
5-
return (await client.getParameter({ Name: parameter_name, WithDecryption: true })).Parameter?.Value as string;
3+
export async function getParameter(parameter_name: string): Promise<string> {
4+
const client = new SSMClient({ region: process.env.AWS_REGION });
5+
return (await client.send(new GetParameterCommand({ Name: parameter_name, WithDecryption: true }))).Parameter
6+
?.Value as string;
7+
}
8+
9+
export async function putParameter(parameter_name: string, parameter_value: string, secure: boolean): Promise<void> {
10+
const client = new SSMClient({ region: process.env.AWS_REGION });
11+
await client.send(
12+
new PutParameterCommand({
13+
Name: parameter_name,
14+
Value: parameter_value,
15+
Type: secure ? 'SecureString' : 'String',
16+
}),
17+
);
618
}

0 commit comments

Comments
 (0)