Skip to content

Component deployment - first stage

As described in the components section, whenever a component contains a serverless function that needs to be uploaded to a registry, it needs a 'first stage' deployment.

In that case, the component itself is responsible for the following steps:

  • Packaging the function
  • Deploying it to the code registry

In this section a couple of methods – for various cloud providers – will be described.

Second stage deployment

The second stage deployment is described in the MACH configuration deployment section

Package

Using serverless

When using serverless for local development, the easiest way to package your function would be to invoke

$ serverless package

Python project

Sample bash script to package your function to a ZIP file with the correct version tag.

VERSION=$(shell git rev-parse --short HEAD 2>/dev/null || echo "dev" )
NAME=yourcomponent-$VERSION
ARTIFACT_NAME=$NAME.zip

python -m pip install dist/*.whl -t ./build
cp handler.py ./build
cd build && zip -9 -r $ARTIFACT_NAME .
VERSION=$(shell git rev-parse --short HEAD 2>/dev/null || echo "dev" )
NAME=yourcomponent-$VERSION
ARTIFACT_NAME=$NAME.zip

func pack --build-native-deps --python
mv $BASENAME.zip $ARTIFACT_NAME

Package & Upload script

An example of a bash script that can be used in any CI/CD pipeline. The content of the upload and package functions can be taken from the examples mentioned above.

#!/bin/bash

VERSION=$(git rev-parse --short HEAD 2>/dev/null || echo "dev" )
BASENAME=component-name
NAME=$BASENAME-$VERSION
BUILD_NAME=$NAME
ARTIFACT_NAME="${NAME}.zip"

package () {
    # Package instructions
}

upload () {
    src="build/${ARTIFACT_NAME}"
    dest=$ARTIFACT_NAME
    STORAGE_ACCOUNT_KEY=`az storage account keys list -g my-shared-we-rg -n mysharedwesacomponents --query [0].value -o tsv`
    az storage blob upload --account-name mysharedwesacomponents --account-key ${STORAGE_ACCOUNT_KEY} -c code -f $src -c code -n $dest
}

version () {
    echo "Version: '${VERSION}'"
    echo "Name: '${NAME}'"
    echo "Artifect name: '${ARTIFACT_NAME}'"
}

case $1 in
    package)
        package $2 $3
    ;;
    upload)
        upload $2
    ;;
    version)
        version
    ;;
esac
#!/bin/bash

VERSION=$(git rev-parse --short HEAD 2>/dev/null || echo "dev" )
BASENAME=component-name
NAME=$BASENAME-$VERSION
BUILD_NAME=$NAME
ARTIFACT_NAME="${NAME}.zip"

package () {
    # Package instructions
}

upload () {
    src="build/${ARTIFACT_NAME}"
    dest=$ARTIFACT_NAME
    aws s3 cp $src s3://your-lambda-repo/$dest
}

version () {
    echo "Version: '${VERSION}'"
    echo "Name: '${NAME}'"
    echo "Artifect name: '${ARTIFACT_NAME}'"
}

case $1 in
    package)
        package $2 $3
    ;;
    upload)
        upload $2
    ;;
    version)
        version
    ;;
esac

Usage:

$ ./build.sh package
$ ./build.sh upload

Setting up CI

Refer to the CI/CD section for instructions on how to set up your Continuous Integration pipeline for component deployments:

Second stage - MACH deployment

As part of the MACH deployment, the component will be loaded as a Terraform module so that the component can deploy the necessary resources needed for the specific site it is configured for.

This is what we call the second stage deployment.