@payfit/nx-core 4.41.0-ephemeral-hello-lambda-db46dff.0 → 4.41.0-ephemeral-hello-lambda-052993f.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export declare function retrieveAccoundId(stackId: string): [string, string];
|
|
2
2
|
export declare function runSmokeTests(stackId: string, lambdaFunctions: string[]): Promise<void>;
|
|
3
|
-
export declare function createOrUpdateLambdaAlias(accountId: string, lambdaARN: string, alias: string, update?: boolean): Promise<void>;
|
|
3
|
+
export declare function createOrUpdateLambdaAlias(accountId: string, lambdaARN: string, alias: string, envVars: Record<string, string>, update?: boolean): Promise<void>;
|
|
4
4
|
export declare function createOrMoveAlias(stackId: string, lambdaFunctions: string[], alias: string): Promise<void>;
|
|
@@ -4,30 +4,30 @@ exports.retrieveAccoundId = retrieveAccoundId;
|
|
|
4
4
|
exports.runSmokeTests = runSmokeTests;
|
|
5
5
|
exports.createOrUpdateLambdaAlias = createOrUpdateLambdaAlias;
|
|
6
6
|
exports.createOrMoveAlias = createOrMoveAlias;
|
|
7
|
-
const aws_auth_1 = require("../common/aws-auth");
|
|
8
7
|
const exec_1 = require("../common/exec");
|
|
9
8
|
const logger_1 = require("../common/logger");
|
|
9
|
+
const ACCOUNT_IDS = {
|
|
10
|
+
dev: '533547282673',
|
|
11
|
+
staging: '589883667243',
|
|
12
|
+
testing: '623580596988',
|
|
13
|
+
shared: '574592175410',
|
|
14
|
+
prod: '614948436281',
|
|
15
|
+
};
|
|
10
16
|
function retrieveAccoundId(stackId) {
|
|
11
|
-
const AccountId = {
|
|
12
|
-
dev: '533547282673',
|
|
13
|
-
staging: '589883667243',
|
|
14
|
-
testing: '623580596988',
|
|
15
|
-
shared: '574592175410',
|
|
16
|
-
prod: '614948436281',
|
|
17
|
-
};
|
|
18
17
|
const environmentMatch = stackId.match(/-(dev|testing|prod|staging|shared)-/);
|
|
19
18
|
const environment = environmentMatch ? environmentMatch[1] : 'unknown';
|
|
20
|
-
return [environment,
|
|
19
|
+
return [environment, ACCOUNT_IDS[environment]];
|
|
21
20
|
}
|
|
22
21
|
async function runSmokeTests(stackId, lambdaFunctions) {
|
|
23
22
|
const [environment, accountId] = retrieveAccoundId(stackId);
|
|
24
|
-
const
|
|
23
|
+
const credentials = await assumeEnvironmentSpecificRole(environment);
|
|
24
|
+
const envVars = getAssumedRoleEnvVars(credentials);
|
|
25
25
|
const smokeTestFunction = async (functionName) => {
|
|
26
26
|
const lambdaARN = `arn:aws:lambda:eu-west-3:${accountId}:function:${functionName}:smoke-test`;
|
|
27
27
|
try {
|
|
28
28
|
logger_1.consola.log(`Running smoke tests for ${functionName} in env ${environment}`);
|
|
29
29
|
const emptyPayload = JSON.stringify({ Records: [] });
|
|
30
|
-
await (0, exec_1.exec)(`aws lambda invoke
|
|
30
|
+
await (0, exec_1.exec)(`aws lambda invoke --function-name ${lambdaARN} --payload ${btoa(emptyPayload)}`, { throwOnError: true, nodeOptions: { env: envVars } });
|
|
31
31
|
logger_1.consola.success(`Smoke test passed for function ${functionName} in ${environment}`);
|
|
32
32
|
}
|
|
33
33
|
catch (error) {
|
|
@@ -39,31 +39,101 @@ async function runSmokeTests(stackId, lambdaFunctions) {
|
|
|
39
39
|
await Promise.all(lambdaFunctions.map(smokeTestFunction));
|
|
40
40
|
logger_1.consola.success(`All smoke tests passed in ${environment} environment`);
|
|
41
41
|
}
|
|
42
|
-
async function createOrUpdateLambdaAlias(accountId, lambdaARN, alias, update = false) {
|
|
42
|
+
async function createOrUpdateLambdaAlias(accountId, lambdaARN, alias, envVars, update = false) {
|
|
43
43
|
const aliasAction = update ? 'create-alias' : 'update-alias';
|
|
44
44
|
logger_1.consola.log(`Retrieving latest version for function ${lambdaARN}`);
|
|
45
|
-
const getLatestVersionResult = await (0, exec_1.exec)(`aws lambda get-alias --
|
|
45
|
+
const getLatestVersionResult = await (0, exec_1.exec)(`aws lambda get-alias --function-name ${lambdaARN} --name $LATEST`, { throwOnError: true, nodeOptions: { env: envVars } });
|
|
46
46
|
const latestVersion = JSON.parse(getLatestVersionResult.stdout).FunctionVersion;
|
|
47
47
|
logger_1.consola.log(`Creating or updating alias ${alias} for function ${lambdaARN} with version ${latestVersion}`);
|
|
48
|
-
const result = await (0, exec_1.exec)(`aws lambda ${aliasAction} --
|
|
48
|
+
const result = await (0, exec_1.exec)(`aws lambda ${aliasAction} --function-name ${lambdaARN} --name ${alias} --function-version ${latestVersion}`, {
|
|
49
49
|
throwOnError: true,
|
|
50
|
+
nodeOptions: { env: envVars },
|
|
50
51
|
});
|
|
51
52
|
const response = JSON.parse(result.stdout);
|
|
52
53
|
if (response.Name !== alias) {
|
|
53
54
|
throw new Error(`Lambda alias ${alias} creation failed for function ${lambdaARN} in ${accountId}. Response name should match version`);
|
|
54
55
|
}
|
|
55
56
|
}
|
|
57
|
+
async function assumeEnvironmentSpecificRole(environment) {
|
|
58
|
+
const roleName = `invoke-lambda-nx-core`;
|
|
59
|
+
const accountId = ACCOUNT_IDS[environment];
|
|
60
|
+
const roleArn = `arn:aws:iam::${accountId}:role/${roleName}`;
|
|
61
|
+
logger_1.consola.log(`Assuming role ${roleName} for environment ${environment}`);
|
|
62
|
+
try {
|
|
63
|
+
const result = await (0, exec_1.exec)(`aws sts assume-role --role-arn ${roleArn} --role-session-name nx-core`, { throwOnError: true });
|
|
64
|
+
if (!result.stdout) {
|
|
65
|
+
throw new Error('Empty response from AWS STS assume-role command');
|
|
66
|
+
}
|
|
67
|
+
let parsedResponse;
|
|
68
|
+
try {
|
|
69
|
+
parsedResponse = JSON.parse(result.stdout);
|
|
70
|
+
}
|
|
71
|
+
catch (parseError) {
|
|
72
|
+
logger_1.consola.error('Failed to parse AWS STS response:', result.stdout);
|
|
73
|
+
throw new Error(`Invalid JSON response from AWS STS: ${parseError.message}`);
|
|
74
|
+
}
|
|
75
|
+
if (!parsedResponse.Credentials) {
|
|
76
|
+
logger_1.consola.error('AWS STS response missing credentials:', parsedResponse);
|
|
77
|
+
throw new Error('AWS STS response does not contain credentials');
|
|
78
|
+
}
|
|
79
|
+
const credentials = parsedResponse.Credentials;
|
|
80
|
+
logger_1.consola.success(`Successfully assumed role ${roleName} for environment ${environment}`);
|
|
81
|
+
return {
|
|
82
|
+
accessKeyId: credentials.AccessKeyId,
|
|
83
|
+
secretAccessKey: credentials.SecretAccessKey,
|
|
84
|
+
sessionToken: credentials.SessionToken,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
logger_1.consola.error(`Failed to assume role ${roleName} for environment ${environment}`);
|
|
89
|
+
logger_1.consola.error(`Role ARN: ${roleArn}`);
|
|
90
|
+
logger_1.consola.error(`Account ID: ${accountId}`);
|
|
91
|
+
if (error.message?.includes('is not authorized to perform: sts:AssumeRole')) {
|
|
92
|
+
logger_1.consola.error(`❌ Authorization Error: Current AWS credentials are not authorized to assume the role '${roleName}'`);
|
|
93
|
+
logger_1.consola.info(`💡 Possible solutions:`);
|
|
94
|
+
logger_1.consola.info(` • Ensure your AWS credentials have the 'sts:AssumeRole' permission`);
|
|
95
|
+
logger_1.consola.info(` • Verify the role '${roleName}' exists in account ${accountId}`);
|
|
96
|
+
logger_1.consola.info(` • Check if the role's trust policy allows your current identity to assume it`);
|
|
97
|
+
logger_1.consola.info(` • Confirm you're using the correct AWS profile/credentials`);
|
|
98
|
+
}
|
|
99
|
+
else if (error.message?.includes('does not exist')) {
|
|
100
|
+
logger_1.consola.error(`❌ Role Not Found: The role '${roleName}' does not exist in account ${accountId}`);
|
|
101
|
+
logger_1.consola.info(`💡 Please ensure the role is created in the target AWS account`);
|
|
102
|
+
}
|
|
103
|
+
else if (error.message?.includes('Invalid identity token')) {
|
|
104
|
+
logger_1.consola.error(`❌ Token Error: AWS credentials are invalid or expired`);
|
|
105
|
+
logger_1.consola.info(`💡 Please refresh your AWS credentials`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
logger_1.consola.error(`❌ Unexpected error: ${error.message}`);
|
|
109
|
+
if (error.stderr) {
|
|
110
|
+
logger_1.consola.error(`AWS CLI stderr: ${error.stderr}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
throw new Error(`Role assumption failed for ${environment}: ${error.message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function getAssumedRoleEnvVars(credentials) {
|
|
117
|
+
// Only override the specific AWS credential environment variables
|
|
118
|
+
const baseEnv = { ...process.env };
|
|
119
|
+
baseEnv.AWS_ACCESS_KEY_ID = credentials.accessKeyId;
|
|
120
|
+
baseEnv.AWS_SECRET_ACCESS_KEY = credentials.secretAccessKey;
|
|
121
|
+
baseEnv.AWS_SESSION_TOKEN = credentials.sessionToken;
|
|
122
|
+
return baseEnv;
|
|
123
|
+
}
|
|
56
124
|
async function createOrMoveAlias(stackId, lambdaFunctions, alias) {
|
|
57
125
|
const [environment, accountId] = retrieveAccoundId(stackId);
|
|
126
|
+
const credentials = await assumeEnvironmentSpecificRole(environment);
|
|
127
|
+
const envVars = getAssumedRoleEnvVars(credentials);
|
|
58
128
|
const addAliasFunction = async (functionName) => {
|
|
59
129
|
try {
|
|
60
130
|
logger_1.consola.log(`Add alias for ${functionName} in env ${environment}`);
|
|
61
131
|
const lambdaARN = `arn:aws:lambda:eu-west-3:${accountId}:function:${functionName}`;
|
|
62
132
|
if (alias !== 'smoke-test') {
|
|
63
|
-
return createOrUpdateLambdaAlias(accountId, lambdaARN, alias);
|
|
133
|
+
return createOrUpdateLambdaAlias(accountId, lambdaARN, alias, envVars);
|
|
64
134
|
}
|
|
65
|
-
const getAliasResult = await (0, exec_1.exec)(`aws lambda get-alias --
|
|
66
|
-
return createOrUpdateLambdaAlias(accountId, lambdaARN, alias, getAliasResult.exitCode == 0);
|
|
135
|
+
const getAliasResult = await (0, exec_1.exec)(`aws lambda get-alias --function-name ${lambdaARN} --name ${alias}`, { nodeOptions: { env: envVars } });
|
|
136
|
+
return createOrUpdateLambdaAlias(accountId, lambdaARN, alias, envVars, getAliasResult.exitCode == 0);
|
|
67
137
|
}
|
|
68
138
|
catch (error) {
|
|
69
139
|
logger_1.consola.error(`Lambda alias ${alias} creation failed for function ${functionName} in ${environment}:`, error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aws-lambda.js","sourceRoot":"","sources":["../../../../../../packages/nx-core/src/utils/lambda/aws-lambda.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"aws-lambda.js","sourceRoot":"","sources":["../../../../../../packages/nx-core/src/utils/lambda/aws-lambda.ts"],"names":[],"mappings":"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"}
|