#!/usr/bin/env bash set -e usage() { echo "AWS Lambda Layer Builder" echo "------------------------" echo "make-layer NAME RUNTIME PACKAGE_1 [PACKAGE_2] ..." echo "make-layer NAME RUNTIME MANIFEST" echo "" echo "Currently supported runtimes: nodejs*, python*" } if [[ "$#" -lt 3 ]]; then usage exit 1 fi name="${1}" runtime="${2}" manifest="${3}" if test -f "$manifest"; then packages="${@:4}" else manifest="" packages="${@:3}" fi output_folder="$(mktemp -d)" docker_image="public.ecr.aws/sam/build-$runtime:latest" volume_params="-v $output_folder:/layer" if [[ $runtime == node* ]]; then package_folder="nodejs/" mkdir -p "$output_folder/$package_folder" if [[ -n "$manifest" ]]; then cp "$manifest" "$output_folder/$package_folder/package.json" fi install_command="pushd $package_folder; npm install; npm install --save $packages; popd" volume_params="$volume_params -v $HOME/.npmrc:/root/.npmrc" elif [[ $runtime == python* ]]; then package_folder="python/lib/$runtime/site-packages/" if [[ -n "$manifest" ]]; then cp "$manifest" "$output_folder/requirements.txt" else touch "$output_folder/requirements.txt" fi install_command="pip install -r requirements.txt -t $package_folder $packages" volume_params="$volume_params -v $HOME/.config/pip:/root/.config/pip" else usage exit 1 fi echo "Building layer" zip_command="zip -r layer.zip *" docker run --rm $volume_params -w "/layer" "$docker_image" /bin/bash -c "$install_command && $zip_command" pushd "$output_folder" echo "Uploading layer $name to AWS" aws lambda publish-layer-version --layer-name "$name" --compatible-runtimes "$runtime" --zip-file "fileb://layer.zip" echo "Upload complete" popd echo "Cleaning up" rm -rf "$output_folder" echo "All done. Enjoy your shiny new Lambda layer!"