{"id":13629683,"url":"https://github.com/myzie/burrow","last_synced_at":"2025-07-28T06:04:39.944Z","repository":{"id":250461621,"uuid":"833900471","full_name":"myzie/burrow","owner":"myzie","description":"Burrow is a globally distributed HTTP proxy via AWS Lambda","archived":false,"fork":false,"pushed_at":"2024-12-17T13:50:37.000Z","size":116,"stargazers_count":242,"open_issues_count":0,"forks_count":8,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-05-24T08:03:58.490Z","etag":null,"topics":["aws","aws-lambda","golang","http","proxy","proxy-server","serverless"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/myzie.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-26T02:17:05.000Z","updated_at":"2025-04-01T20:10:05.000Z","dependencies_parsed_at":"2024-08-14T16:04:03.379Z","dependency_job_id":"5338637c-4e85-40d8-b150-a63518f762ea","html_url":"https://github.com/myzie/burrow","commit_stats":null,"previous_names":["myzie/burrow"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/myzie/burrow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/myzie%2Fburrow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/myzie%2Fburrow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/myzie%2Fburrow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/myzie%2Fburrow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/myzie","download_url":"https://codeload.github.com/myzie/burrow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/myzie%2Fburrow/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267470062,"owners_count":24092352,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-28T02:00:09.689Z","response_time":68,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","aws-lambda","golang","http","proxy","proxy-server","serverless"],"created_at":"2024-08-01T22:01:16.550Z","updated_at":"2025-07-28T06:04:39.896Z","avatar_url":"https://github.com/myzie.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# Burrow\n\nBurrow is a serverless and globally-distributed HTTP proxy for Go built on\nAWS Lambda.\n\nIt is designed to be completely compatible with the standard Go `*http.Client`\nwhich means it can be transparently added to many existing applications. Burrow\nprovides an implementation of the `http.RoundTripper` interface that proxies\nrequests through one or more AWS Lambda functions exposed with\n[Function URLs](https://docs.aws.amazon.com/lambda/latest/dg/urls-configuration.html).\n\nA round-robin transport is also provided which makes it trivial to automatically\nrotate through multiple Lambda functions in different regions.\n\n## Rationale\n\nBurrow gives you a network of rotating IPs in different regions, which can be\nuseful in a variety of situations, including:\n\n- Development: test how your app behaves when accessed from different regions.\n- Load testing: simulate distributed global traffic for your services.\n- Privacy: anonymous IP addresses when making web requests.\n- Geo-restriction bypass: access region-limited content or services.\n- API rate limiting: reduce the effects of IP address usage quotas when calling APIs.\n- Web scraping: efficiently collect data in a distributed manner.\n- Multi-region testing: Verify application behavior across different global regions.\n\nPerformance for individual requests through Burrow can be slow, especially when\nrouting through distant regions. However, Burrow is designed for highly concurrent\nuse in Go, where overall throughput matters more than individual request latency.\n\n## Features\n\n- Easy-to-use proxy via `http.RoundTripper` implementation\n- Optional round-robin transport for rotating through multiple lambda proxies\n- Terraform for one command deployment to 17 AWS regions\n\n## Usage\n\nAdd burrow package to your Go project:\n\n```bash\ngo get github.com/myzie/burrow\n```\n\nManually enable on an `http.Client`:\n\n```go\nproxy := \"https://randomprefix.lambda-url.eu-west-2.on.aws/\"\nclient := \u0026http.Client{Transport: burrow.NewTransport(proxy, \"POST\")}\n// Now use the *http.Client as you would normally\n```\n\nCreate a round-robin transport:\n\n```go\nproxies := []string{\n    \"https://randomprefix1.lambda-url.us-east-1.on.aws/\",\n    \"https://randomprefix2.lambda-url.us-east-2.on.aws/\",\n    \"https://randomprefix3.lambda-url.us-west-1.on.aws/\",\n}\nvar transports []http.RoundTripper\nfor _, u := range proxies {\n    transports = append(transports, burrow.NewTransport(u, \"POST\"))\n}\nclient := \u0026http.Client{\n    Transport: burrow.NewRoundRobinTransport(transports),\n}\n// Client will now rotate through the provided proxies for each request\n```\n\nOr use the `burrow.NewClient` helper (recommended):\n\n```go\nclient := burrow.NewClient(\n    burrow.WithProxyURLs([]string{\n        \"https://randomprefix1.lambda-url.us-east-1.on.aws/\",\n        \"https://randomprefix2.lambda-url.us-east-2.on.aws/\",\n        \"https://randomprefix3.lambda-url.us-west-1.on.aws/\",\n    }),\n    burrow.WithRetries(3),\n    burrow.WithRetryableCodes([]int{429}),\n    burrow.WithTimeout(30 * time.Second),\n    burrow.WithMaxResponseBytes(10 * 1024 * 1024), // 10 MB\n    burrow.WithAllowedContentTypes([]string{\n        \"application/json\",\n        \"text/plain\",\n    }),\n    burrow.WithCallback(func(ctx context.Context, proxyResponse *burrow.Response) {\n        log.Printf(\"request proxied\")\n    }),\n)\n```\n\n## Multi-Region Deployment in AWS\n\nBurrow includes Terraform configurations to deploy Burrow across the 17\ndefault-enabled AWS regions in your account with a single command:\n\n```bash\nmake deploy BUCKET_NAME=my-terraform-state-bucket\n```\n\nWhen the command completes, a `function_urls.json` file is written which contains\nthe URL for each Lambda function in each region. You can then read this file in\nyour Go program and pass the values to `burrow.NewRoundRobinClient`.\n\nSee the Makefile for more information. You'll need the following installed:\n\n- terraform\n- make\n- go\n- jq\n- aws cli\n\nThe default-enabled AWS regions:\n\n```\nap-northeast-1 - Tokyo\nap-northeast-2 - Seoul\nap-northeast-3 - Osaka\nap-south-1 - Mumbai\nap-southeast-1 - Singapore\nap-southeast-2 - Sydney\nca-central-1 - Canada Central\neu-central-1 - Frankfurt\neu-north-1 - Stockholm\neu-west-1 - Ireland\neu-west-2 - London\neu-west-3 - Paris\nsa-east-1 - Sao Paulo\nus-east-1 - N. Virginia\nus-east-2 - Ohio\nus-west-1 - N. California\nus-west-2 - Oregon\n```\n\n## Future Enhancements\n\n- Optional API key authentication in the Lambda proxy\n- Tests\n- Other suggestions?\n\n## Examples\n\n- [cmd/example_client/main.go](cmd/example_client/main.go)\n- [cmd/example_multi_region/main.go](cmd/example_multi_region/main.go)\n\nThe multi-region example makes requests to `https://api.ipify.org?format=json`\nto demonstrate how the proxy IP address changes across regions.\n\n```bash\n$ go run ./cmd/example_multi_region\n{\"ip\":\"13.36.171.187\"}\n{\"ip\":\"13.208.187.84\"}\n{\"ip\":\"18.142.184.58\"}\n{\"ip\":\"3.106.212.219\"}\n{\"ip\":\"13.60.11.169\"}\n{\"ip\":\"43.200.183.53\"}\n{\"ip\":\"3.127.170.76\"}\n{\"ip\":\"3.238.225.252\"}\n{\"ip\":\"54.185.130.119\"}\n{\"ip\":\"54.168.55.243\"}\n{\"ip\":\"13.201.18.225\"}\n{\"ip\":\"15.222.11.134\"}\n{\"ip\":\"54.247.221.168\"}\n{\"ip\":\"13.40.174.185\"}\n{\"ip\":\"15.228.175.92\"}\n{\"ip\":\"3.137.163.176\"}\n{\"ip\":\"54.177.165.5\"}\n{\"ip\":\"13.36.171.187\"} # Back to the first region\n```\n\n## Custom Development and Consulting\n\nThe author of Burrow [@myzie](https://github.com/myzie) is available for\ncontract work and consulting. Feel free to reach out on Github or Linkedin for\nhelp with anything related to Go, AWS, Terraform, cloud security, or SaaS\ndevelopment. See my [profile](https://github.com/myzie) for my Linkedin.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a pull request.\n\n## License\n\nApache License 2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmyzie%2Fburrow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmyzie%2Fburrow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmyzie%2Fburrow/lists"}