0.2.58

Features

  • Added support for private AWS ECR images in the SDK
  • Added support to delete volumes in the CLI
  • Added stats.active_containers and stats.queue_depth to the v2/task/<task-id> endpoint
  • Added displaying public endpoint URLs when calling beam deploy
  • Added tailing logs using --stub-id with the beam logs command
  • Added a Serves page to the dashboard
  • Overview page now only shows the latest Deployment and not all versions of all deployments
  • Added a Versions page to the Deployment page

Bug Fixes

  • Fixed temp file creation in SDK when syncing files on Windows

How to update

pip install --upgrade beam-client

Use private AWS ECR images

Export your AWS credentials in your shell and pass the environment variable names to base_image_creds as a list. This syntax will lookup the environment variable values for you.

image = Image(
    base_image="111111111111.dkr.ecr.us-east-1.amazonaws.com/my-app:latest",
    base_image_creds=[
        "AWS_ACCESS_KEY_ID",
        "AWS_SECRET_ACCESS_KEY",
        "AWS_SESSION_TOKEN",
        "AWS_REGION",
    ],
)

@endpoint(image=image)
def squared(i: int = 0) -> int:
    return i**2

We also accept a dict where you can provide the values.

image = Image(
    base_image="111111111111.dkr.ecr.us-east-1.amazonaws.com/my-app:latest",
    base_image_creds={
      "AWS_ACCESS_KEY_ID": "xxxx",
      "AWS_SECRET_ACCESS_KEY": "xxxx"
      "AWS_REGION": "xxxx"
    },
)

You can authenticate with either your static AWS credentials or an AWS STS token. The latter requires that the AWS_SESSION_TOKEN key be set.

Delete a volume

You can now delete volumes using the following command.

beam volume delete my-volume-name

Getting stats from the task API

We’ve added a new stats object to the task API response. It includes the number of active containers and queue depth of tasks.

curl -H 'Authorization: Bearer <your-beam-token>' https://api.beam.cloud/v2/task/07ce4078-bccc-4a42-b530-5f2653484a6a/ | jq
{
  "id": "07ce4078-bccc-4a42-b530-5f2653484a6a",
  "started_at": "2024-07-22T14:02:28.466278Z",
  "ended_at": "2024-07-22T14:02:28.475954Z",
  "status": "COMPLETE",
  "container_id": "endpoint-d327e987-759d-493e-b3e4-005774bcf998-8b747792",
  "updated_at": "2024-07-22T14:02:28.477026Z",
  "created_at": "2024-07-22T14:02:28.413232Z",
  "outputs": [],
  "stats": {
    "active_containers": 0,
    "queue_depth": 0
  },
  "stub": {
    "id": "d327e987-759d-493e-b3e4-005774bcf998",
    "name": "endpoint/deployment/app:squared",
    "type": "",
    "config": "{\"runtime\":{\"cpu\":1000,\"gpu\":\"\",\"memory\":128,\"image_id\":\"4724a2a2dfb601d8\"},\"handler\":\"app:squared\",\"on_start\":\"\",\"python_version\":\"python3.10\",\"keep_warm_seconds\":180,\"max_pending_tasks\":100,\"callback_url\":\"\",\"task_policy\":{\"max_retries\":0,\"timeout\":180,\"expires\":\"0001-01-01T00:00:00Z\"},\"workers\":1,\"authorized\":false,\"volumes\":null,\"autoscaler\":{\"type\":\"queue_depth\",\"max_containers\":1,\"tasks_per_container\":1}}",
    "config_version": 0,
    "object_id": 0,
    "created_at": "0001-01-01T00:00:00Z",
    "updated_at": "0001-01-01T00:00:00Z"
  }
}

Public URL displayed in CLI

Calling beam deploy has always showed the URL of your app, but it didn’t show the public URL when an endpoint had authorized=False set until today.

Here’s an example endpoint.

@endpoint(authorized=False)
def squared(i: int = 0):
    print(f"{i**2=}")
    return i**2

Let’s deploy it and see what the URL looks like.

beam deploy app.py:squared --name squared-noauth
=> Building image
=> Using cached image
=> Syncing files
Reading .beta9ignore file
Collecting files from /Users/nick/Projects/beam-client/test
Added /Users/nick/Projects/beam-client/test/.beamignore
Added /Users/nick/Projects/beam-client/test/app.py
Added /Users/nick/Projects/beam-client/test/hello.txt
=> Files synced
=> Deploying endpoint
=> Deployed 🎉
=> Invocation details
curl -X POST 'https://app.beam.cloud/endpoint/public/a060102b-04d1-4248-8083-bc71c0e49975' \
-H 'Connection: keep-alive' \
-H 'Content-Type: application/json' \
-d '{}'

Using stub ID to tail logs

We’ve added —stub-id to the beam logs command. Here’s how it can be used.

Go to platform.beam.cloud and click on your deployment then click the copy button next to “Stub ID”.

Use the stub Id in the following command.

beam logs --stub-id a060102b-04d1-4248-8083-bc71c0e49975
[2024-07-22 18:08:54 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2024-07-22 18:08:54 +0000] [1] [INFO] Listening at: http://[::]:38311 (1)
[2024-07-22 18:08:54 +0000] [1] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2024-07-22 18:08:54 +0000] [7] [INFO] Booting worker with pid: 7
[2024-07-22 18:08:56 +0000] [7] [INFO] Started server process [7]
[2024-07-22 18:08:56 +0000] [7] [INFO] Waiting for application startup.
[2024-07-22 18:08:56 +0000] [7] [INFO] Application startup complete.
Received task <f3ca38ba-cd60-49d8-8d30-4901f55bfd44>
i**2=0
2024-07-22 18:08:56,856 - INFO - 2600:1f18:4df4:404:9539::2:49002 - "POST / HTTP/1.1" 200
Received task <3f96aa85-182f-42b2-bea5-f74a96c9a1e6>
i**2=0
2024-07-22 18:09:06,897 - INFO - 2600:1f18:4df4:406:2b0a::2:46870 - "POST / HTTP/1.1" 200
Received task <d14473a9-cb7b-4d7e-8633-b4c5e2725361>
i**2=25
2024-07-22 18:09:18,459 - INFO - 2600:1f18:4df4:405:71ac::1:57046 - "POST / HTTP/1.1" 200
[2024-07-22 18:12:18 +0000] [1] [INFO] Handling signal: term
[2024-07-22 18:12:18 +0000] [7] [INFO] Shutting down
[2024-07-22 18:12:18 +0000] [7] [INFO] Waiting for application shutdown.
[2024-07-22 18:12:18 +0000] [7] [INFO] Application shutdown complete.
[2024-07-22 18:12:18 +0000] [7] [INFO] Finished server process [7]
[2024-07-22 18:12:18 +0000] [1] [WARNING] Worker with pid 7 was terminated due to signal 15
[2024-07-22 18:12:18 +0000] [1] [INFO] Shutting down: Master
⠹ Streaming...

Serves on the dashboard

Serves is back on the menu! You can find them on the dashboard.

Overview page only shows latest version of deployment

We’ve made the Overview page a little cleaner by only showing the latest version of your deployments.

Deployment page has a new Versions page

To make sure you can still see your deployment versions, we’ve given them a new home under your deployment.