Chalice Stages

Chalice has the concept of stages, which are completely separate sets of AWS resources. When you first create a chalice project and run commands such as chalice deploy and chalice url, you don’t have to specify any stage values or stage configuration. This is because chalice will use a stage named dev by default.

You may eventually want to have multiple stages of your application. A common configuration would be to have a dev, beta and prod stage. A dev stage would be used by developers to test out new features. Completed features would be deployed to beta, and the prod stage would be used for serving production traffic.

Chalice can help you manage this.

To create a new chalice stage, specify the --stage argument. If the stage does not exist yet, it will be created for you:

$ chalice deploy --stage prod

By creating a new chalice stage, a new API Gateway rest API, Lambda function, and potentially (depending on config settings) a new IAM role will be created for you.

Example

Let’s say we have a new app:

$ chalice new-project myapp
$ cd myapp
$ chalice deploy
...
https://mmnkdi.execute-api.us-west-2.amazonaws.com/api/

We’ve just created our first stage, dev. We can iterate on our application and continue to run chalice deploy to deploy our code to the dev stage. Let’s say we want to now create a prod stage. To do this, we can run:

$ chalice deploy --stage prod
...
https://wk9fhx.execute-api.us-west-2.amazonaws.com/api/

We now have two completely separate rest APIs:

$ chalice url --stage dev
https://mmnkdi.execute-api.us-west-2.amazonaws.com/api/

$ chalice url --stage prod
https://wk9fhx.execute-api.us-west-2.amazonaws.com/api/

Additionally, we can see all our deployed values by looking at the .chalice/deployed/dev.json or .chalice/deployed/prod.json files:

$ cat .chalice/deployed/dev.json
{
  "resources": [
    {
      "name": "api_handler",
      "resource_type": "lambda_function",
      "lambda_arn": "arn:aws:lambda:...:function:myapp-dev"
    },
    {
      "name": "rest_api",
      "resource_type": "rest_api",
      "rest_api_id": "wk9fhx",
      "rest_api_url": "https://wk9fhx.execute-api.us-west-2.amazonaws.com/api/"
    }
  ],
  "schema_version": "2.0",
  "backend": "api"
}

$ cat .chalice/deployed/prod.json
{
  "resources": [
    {
      "name": "api_handler",
      "resource_type": "lambda_function",
      "lambda_arn": "arn:aws:lambda:...:function:myapp-prod"
    },
    {
      "name": "rest_api",
      "resource_type": "rest_api",
      "rest_api_id": "mmnkdi",
      "rest_api_url": "https://mmnkdi.execute-api.us-west-2.amazonaws.com/api/"
    }
  ],
  "schema_version": "2.0",
  "backend": "api"
}