Here, at Universidad Rey Juan Carlos, where we’re working hard to deploy Elastest, we’ve the need to run instances on AWS all the time. We, of course, have defined CloudFormation Templates to do the work but we can go further with just push a button (a physical one, indeed) so every time a team member needs to test something on Elastest, push the button!
Let’s see how it works
First of all, you need an Amazon Dash Button, I chose Optimum Nutrition a brand for gym diet, don’t ask why.
To configure the device, we follow the steps from Amazon’ guide till we have to choose a product. We avoid that because we don’t want to order products each time we push the button. So we’ve the device attached to our network and we need to know the MAC address.
We’re gonna use a Python project Amazon Dash to do that. First, we install it:
$ sudo pip install amazon-dash # and after: $ sudo python -m amazon_dash.install
Scan the network to find the device:
$ sudo amazon-dash discovery
Launch the command and wait like 10 seconds, then push the button and you’ll see the MAC address. Copy it for the next step.
Dash Button is based on systemd (which means that you must stop and start it on each change) and it has a yaml file for configuration (in /etc/amazon-dash.yml). It’s quite simple for out needs, should look like:
# amazon-dash.yml # --------------- settings: # On seconds. Minimum time that must pass between pulsations. delay: 10 devices: fc:65:de:1b:2e:8a: name: Elastest-dashbutton user: nordri cmd: PATH/TO/deploy-elastest.sh
For each device we have, we can define a stanza with a command to run. We set the user that will be the user who run the command. As you can imagine, the script is an AWS Cli command for CloudFormation like this one:
#!/bin/bash DATE_SUFFIX=$(date +%s) aws cloudformation create-stack \ --stack-name Elastest-dashbutton-$DATE_SUFFIX \ --template-url https://s3-eu-west-1.amazonaws.com/aws.elastest.io/cloud-formation-latest.json \ --parameters '[{ "ParameterKey": "KeyName", "ParameterValue": "kms-aws-share-key" }]' \ --profile naeva
Feel free to use the script on its own. Just remember to change the RSA key you use to access your instances on AWS and the auth profile.
That’s it, from now on, every push will result in an Elastest instance running on AWS.
Here, one could say
OK, mate, that’s pretty cool but deploying Elastest takes like 400 seconds and pushing a button won’t tell me when the instance is ready and, where should I connect to use the platform
Fair enough! Let’s configure the notifications.
Amazon Dash has confirmations to actually confirm that the button was pushed, but as our friend said before, we should notify when the instance is ready, to do that, we’re using a Telegram Bot. It’s quite simple to ask the Telegram’ @botfather for an Auth Token and start using it. So, out script to deploy Elastest now is like:
#!/bin/bash DATE_SUFFIX=$(date +%s) # Telegram data USERID="...." KEY="...." TIMEOUT="10" URL="https://api.telegram.org/bot$KEY/sendMessage" aws cloudformation create-stack \ --stack-name Elastest-dashbutton-$DATE_SUFFIX \ --template-url https://s3-eu-west-1.amazonaws.com/aws.elastest.io/cloud-formation-latest.json \ --parameters '[{ "ParameterKey": "KeyName", "ParameterValue": "kms-aws-share-key" }]' \ --profile naeva aws cloudformation wait stack-create-complete --stack-name Elastest-dashbutton-$DATE_SUFFIX --profile naeva ELASTEST_URL=$(aws cloudformation describe-stacks --stack-name Elastest-dashbutton-$DATE_SUFFIX --profile naeva | jq --raw-output '.Stacks[0] | .Outputs[0] | .OutputValue') TEXT="New Elastest deployed on $ELASTEST_URL" curl -s --max-time $TIMEOUT -d "chat_id=$USERID&disable_web_page_preview=1&text=$TEXT" $URL > /dev/null
And, anyway, let’s configure the confirmation, so we’ll know when the button is pushed. To do so, see this Amazon Dash’ configuration file:
devices: fc:65:de:1b:2e:8a: name: Elastest-dashbutton user: nordri cmd: PATH/TO/deploy-elastest.sh confirmation: Telegram confirmations: Telegram: service: telegram token: '...' to: ... is_default: true
Now, every time one of the team member needs an AWS instance to test Elastest, we’ll receive a notification at the beginning and another as soon as it’s ready.
Dash button cost 5€ and keep me busy for a day, not bad investment at all 😉