Route53 and email (forwarding)

AWS is great, it has a ton of services to do whatever you had in mind and even things that you may not even thought about.

One of the services they offer is Route53, the DNS manager . I did use it to map to my loadbalancer. I moved the DNS from namecheap to AWS . The problem is that Route53 does not handle email (not forward nor anything).

There are several solutions, but the one I found the easiset is the one that involves mailgun . It allows you to forward emails to another email of yours (e.g. your gmail account), for free (right now). It should be even possible to use it as mail provider, but I never investigate that part.

To setup the email forwarding with mailgun:

  • subscribe to the service
  • create a domain, use the full domain as name without the www (don’t use the subdomain as suggested, read their docs for more info)
  • follow the DNS setup as explained by their webpage.
  • Once set up, create a route
    • Expression type: custom
    • raw expression: match_recipient(“.*@YOURDOMAIN.COM”)
    • actions: forward – YOUR EMAIL
  • Test the route with the tool at the bottom

Note that you need the raw expression beacuse in mailgun the routes are cross domain.



Previously I wrote a trick to use special-key (not the cerals) on mac without a mac keyboard. Well, if you use Karabiner the things are way more easy.

(except for complex shortcut, that is still a mistery for me how to write them)

Mac: Volume + Play/Stop without special buttons

Edit: use karabiner

I’m using an external keyboard beacuse my mac keyboard is falling apart and on top of it I use an external screen. The keyboard I’ve is pretty basic so it does not have the special keys to change volume, set mute, play stop spotify. but there’s a soltuion.. apple script

Create an apple script (service):

  • open automator
  • select service
  • on top select “no input”
  • on the left side sarch for “Run Apple Script”

Then you can add various behaviour, for example the one for volume is (this one is volume up, for volume down is the same with 0 and minus, for mute set it to 0)

set vol to output volume of (get volume settings)
if vol > 90 then # 100 max
set volume output volume 100
set volume output volume (vol + 5)
end if

Or to stop/playing spotify you can use

 if application "Spotify" is running then
 tell application "Spotify"
 end tell
end if 

Once saved (with the name you like the most), open:

  • System Preferences
  • keyboard
  • Shortcuts
  • Services
  • And on the bottom you will find all your scripts
  • Just assing a shortcut

Now you have full control even if you don’t have smart buttons . Personally I’ve:

  • volume up/down on cmd+alt+arrow up/down
  • mute cmd+alt+0
  • start/stop spotify cmd+alt+spacebar


Pomodoro + Super DND from Slack

I’m fund of pomodoro technique when I’ve to focus on some task, mainly coding or writing.

I’m a mac owner, and I found an handy app called Timer (that you can build for free from github) and has nice integrations with calendar and the possibility to run scripts (apple scripts)

Thus, since I don’t want to be disturbed I user the Script to:

  • Set the DND on slack
  • Set the status of slack to “working on a pomodoro”
  • (extra: stop spotify when the pomodoro is over)

This is good, the only problem is that Slack keeps showing red badges even if you are on DND. To avoid this you have to disable the badge icon app from notification menu. After a long time I found out how to do it (asking on AppleStackExchange)

The result of my script are

set appName to "Slack"
if running of application "System Preferences" then
   quit application "System Preferences"
   delay 1
end if
tell application "System Preferences"
   set the current pane to pane id ""
   delay 1
   tell application "System Events"
     tell table 1 of scroll area 1 of window 1 of application process "System Preferences"
     repeat with i from 1 to (count rows)
       if value of static text 1 of group 1 of UI element 1 of row i is appName then
         select row i
         exit repeat
       end if
     end repeat
     end tell
     delay 0.2
       click checkbox "Badge app icon" of group 1 of window 1 of application process "System Preferences"
   end tell
end tell

do shell script "curl '$duration'"
do shell script "curl --data 'token=THE_SLACK_TOKEN&profile=%7B%22status_text%22%3A%22working%20on%20a%20pomodoro%20%22%2C%22status_emoji%22%3A%22%3Atomato%3A%22%7D'"

and when ends I remove status, DND and stop spotify

if application "Spotify" is running then
tell application "Spotify"

end tell
end if
do shell script "curl"
do shell script "curl --data 'token=THE_SLACK_TOKEN&profile=%7B%0A%20%20%20%20%22status_text%22%3A%20%22%22%2C%0A%20%20%20%20%22status_emoji%22%3A%20%22%22%0A%7D'"

Docker Alpine for Django, DRF, UWSGi, Postgres and many more

I’m running a couple of project using docker as container engine. Most of them are python related project, which uses django, django rest framework, uwsgi, postgres and packages related to cryptography and much more.

Using the plain python:3 takes up a huge space, so i switched to python:3-alpine

with some problems in adding packages since they do not compile or run.

FROM python:3-alpine 
COPY requirements.txt . 
RUN set -e; \
 apk add --no-cache --virtual .build-deps \
 gcc \
 libc-dev \
 linux-headers \
 python3-dev \
 libffi-dev \
 openssl-dev \
 make \
 ; \
 apk add --no-cache postgresql-dev; \
 pip install --no-cache-dir uwsgi; \
 pip install --no-cache-dir -r requirements.txt; \
 apk del .build-deps; 


But I found a solution after wasting hours here and there..


  • that the postgresql-dev is not installed  as virtual.
  • If you want to have uwsgi use the internal routing (e.g., to avoid logs on health checks you have to install (not virtual)
    pcre pcre-dev

    and then use

     pip install --no-cache-dir -I uwsgi;

It install packages and then deletes them from the image. In the end the image is still pretty large 186MB but before it used to be around 7 times more .. (python:3 starts at ~690 MB).


Automated deployment of a docker on ECS 

ECS is nice, but has plenty of drawbacks (i’m using it since few weeks, and compared to kubernetes it’s a pain in that place..). Deploying a new release is one of the problem, you have to go to the website, add a new task, update the service and so on so forth.

Since I’m lazy and I hate wasting time for automated task, I created a script.

$(aws ecr get-login --no-include-email --region your_region )
docker build -t  your_pacakge .
docker tag your_pacakge your_ecs_repository_url/your_package
docker push your_ecs_repository_url
taskDef=$(aws ecs register-task-definition --cli-input-json file://ecs/task.json | jq -r '.taskDefinition.taskDefinitionArn')
aws ecs update-service --cluster  --service  --task-definition $taskDef 


  • the ecs/task.json is the json you get in the JSON tab when you create the task, copy that one and remove all the fields that have as value null.
  • it requires jq or you have to find a way to parse the output
  • the docker commands URL and TAGS are in the repository page of ecs, you can copy from them.

Similar approach works also with fabric , except the login part (fabric wraps shells, so command are executed one and not saved), thus execute the login in the console before running the fab command.

UWSGI avoid logs of health checks

Using UWSGI to run your app is handy, but it logs all the calls to all the urls. If you have a health check you end up having plenty of 200 calls in your log that can be distracting.

route = ^/health donotlog:

where /health (or part of it) is the healthcheck url. This will tell to uwsgi to do not post log at that url.

EDIT Just figured out that you need the pcre library compiled within uwsgi, here the solution SO question (for alpine you need apk install pcre pcre-dev)