#!/usr/bin/env bash # golamb: zip, upload, and update a golang lambda function. # $1 should be both the name of the lambda function and the name of the go module. # # Example: Lambda function named "get-comments" # go module named "github.com/knoebber/personal-website/get-comments" # Use: golamb get-comments # Or to test: golamb get-comments --test # exit when any command fails set -e function=$1 bucket=nicolasknoebber-backend start_path=$(pwd) # Find go.mod files in or beneath the current directory. function find_go_modules() { find . \ -type d\ \( -name node_modules -o -name .git \) -prune -false \ -o -name 'go.mod' } # Finds a go package that should be zipped and uploaded. # $1 should match part of the first line of a go.mod file. function find_lambda_package() { for module in $(find_go_modules); do if head -1 "$module" | grep -w "$1" > /dev/null; then echo "$module" break fi done } module_path="$(find_lambda_package "$function")" if [ -z "$module_path" ]; then echo "Failed to find module for $function" exit 1 fi echo "Found lambda module at $module_path" build_path=$(dirname "$module_path") cd "$build_path" pwd if [ "$2" == "--test" ]; then go test ./... aws lambda get-function --function "$1" cd "$start_path" exit 0 fi echo "Building Lambda function $function" CGO_ENABLED=0 GOOS=linux go build echo "Zipping Lambda function $function" zip "$function.zip" "./$function" s3_path="s3://$bucket/$function.zip" echo "Uploading Lambda binary to $s3_path" aws s3 cp "$function.zip" "$s3_path" echo "Updating Lambda function" aws lambda update-function-code\ --function-name "$function"\ --s3-bucket "$bucket"\ --s3-key "$function.zip"\ --publish echo Cleaning up rm "$function" rm "$function.zip" cd "$start_path"