Part 0: Introduction to AWS Lambda and Chalice

This section will provide an introduction on how to use AWS Chalice and provide instructions on how to go about building your very first Chalice application running on AWS Lambda. Steps include:

Create a virtualenv and install Chalice

To start using Chalice, you will need a new virtualenv with Chalice installed.

Instructions

Make sure you have Python 3 installed. See the env-setup page for instructions on how to install Python.

  1. Create a new virtualenv called chalice-env by running the following command:

    $ python3 -m venv chalice-env
    
  2. Activate your newly created virtualenv:

    $ source chalice-env/bin/activate
    

    If you are using a Windows environment, you will have to run:

    > .\chalice-env\Scripts\activate
    
  3. Install chalice using pip:

    $ pip install chalice
    

Verification

  1. To check that chalice was installed, run:

    $ chalice --version
    chalice 1.6.0, python 3.7.3, darwin 15.6.0
    

    The version of chalice must be version 1.6.0 or higher and the version of Python should be 3.7.

Create a new Chalice application

With chalice now installed, it is time to create your first Chalice application.

Instructions

  1. Run the chalice new-project command to create a project called workshop-intro:

    $ chalice new-project workshop-intro
    

Verification

  1. A new workshop-intro directory should have been created on your behalf. Inside of the workshop-intro directory, you should have two files: an app.py file and a requirements.txt file:

    $ ls workshop-intro
    app.py           requirements.txt
    

Hello world Lambda function

Let’s create our first Lambda function and deploy it using Chalice.

Instructions

  1. Change directories to your newly created workshop-intro directory:

    $ cd workshop-intro
    
  2. Open the app.py file and delete all lines of code underneath the line: app = Chalice(app_name='workshop-intro'). Your app.py file should only consist of the following lines:

    from chalice import Chalice
    
    app = Chalice(app_name='workshop-intro')
    
  3. Add a new function hello_world decorated by app.lambda_function() that returns {"hello": "world"}. Your app.py file should now consist of the following lines:

    from chalice import Chalice
    
    app = Chalice(app_name='workshop-intro')
    
    @app.lambda_function()
    def hello_world(event, context):
        return {'hello': 'world'}
    
  4. Run chalice deploy to deploy your Chalice application to AWS Lambda:

    $ chalice deploy
    Creating deployment package.
    Creating IAM role: workshop-intro-dev
    Creating lambda function: workshop-intro-dev-hello_world
    Resources deployed:
      - Lambda ARN: arn:aws:lambda:us-west-2:123456789123:function:workshop-intro-dev-hello_world
    

Verification

  1. Run the chalice invoke command to invoke your newly deployed hello_world Lambda function:

    $ chalice invoke -n hello_world
    {"hello": "world"}
    

Lambda function using event parameter

Lambda functions accept two parameters: an event and a context parameter. The event parameter is used to provide data to the Lambda function. It is typically a dictionary, but may be a list, string, integer, float, or None. The context parameter provides information about the runtime to the Lambda function. This step will create a Lambda function that will use data from event passed to it to affect its return value.

Instructions

  1. Create an additional Lambda function hello_name using the app.lambda_function() decorator. The function should retrieve the value of the name key in the event parameter and return {'hello': name}:

    @app.lambda_function()
    def hello_name(event, context):
        name = event['name']
        return {'hello': name}
    

    Your app.py file should now consist of the following lines:

    from chalice import Chalice
    
    app = Chalice(app_name='workshop-intro')
    
    @app.lambda_function()
    def hello_world(event, context):
        return {'hello': 'world'}
    
    
    @app.lambda_function()
    def hello_name(event, context):
        name = event['name']
        return {'hello': name}
    
  2. Run chalice deploy to deploy your Chalice application with the new Lambda function:

    $ chalice deploy
    Creating deployment package.
    Creating IAM role: workshop-intro-dev
    Creating lambda function: workshop-intro-dev-hello_world
    Resources deployed:
      - Lambda ARN: arn:aws:lambda:us-west-2:123456789123:function:workshop-intro-dev-hello_world
      - Lambda ARN: arn:aws:lambda:us-west-2:123456789123:function:workshop-intro-dev-hello_name
    

Verification

  1. Run chalice invoke to invoke the hello_name Lambda function with {"name": "Kyle"} as the event payload:

    $ echo '{"name": "Kyle"}' | chalice invoke -n hello_name
    {"hello": "Kyle"}
    
  2. It is also possible for your Lambda function to encounter runtime errors. Passing in an empty event payload when invoking the hello_name will result in the Lambda Function returning a Traceback:

    $ chalice invoke -n hello_name
    Traceback (most recent call last):
      File "/var/task/chalice/app.py", line 901, in __call__
        return self.func(event, context)
      File "/var/task/app.py", line 12, in hello_name
        name = event['name']
    KeyError: 'name'
    Error: Unhandled exception in Lambda function, details above.
    

Delete the Chalice application

Now with an understanding of the basics of AWS Lambda and Chalice, let’s clean up this introduction application by deleting it remotely.

Instructions

  1. Run chalice delete to delete the deployed Lambda functions running this application:

    $ chalice delete
    Deleting function: arn:aws:lambda:us-west-2:123456789123:function:workshop-intro-dev-hello_name
    Deleting function: arn:aws:lambda:us-west-2:123456789123:function:workshop-intro-dev-hello_world
    Deleting IAM role: workshop-intro-dev
    

Validation

  1. Try running chalice invoke on the previously deployed Lambda functions:

    $ chalice invoke -n hello_world
    Could not find invokable resource with name: hello_world
    $ chalice invoke -n hello_name
    Could not find invokable resource with name: hello_name
    

    You should no longer be able to invoke both Lambda functions as they have been deleted.