From 70fbd1472045b588ea6c636eb1770094892d3482 Mon Sep 17 00:00:00 2001 From: abetomo Date: Sun, 22 Feb 2026 22:19:25 +0900 Subject: [PATCH] Support the alias --- lib/main.js | 38 +++++++++++++++++++++++++++++++++----- test/main.js | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 8 deletions(-) diff --git a/lib/main.js b/lib/main.js index 6d6a908..f163bb5 100644 --- a/lib/main.js +++ b/lib/main.js @@ -632,6 +632,28 @@ Emulate only the body of the API Gateway event. } } + _alias (lambda, functionName, functionVersion, aliasName) { + return lambda.getAlias({ + FunctionName: functionName, + Name: aliasName + }).promise().then(() => { + return lambda.updateAlias({ + FunctionName: functionName, + Name: aliasName, + FunctionVersion: functionVersion + }).promise() + }).catch((err) => { + if (err.code === 'ResourceNotFoundException') { + return lambda.createAlias({ + FunctionName: functionName, + Name: aliasName, + FunctionVersion: functionVersion + }).promise() + } + throw err + }) + } + async _uploadExisting (lambda, params) { const functionCodeParams = Object.assign({ FunctionName: params.FunctionName, @@ -666,7 +688,7 @@ Emulate only the body of the API Gateway event. console.log(response.error.message) console.log('=> Retrying') }) - const updateConfigResponse = await updateConfigRequest.promise() + await updateConfigRequest.promise() // Wait for the `Configuration.LastUpdateStatus` to change from `InProgress` to `Successful`. for (let i = 0; i < 10; i++) { @@ -682,9 +704,9 @@ Emulate only the body of the API Gateway event. console.log(response.error.message) console.log('=> Retrying') }) - await updateCodeRequest.promise() + const updateCodeResponse = await updateCodeRequest.promise() - return updateConfigResponse + return updateCodeResponse } _uploadNew (lambda, params) { @@ -1044,7 +1066,10 @@ they may not work as expected in the Lambda environment. cloudWatchLogs, program, params.FunctionName - ) + ), + ...(params.Publish && program.lambdaVersion + ? [this._alias(lambda, params.FunctionName, results.Version, program.lambdaVersion)] + : []) ]) } else { const results = await this._uploadNew(lambda, params) @@ -1072,7 +1097,10 @@ they may not work as expected in the Lambda environment. cloudWatchLogs, program, params.FunctionName - ) + ), + ...(params.Publish && program.lambdaVersion + ? [this._alias(lambda, params.FunctionName, results.Version, program.lambdaVersion)] + : []) ]) } } diff --git a/test/main.js b/test/main.js index 385f774..111372f 100644 --- a/test/main.js +++ b/test/main.js @@ -85,7 +85,8 @@ const lambdaMockSettings = { }, updateFunctionCode: { FunctionArn: 'Lambda.updateFunctionCode.mock.FunctionArn', - FunctionName: 'Lambda.updateFunctionCode.mock.FunctionName' + FunctionName: 'Lambda.updateFunctionCode.mock.FunctionName', + Version: '1' }, updateFunctionConfiguration: { FunctionArn: 'Lambda.updateFunctionConfiguration.mock.FunctionArn', @@ -107,7 +108,19 @@ const lambdaMockSettings = { Tags: { tag1: 'key1' } }, untagResource: {}, - tagResource: {} + tagResource: {}, + getAlias: { + FunctionArn: 'Lambda.getAlias.mock.FunctionArn', + Name: 'mockAlias' + }, + createAlias: { + FunctionArn: 'Lambda.createAlias.mock.FunctionArn', + Name: 'mockAlias' + }, + updateAlias: { + FunctionArn: 'Lambda.updateAlias.mock.FunctionArn', + Name: 'mockAlias' + } } const _mockSetting = () => { @@ -1575,7 +1588,27 @@ describe('lib/main', function () { it('simple test with mock', () => { const params = lambda._params(program, null) return lambda._uploadExisting(awsLambda, params).then((results) => { - assert.deepEqual(results, lambdaMockSettings.updateFunctionConfiguration) + assert.deepEqual(results, lambdaMockSettings.updateFunctionCode) + }) + }) + }) + + describe('_alias', () => { + it('updates alias when it already exists', () => { + return lambda._alias(awsLambda, 'myFunc', '1', 'mockAlias').then((results) => { + assert.deepEqual(results, lambdaMockSettings.updateAlias) + }) + }) + + it('creates alias when it does not exist', () => { + const err = new Error('ResourceNotFoundException') + err.code = 'ResourceNotFoundException' + const mockLambda = { + getAlias: () => ({ promise: () => Promise.reject(err) }), + createAlias: () => ({ promise: () => Promise.resolve(lambdaMockSettings.createAlias) }) + } + return lambda._alias(mockLambda, 'myFunc', '1', 'mockAlias').then((results) => { + assert.deepEqual(results, lambdaMockSettings.createAlias) }) }) }) @@ -1648,6 +1681,17 @@ describe('lib/main', function () { ) }) }) + + it('creates alias when publish and lambdaVersion are set', () => { + program.publish = true + program.lambdaVersion = 'v1' + const params = lambda._params(program, null) + params.Publish = true + return lambda._deployToRegion(program, params, 'us-east-1').then((result) => { + assert.equal(result.length, 4) + assert.deepEqual(result[3], lambdaMockSettings.updateAlias) + }) + }) }) describe('Lambda.prototype.deploy()', () => {