18F/domain-scan

View on GitHub
lambda/deploy

Summary

Maintainability
Test Coverage
#!/bin/bash

## Usage (from project root):
#
# ./lambda/deploy [scanner] [--create]
#
# The --create flag will create a new function. Otherwise,
# the function is assumed to exist and will be updated in place.
#
# Examples:
#   ./lambda/deploy noop --create
#   ./lambda/deploy sslyze

SCANNER_NAME=$1
FUNCTION_NAME="task_$SCANNER_NAME"

IS_CREATE=$2

if [ -z "$1" ]; then
  echo "ERROR: A scanner name is required."
fi

echo "Building $FUNCTION_NAME from $SCANNER_NAME..."

# Go into the lambda dir
cd lambda

# From the lambda dir - use the build/ dir to assemble a zip
# and "publish" it back up to the lambda dir.
rm -r build
mkdir -p build
cd build

# Copy the lambda handler, the scanner itself, and utils.
cp ../lambda_handler.py .
mkdir -p scanners
mkdir -p utils
cp ../../scanners/$SCANNER_NAME.py scanners/.
cp ../../utils/*.py utils/.

# Copy a (possibly remotely built) locally versioned virtualenv.
#
# Copying a remotely build virtualenv to the local environment
# is not captured in this script. Run the scp (or whatever)
# command directly before running this script.

if [ -f ../envs/$SCANNER_NAME.zip ]; then
  echo "Incorporating custom-built env for $SCANNER_NAME..."
  cp ../envs/$SCANNER_NAME.zip .
  unzip -q $SCANNER_NAME.zip
  rm $SCANNER_NAME.zip
else
  echo "Incorporating catch-all domain-scan env..."
  cp ../envs/domain-scan.zip .
  unzip -q domain-scan.zip
  rm domain-scan.zip
fi

echo "Building zip package for $FUNCTION_NAME..."
zip -rq9 $FUNCTION_NAME.zip .
cd ..

# Create the function using the zipped code.
if [ "$IS_CREATE" == "--create" ]; then

  echo "Creating Lambda function $FUNCTION_NAME..."
  aws lambda create-function \
    --function-name $FUNCTION_NAME \
    --zip-file fileb://./build/$FUNCTION_NAME.zip \
    --role $AWS_LAMBDA_ROLE \
    --handler lambda_handler.handler \
    --runtime python3.6 \
    --timeout 900 \
    --memory-size 128

# Or, update the function's code with the latest zipped code.
else

  echo "Updating Lambda code file for $FUNCTION_NAME..."
  aws lambda update-function-code \
    --function-name $FUNCTION_NAME \
    --zip-file fileb://./build/$FUNCTION_NAME.zip

fi

# back up to project root
cd ..


# Kept here for reference, not used in the script:
#
# echo "Updating Lambda handler function for $FUNCTION_NAME..."
# aws lambda update-function-configuration \
#   --function-name $FUNCTION_NAME \
#   --handler lambda_handler.handler