使用Terraform / CloudFormation /其他方法有效地部署lambda(仅部署已更改的lambda)

时间:2018-12-13 06:31:54

标签: lambda continuous-integration amazon-cloudformation terraform

到目前为止,我一直在使用CloudFormation部署我的lambda。我发现此过程非常缓慢且效率低下-例如。可能要花几分钟,但是如果只部署那1个功能就应该花几秒钟?大多数功能都不会改变,但我相信CloudFormation不会与众不同,并且无论如何都会部署所有功能。有没有办法可以更有效地做到这一点?像检查发生了什么更改,仅部署更改?

另一个好处是我可以减少版本吗?

4 个答案:

答案 0 :(得分:3)

您可以使用source_code_hash资源中的aws_lambda_function使Terraform检查Lambda函数是否已更改。如果没有任何变化,那么它将不会上传新版本,并且您的计划不会显示任何更改。

这以example in the docs的形式给出:

resource "aws_lambda_function" "test_lambda" {
  filename         = "lambda_function_payload.zip"
  function_name    = "lambda_function_name"
  role             = "${aws_iam_role.iam_for_lambda.arn}"
  handler          = "exports.test"
  source_code_hash = "${base64sha256(file("lambda_function_payload.zip"))}"
  runtime          = "nodejs8.10"

  environment {
    variables = {
      foo = "bar"
    }
  }
}

答案 1 :(得分:3)

我创建了this Terraform模块来解决此问题。甚至设置source_code_hash也是不够的,因为制作zip时通常会包含一些文件系统元数据。对于我的模块,哈希应该是稳定的(仅在源更改时更改)。该模块特定于Python,但哈希稳定性可应用于任何运行时。

答案 2 :(得分:1)

我在gitlab管道中使用aws cli在提交时部署和更新我的lambda。

我压缩内容。将其上传到S3,并使用S3上的新工件触发功能更新。

这比运行“云形成”模板快得多:

# Filename
FILENAME="${ARTIFACT_ID}-${version}-$BUILD_NUMBER.zip"
zip -r -D $FILENAME ./*
# Copy the bundle to s3
aws s3 cp $FILENAME "s3://$S3_BUCKET/$FILENAME"
# Trigger update of lambda function
aws lambda update-function-code --function-name $LAMBDA_FUNCTION_NAME --s3-bucket $S3_BUCKET --s3-key $FILENAME

我希望有帮助。

答案 3 :(得分:1)

尝试https://serverless.com。易于进行lambda函数部署,并且您还可以创建具有几行代码的其他资源,例如dynamodb或s3存储桶。

1)创建无服务器项目。

serverless create --template aws-nodejs --path my-service

2)将函数登录名写入handler.js文件并部署。

serverless deploy 

3)您可以在一项服务中创建多个功能。另外,您可以选择仅部署一项功能。

serverless deploy // for all the functions in one service
serverless deploy function -f functionName //deploy function with name 'functionName'

您也可以从终端查看日志,无服务器框架还具有插件支持,例如您可以在Typescript中编写源代码,而无服务器的Typescript插件将自行完成其余工作。 我使用无服务器已经有一段时间了,这是我发现的持续集成的最佳解决方案。值得一试。