Using EC2 for Docker Based Deployments

The dallinger commandline tool has some helpers for managing EC2 instances to help facilitate using docker to deploy experiments on those instances (see Docker support).

Initial Setup

Route53 DNS

If your lab is doing this for the first time, you probably need to acquire a domain name for your experiment server. This is the parent URL that will be used to host your experiments. If your lab already has a domain name, you can skip this step. On the AWS online console, navigate to the Route 53 service. On the Dashboard you can register a domain name. Note that different domain names come with different costs, and that registering a domain name can take from a few minutes to several hours. Before proceeding with the next steps, please wait until the AWS console tells you that the registration is complete.

The examples below assume that you have setup a domain my-experiments.org in Route53.

EC2 Security Group

By default the dallinger ec2 commands will provision instances with the security group dallinger. If that group does not exist, one will be created with appropriate ingress rules. You can use an existing security group by specifying the --security_group_name option on the commandline, or by setting the ec2_default_security_group value in your ~/.dallingerconfig file.

EC2 SSH Key Pair (PEM File)

By default the dallinger ec2 commands will use an SSH key pair named dallinger to create instances. If that key pair does not exist, one will be created and added to your SSH keychain. You can use an existing SSH key pair by specifying the --pem option on the commandline, or by setting the ec2_default_pem value in your ~/.dallingerconfig file.

AWS Region

Except where noted, when --region is not specified then the config value set in aws_region in e.g. ~/.dallingerconfig will be used.

Provisioning an EC2 server instance

Note: If you decide to deploy to an EC2 instance, you need to “hire” the server (Provisioning). Once you do that – the clock is ticking and you will be charged hourly until you release it (Teardown).

To provision an on-demand EC2 instance:

dallinger ec2 provision --name <server_name> --region <region> --dns-host <subdomain>.my-experiments.org --type <type> --pem <pem> --security_group_name <security_group>

Pick an instance name which is easy to recognize, for example ‘tapping_deployment_batch_2’ is good but ‘melody123’ would be bad:

dallinger ec2 provision --name tapping_deployment_batch_2 --region <region> --dns-host <subdomain>.my-experiments.org --type <type>

For example, if you want to collect data in Paris your command will include the region name for Paris, like this:

dallinger ec2 provision --name tapping_deployment_batch_2 --region eu-west-3 --dns-host <subdomain>.my-experiments.org --type <type>

Subdomain name should target your identity so it could be your own name. For example:

dallinger ec2 provision --name tapping_deployment_batch_2 --region eu-west-3 --dns-host elif.my-experiments.org --type <type>

You should use a different instance type according to your need. m7i.large is recommended for debugging and m7i.xlarge is for deploying. For example:

dallinger ec2 provision --name tapping_deployment_batch_2 --region eu-west-3 --dns-host elif.my-experiments.org -

You can configure different amounts of storage or different instance types:

dallinger ec2 provision --name <server_name> --region <region> --storage 100 --type m5.2xlarge

Increasing Storage on An Instance

You can increase the storage on a running instance by server name:

dallinger ec2 increase-storage --name <server_name> --region <region> --storage 200

Or by DNS name:

dallinger ec2 increase-storage --dns <subdomain>.my-experiments.org --region <region> --storage 200

Stopping and Starting

You can temporarily stop a running instance to prevent it from incurring hourly costs (while retaining its stored data):

dallinger ec2 stop --name <server_name> --region <region>
dallinger ec2 stop --dns <subdomain>.my-experiments.org --region <region>

Similarly you can start a stopped instance:

dallinger ec2 start --name <server_name> --region <region>
dallinger ec2 start --dns <subdomain>.my-experiments.org --region <region>

Or restart a running instance:

dallinger ec2 restart --name <server_name> --region <region>
dallinger ec2 restart --dns <subdomain>.my-experiments.org --region <region>

Teardown an EC2 Instance

Important: don’t forget to export your data before you tear down the server. If you don’t all data is lost and there is NO way to retrieve them. Before you teardown the instance make sure:

  • The experiment is stopped on the recruiter, e.g. in Prolific the experiment should be STOPPED and thus not active

  • Make sure you exported your data and run export.py to make sure your data is not faulty

To teardown an on-demand EC2 instance ny server name:

dallinger ec2 teardown --name <server_name> --region <region>

Or by DNS name:

dallinger ec2 teardown --dns <subdomain>.my-experiments.org --region <region>

Listing Available Regions and Instance Types

You can list the available EC2 regions using:

dallinger ec2 list regions

Different instance types may be available in different regions, you can list the available instance types for a region using:

dallinger ec2 list instance_types --region <region>

Listing Existing Instances

Dallinger provides some tools for introspecting your current EC2 resources. You can list all instances:

dallinger ec2 list instances --region <region>

Or filter based on instance state:

dallinger ec2 list instances --region <region> --running
dallinger ec2 list instances --region <region> --stopped --terminated

Additionally you can filter based on instance PEM key name:

dallinger ec2 list instances --region <region> --running --pem my-pem

Note: If --region is not explicitly specified instances in all regions will be listed.

Connecting to a Container Running an Experiment

You can make an SSH connection to the docker container running the a specific experiment using the server DNS name and the experiment app name with the following command:

dallinger ssh web --dns <subdomain>.my-experiments.org --app <subdomain>.my-experiments.org