Aws lambda 如何使用SAM deploy获取lambda,以及自动发布和其他Alise
我在这里的目标是,额外的Aws lambda 如何使用SAM deploy获取lambda,以及自动发布和其他Alise,aws-lambda,amazon-cloudformation,aws-sam,Aws Lambda,Amazon Cloudformation,Aws Sam,我在这里的目标是,额外的SAM deploy调用将导致:staging别名反映最新版本,并且:live将通过外部方式更新,但必须初始化为部署时创建的相同版本 我正在使用SAM deploy,需要在我的lambdas上使用别名。将它们添加到初始模板中是很棘手的,因为您无法创建具有明确版本号的别名,而AWS CloudFormation会强制保留旧的lambda版本,因此在不检查资源的情况下无法知道版本。这是到目前为止我发现的最好的方法,但是它很麻烦并且不能很好地扩展(每个堆栈都需要相同的逻辑) 此
SAM deploy
调用将导致:staging别名反映最新版本,并且:live将通过外部方式更新,但必须初始化为部署时创建的相同版本
我正在使用SAM deploy,需要在我的lambdas上使用别名。将它们添加到初始模板中是很棘手的,因为您无法创建具有明确版本号的别名,而AWS CloudFormation会强制保留旧的lambda版本,因此在不检查资源的情况下无法知道版本。这是到目前为止我发现的最好的方法,但是它很麻烦并且不能很好地扩展(每个堆栈都需要相同的逻辑)
此代码还依赖于用于自定义资源管理的
我怎样才能做得更好
template.yaml
GetLatestVersionOfLambdaFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: GetLatestVersionOfLambdaFunction
Description: Given an existing Lambda Function Name, return the most recent version number
VersionDescription: !Sub ${deployVersionDescription}
AutoPublishAlias: staging
CodeUri: src/
Handler: getLatestLambdaVersionByName.handler
MemorySize: 128
Runtime: nodejs12.x
Timeout: 10
Tracing: Active
Role: !GetAtt GetLatestVersionOfLambdaRole.Arn
SampleLambdaGetMaxVersionFunction:
Type: Custom::FunctionVersion
Properties:
ServiceToken: !GetAtt GetLatestVersionOfLambdaFunction.Arn
FunctionName: !Ref SampleLambdaFunction
SampleLambdaFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: SampleLambda
AutoPublishAlias: staging
CodeUri: src/
Handler: SampleLambda.handler
MemorySize: 512
Runtime: nodejs12.x
Role: !GetAtt SampleLambdaRole.Arn
SampleLambdaLiveAlias:
Type: AWS::Lambda::Alias
Properties:
FunctionName: !Ref SampleLambdaFunction
FunctionVersion: !GetAtt SampleLambdaGetMaxVersionFunction.version
Name: live
src/getLatestLambdaVersionByName.js
const response = require('./cfn-response.js'),
AWS = require('aws-sdk'),
lambda = new AWS.Lambda({ apiVersion: '2015-03-31' });
exports.handler = function (event, context) {
console.log({ GetLatestLambdaVersionBynameEvent: event });
if (event.RequestType == 'Delete') {
response.send(event, context, response.SUCCESS); //, { Delete: true, event }
return;
}
try {
let params = {
FunctionName: event.ResourceProperties.FunctionName,
MaxItems: 999
};
// Use list-versions-by-function then determine the greatest version # and return it
lambda.listVersionsByFunction(params, function (err, data) {
console.log({ params, err });
if (err) {
console.error(err, err.stack); // an error occurred
response.send(event, context, response.FAILED);
return; // JSON.stringify({ error: err });
} else {
console.log(JSON.stringify({ Versions: data.Versions }));
let version = data.Versions[data.Versions.length - 1].Version;
if (version == '$LATEST') version = 1;
let res = { version };
response.send(event, context, response.SUCCESS, res);
return; // JSON.stringify(res);
}
});
} catch (err) {
let error = { err, stack: err.stack };
response.send(event, context, response.FAILED);
return; // JSON.stringify({ error });
}
}