What you’ll set up
Beacon on each Mac records agent activity and uploads it to your bucket with a key that can only write. For each new object, S3 posts a notice to a queue. Asymptote reads the queues to learn which objects are new, fetches them with a read-only key, and loads them into your dashboard. The bucket stays yours and keeps every object. In your AWS account:- A new S3 bucket just for Beacon, with public access blocked, ACLs disabled, HTTPS required, default encryption, and versioning.
beacon-endpoint-writer, an IAM user your Macs upload with. It can add objects below your Beacon prefix and nothing else.asymptote-s3-reader, an IAM user Asymptote reads with. It can list the bucket, read objects below the prefix, and consume the queues.- Two SQS queues, one for agent activity (
runtime) and one for inventory, each with a dead-letter queue. They let Asymptote load objects in any order, so an upload that arrives late is never skipped.
Asymptote receives the telemetry your Macs upload in full, after Beacon’s local redaction of secrets: prompts, the commands agents ran and their output, tool inputs and outputs, and file paths and diffs.
Before you start
1. Create the bucket and access
Pick a root prefix such asbeacon-prod. Beacon adds runtime/ and inventory/ below it, so don’t put either in the prefix. Create everything in the region you want the bucket in.
- Terraform
- AWS CLI
Create a Apply it:Review the plan and type
main.tf in a new directory. Change the region, bucket name, and prefix:main.tf
yes. It’s working when the apply ends with Apply complete! Resources: 18 added and prints the outputs. Keep them for step 3. Encryption with your own KMS key, object expiry, and other options are in the base module’s variables.tf.2. Create the access keys
Create both keys with the AWS CLI, so their secrets never enter Terraform state:AKIA and don’t expire.
- Writer key: store it in your MDM’s secret store. Your Macs use it in step 4.
- Reader key: you send it to Asymptote in step 3. Don’t keep it anywhere else.
3. Send Asymptote the details
Send these through the secure channel your Asymptote contact gives you. Don’t send the secret access key by email or chat.
Asymptote connects the bucket to your organization and tells you when it’s done.
4. Roll out Beacon to your Macs
Try it on one Mac first, or go straight to your MDM.- One Mac (no MDM)
- Fleet, Jamf, or Rippling
Install Beacon. On an Apple Silicon Mac, in Terminal while logged in at the Mac:The block checks the package against its published SHA-256 and its Apple signature before installing. It’s working when the output shows the forwarder’s
Download, verify, and install
pkgutil should print Status: signed by a developer certificate issued by Apple for distribution. The package sets up Claude Code and Codex for the logged-in user; Try Beacon on One Mac covers what it installs and how to add other agents.Start the forwarder with your values from step 1 and the writer key from step 2:state = running. The helper keeps the key in a root-only file for the forwarder service, so you can close Terminal. When you roll out with an MDM later, this Mac gets the same setup again.5. Confirm it works
On a Mac with Beacon installed, write a test event:Operate
Rotate the keys
IAM allows two keys per user, so the old key keeps working while you switch.- Writer: create a second key, give it to your MDM and rerun its forwarder setup on every Mac, then delete the old key.
- Reader: create a second key, send it to Asymptote, and delete the old key once Asymptote confirms the switch.
Remove
- Ask Asymptote to disconnect the bucket.
- Remove the forwarder from your Macs. Uninstalling Beacon removes it.
- Delete both access keys:
aws iam delete-access-key --user-name <user> --access-key-id <key id>. IAM refuses to delete a user that still has keys. - Run
terraform destroy. It stops at a bucket that still holds objects. To delete the telemetry too, addforce_destroy = trueto thebeacon_s3module, runterraform apply, and then destroy.
Troubleshooting
BucketAlreadyExists
BucketAlreadyExists
Someone else, in any AWS account, already has a bucket with that name. Choose another bucket name.
S3 can only notify queues in the bucket's own region
S3 can only notify queues in the bucket's own region
The provider that runs the reader module is in a different region from the bucket. Use the same provider, in the bucket’s region, for both modules.
Objects arrive in the bucket but not in Asymptote
Objects arrive in the bucket but not in Asymptote
Check the queues:
aws sqs get-queue-attributes --queue-url <queue url> --attribute-names ApproximateNumberOfMessages. A number that keeps growing means Asymptote isn’t consuming it yet; send your Asymptote contact the queue URL. Messages that failed ten times wait in the -dlq queue for 14 days.DeleteConflict: Cannot delete entity, must delete access keys first
DeleteConflict: Cannot delete entity, must delete access keys first
terraform destroy is trying to delete a user that still has a key you created with the AWS CLI. Delete the key first.Related
Google Cloud Storage
The same setup with a Cloud Storage bucket.
Beacon with Fleet and S3
Roll out Beacon with Fleet.
AWS S3 with Terraform
The bucket and writer on their own, without Asymptote reading them.
Hosting options
Compare Managed, Open Source, and Private Deployment.