https://github.com/zoph-io/url-shortener
serverless url-shortener
https://github.com/zoph-io/url-shortener
aws serverless url-shortener
Last synced: 4 months ago
JSON representation
serverless url-shortener
- Host: GitHub
- URL: https://github.com/zoph-io/url-shortener
- Owner: zoph-io
- Created: 2022-06-27T11:45:18.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2024-08-25T12:23:12.000Z (almost 2 years ago)
- Last Synced: 2024-08-25T18:25:05.730Z (almost 2 years ago)
- Topics: aws, serverless, url-shortener
- Language: Python
- Homepage: https://zoph.io
- Size: 2.12 MB
- Stars: 8
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# đ url-shortener
## đ§ Rationale
This _yet another url-shortener_, is the one I'm using for [AWS Security Digest Newsletter](https://awssecuritydigest.com) to track click rate from my readers.
I wasn't able to find an existing solution that match my needs so I crafted my own version, another excuse to learn something new đ¤.
Try out this AWS serverless url-shortener for your own usage and see the benefits it can bring.
It's perfect for shortening links and tracking analytics.
Plus, contributions and pull requests are welcome.
## đĄ Features
1. `Create` API
2. Companion static website (HTML + Javascript)
- [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) and [CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) compliant
3. Hits counter + Analytics (Persisted in DynamoDB)
## đ Powered by
- Lambda function (Python đ) + API Gateway
- CloudFront + S3 + ACM
- DynamoDB Table
- CloudFormation + SAM
## đ Schema

## đ Usage
### Pre-requirements
1. You will need to have an already issued AWS Certificate Manage (ACM) wildcard Certificate in `us-east-1` AWS region: `*.{your_domain}`
2. Configure the proper parameters in the `Makefile` like the Route53 hosted zone Id (`HostedZoneId`)
#### đ Parameters
| Parameters | Default Value | Description |
| --------------- | ----------------- | --------------------------------------------------------------- |
| Product | `url-shortener` | Product Name |
| Project | `zophio` | Project Name |
| Environment | `dev` | Environment Name |
| MinChar | `3` | Minimum characters for the random shortened link id |
| MaxChar | `3` | Maximum characters for the random shortened link id |
| Domain | `zoph.io` | Desired Domain (must be linked to the `HostedZoneId` Parameter) |
| SubDomain | `shortener` | Desired subdomain of the API |
| HostedZoneId | `Required` | AWS Route53 `HostedZoneId` where your domain name belongs |
| FallbackUrl | `https://zoph.io` | When the url does not exist, fallback url |
| CertificateArn | `Required` | Arn of the Wildcard ACM Certificate (`us-east-1`) |
| AWSRegion | `eu-west-1` | AWS Region |
| AlertsRecipient | `Required` | Email of the recipient of CloudWatch Alarms |
### Deployment
$ make deploy
$ make setup_front
### How to shorten urls?
#### Using Companion Static Website
Go to the following website after the deployment (depends on your parameters :point_up_2:)
Demo:
[](https://short.zph.app)
- `https://short.{Domain}`
#### Using the `Makefile`
$ make url 'https://google.com'
> âšī¸ Simple quotes are important
#### Using `cURL`
```bash
curl -X POST https://{subdomain}.{domain}/create/ \
--header "Content-Type: application/json" \
-d '{"long_url": "https://google.com"}'
```
Optionnaly, you can change the default TTL value (7 days), by using the `ttl_in_days` attribute in body request:
```bash
curl -X POST https://{subdomain}.{domain}/create/ \
--header "Content-Type: application/json" \
-d '{"long_url": "https://google.com", "ttl_in_days": 365}'
```
Optionnaly, you can ask for a _human readable_ (`false` by default) short id, ie a suite of consonants/vowels, easier to read/remember.
```bash
curl -X POST https://{subdomain}.{domain}/create/ \
--header "Content-Type: application/json" \
-d '{"long_url": "https://google.com", "ttl_in_days": 3, "human_readable": true}'
```
Response:
```json
{
"short_id": "baho",
"created_at": "2024-08-24T15:28:04",
"ttl": 1724772484,
"short_url": "https://{subdomain}.{domain}/baho",
"long_url": "https://google.com"
}
```
> **Note**: the generated short id is lowercase to avoid any human mistake.
##### Response sample
```json
{
"created_at": "2023-01-17T13:37:00",
"long_url": "https://zoph.io",
"short_id": "dBC",
"short_url": "https://{subdomain}.{domain}/dBC",
"ttl": 1674561936
}
```
## đ Reference
- [Blog post](https://blog.ruanbekker.com/blog/2018/11/30/how-to-setup-a-serverless-url-shortener-with-api-gateway-lambda-and-dynamodb-on-aws/)
- [Makefile](https://itecnote.com/tecnote/r-how-to-pass-argument-to-makefile-from-command-line/)
- [CloudFront stack](https://github.com/aws-samples/amazon-cloudfront-secure-static-site/tree/master)