Maintaining lambda code directly in CloudFormation only works with zipfile property on nodejs and even there it is limited to 2000 characters. For python and bigger lambdas, we now use this ruby script to generate the s3 object that is set in the CloudFormation template.
require 'aws-sdk-core' def code_via_s3(file, handler) bucket = "my-lambda-staging-area" content = File.read(file) sha = Digest::MD5.hexdigest(content) key = "#{file.gsub('/', '-')}-#{sha}.zip" # zip up the content (gzip is not supported) # needs to be at bottom of zip to support inline editing # and match the handler name content = `cd #{File.dirname(file)} && zip --quiet - #{File.basename(file)}` raise "Zip failed" unless $?.success? # upload to s3 (overwriting it ... checking for existance takes the same time ...) c = Aws::S3::Client.new begin c.put_object(body: content, bucket: bucket, key: key) rescue Aws::S3::Errors::NoSuchBucket c.create_bucket(bucket: bucket) retry end { "Handler" => File.basename(file).sub(/\..*/, '') + '.' + handler, "Code" => {"S3Bucket" => bucket, "Key" => key} } end
One thought on “Automated lambda code upload to S3 with CloudFormation”