django-ecsmanage
A Django app that provides a management command allowing you to run any other management command on an AWS Elastic Container Service (ECS) cluster.
With django-ecsmanage, you can easily run migrations and other one-off
tasks on a remote cluster from the command line:
$ django-admin ecsmanage migrate
Table of Contents
Installation
Install from PyPi using pip:
$ pip install django-ecsmanage
Update INSTALLED_APPS in your Django settings to install the app:
INSTALLED_APPS = (
...
'ecsmanage',
)
Configuration
Settings for the management command are kept in a single configuration
dictionary in your Django settings named ECSMANAGE_ENVIRONMENTS. Each
entry in ECSMANAGE_ENVIRONMENTS should be a key-value pair
corresponding to a named environment (like default or production)
and a set of AWS resources associated with that environment. For
example:
ECSMANAGE_ENVIRONMENTS = {
'default': {
'TASK_DEFINITION_NAME': 'StagingAppCLI',
'CONTAINER_NAME': 'django',
'CLUSTER_NAME': 'ecsStagingCluster',
'LAUNCH_TYPE': 'FARGATE',
'PLATFORM_VERSION': '1.4.0',
'SECURITY_GROUP_TAGS': {
'Name': 'sgAppEcsService',
'Environment': 'Staging',
'Project': 'ProjectName'
},
'SUBNET_TAGS': {
'Name': 'PrivateSubnet',
'Environment': 'Staging',
'Project': 'ProjectName'
},
'ASSIGN_PUBLIC_IP': 'DISABLED',
'AWS_REGION': 'us-east-1',
},
}
This configuration defines a single environment, named default, with
associated AWS ECS resources.
Environments
The key name for an environment can be any string. You can use this name
with the --env flag when running the command to run a command on a
different environment. Take this ECSMANAGE_ENVIRONMENTS configuration
as an example:
ECSMANAGE_ENVIRONMENTS = {
'default': {
'TASK_DEFINITION_NAME': 'StagingAppCLI',
'CLUSTER_NAME': 'ecsStagingCluster',
'SECURITY_GROUP_TAGS': {
'Name': 'sgStagingAppEcsService',
},
'SUBNET_TAGS': {
'Name': 'StagingPrivateSubnet',
},
},
'production': {
'TASK_DEFINITION_NAME': 'ProductionAppCLI',
'CLUSTER_NAME': 'ecsProductionCluster',
'SECURITY_GROUP_TAGS': {
'Name': 'sgProductionAppEcsService',
},
'SUBNET_TAGS': {
'Name': 'ProductionPrivateSubnet',
},
},
}
This configuration defines two environments, default and production.
Using the above settings, you could run production migrations with the
following command:
$ django-admin ecsmanage --env production migrate
If the --env argument is not present, the command will default to the
environment named default.
AWS Resources
The following environment configuration keys help the management command locate the appropriate AWS resources for your cluster:
+----------------+------------------------------------------+---------+
| > Key | > Description | > |
| | | Default |
+================+==========================================+=========+
| TASK_DE | The name of your ECS task definition. | |
| FINITION_NAME | The command will automatically retrieve | |
| | the latest definition. | |
+----------------+------------------------------------------+---------+
| C | The name of the Django container in your | |
| ONTAINER_NAME| ECS task definition. | django |
+----------------+------------------------------------------+---------+
| CLUSTER_NAME | The name of your ECS cluster. | |
+----------------+------------------------------------------+---------+
| SECURI | A dictionary of tags to use to identify | |
| TY_GROUP_TAGS | a security group for your task. | |
+----------------+------------------------------------------+---------+
| SUBNET_TAGS | A dictionary of tags to use to identify | |
| | a subnet for your task. | |
+----------------+------------------------------------------+---------+
| ASS | Whether to automatically assign a public |DI |
| IGN_PUBLIC_IP| IP address to your task. Can be | SABLED |
| | ENABLED or DISABLED. | |
+----------------+------------------------------------------+---------+
| LAUNCH_TYPE | The ECS launch type for your task. | F |
| | | ARGATE |
+----------------+------------------------------------------+---------+
| PLA | The Fargate platform version, if | |
| TFORM_VERSION|LAUNCH_TYPEisFARGATE. | LATEST |
+----------------+------------------------------------------+---------+
| AWS_REGION | The AWS region to run your task. | us- |
| | | east-1 |
+----------------+------------------------------------------+---------+
Developing
Local development is managed with Python virtual environments. Make sure that you have Python 3.8+ and pip installed before starting.
Install the development package in a virtual environment:
$ ./scripts/update
Run the tests:
$ ./scripts/test