A tool for simplifying swarming of fixing AWS tags
Project description
aws-tag-a-day
A tool for simplifying multiple people fixing tags by proposing a tag a day for resources with those missing tags.
Installation
pip install aws-tag-a-day
Quickstart
# Generate configuration file
mkdir -p ~/.config/tagaday/
cat > ~/.config/tagaday/config.yml <<EOY
dynamodb-table-name: 'tag-proposals'
dynamodb-table-region: 'eu-west-2'
services:
- rds
- ec2
- s3
- emr
regions:
- us-east-1
required-tags:
- Project
- Owner
- Name
- Service
- Availability
EOY
# Create dynamodb table defined in the above config file.
# If the table exists already, the utility will not overwrite it.
tag-a-day-initialise
# Start proposing tags
tag-a-day
Motivation
There are a lot of tools for handling batch tagging, but not many tools for aiding in filling in empty tags on a large scale.
The suggested workflow is:
- Create configuration file.
- Create a DynamoDB table by running
tag-a-day-initialise
. This is not a destructive operation, and existing tables will not be modified or removed. The utility will throw an error if the table already exists. - Have 1 or more people start using
tag-a-day
. - Reconcile any divergent or duplicate tags by running
tag-a-day-reconcile
, and discuss any duplicate tagging suggestions. - Apply the tags to the resources.
NOTE: Steps 4 and 5 are not yet implemented by this utility.
Reference
Supported Services
Configuration File & CLI options
Configuration File Key | Type | CLI Option | Type | Description |
---|---|---|---|---|
regions: |
List | --regions |
Comma separated string | List of regions to audit resources in |
services: |
List | --services |
Comma separated string | List of services to audit |
required-tags: |
List | --required-tags |
Comma separated string | List of tags which must be present on all resources |
dynamodb-table-name: |
String | --dynamodb-table-name |
String | Name of the DynamoDB table to propose tags to. If used in conjunction with tag-a-day-initialise , this will be the DynamoDB table to be created. |
dynamodb-table-region: |
String | --dynamodb-table-region |
String | AWS Region in which to look for --dynamodb-table-name . If used in conjunction with tag-a-day-initialise this will be the region which the DynamoDB table will be created in. |
--resource-ids |
Comma separated string | List of resource ids, to filter only for specific resources to propose tags for. |
Extending
aws-tag-a-day
is built on a plugin architecture, using entry_point
in setuptools
.
To add more TagHandlers, you can either add classes to this repo, or create a new python package with its
own setup.py, and hook into the plugin architecture using the tag_a_day.tag_handlers
entrypoint.
-
Create a new class, inheriting from
tag_a_day.services.service.Service
from tag_a_day.services.service import Service class CustomTagHandler(Service): pass
-
Set a unique name for the Tag handler
from tag_a_day.services.service import Service class CustomTagHandler(Service): name='custom_handler'
-
Create two stub methods,
resources
andhandler
matching the signatures below:from tag_a_day.services.service import Service class VpcTagHandler(Service): name='ec2_vpc' def resources(self, session): pass def handler(self, resource, expected_tags, region, session, cache, proposals): pass
-
Implement
resources(...)
to return an iterable. If using boto3 resources, this should look like:def resources(self, session): return session.resource('ec2').vpc.all()
If using boto3 client, don't forget to implement pagination, and should look like:
def resources(self, session): ec2 = session.client('ec2') paginator = ec2.get_paginator('describe_vpcs') for page in paginator.paginate(): for vpc in page: yield vpc
-
Implement
handle(...)
to yield a payload describing the tag proposal (example is using boto3.resources):def handle(self, vpc, expected_tags, region, session, cache, proposals): # This boilerplate logic will handle checking the tags which have already been # evaluated for this user. evaluated_tags = self._progress.evaluated_tags(vpc.vpc_id) vpc_info, missing_tags = \ self._build_tag_sets(expected_tags, evaluated_tags, vpc.tags) # Check if the user has proposed values for all the missing tags if self._progress.has_finished(vpc.vpc_id, expected_tags): # Print a skip message self._skip(vpc.vpc_id) return if any(missing_tags): # Print information about this resource, which could be useful # to provide context around tagging. self._print_table( ("VpcID", vpc.vpc_id), *vpc_info ) # Build our user prompt to ask for new tags tag_prompt = self._build_tag_prompt(missing_tags) for tag_key in missing_tags: # Yield a proposal for a new tag key/value pair for the given # resource id. yield { 'resource_id': vpc.vpc_id, 'tag_key': tag_key, 'tag_value': tag_prompt(tag_key), }
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file aws-tag-a-day-0.1.8.tar.gz
.
File metadata
- Download URL: aws-tag-a-day-0.1.8.tar.gz
- Upload date:
- Size: 9.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7539755a08a5af8b9d59444137d2506fb0bfa69e446b06f25efa73615770e5f7 |
|
MD5 | 40ca86d2d2947fac998f7d62bae1da00 |
|
BLAKE2b-256 | 44defb9f32c056c1a4a49a83971a91bfc05602545e1e656f4f81d761221585d6 |
File details
Details for the file aws_tag_a_day-0.1.8-py3-none-any.whl
.
File metadata
- Download URL: aws_tag_a_day-0.1.8-py3-none-any.whl
- Upload date:
- Size: 17.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c026bcd017bb5f1e3763b7c766d4ca246676679888e535c4a417cd4367510c00 |
|
MD5 | c381d7bbbf1c5765be9f1e66af141956 |
|
BLAKE2b-256 | 6dab4fda302d1b1b7375cced4216b1c7cbcc36af80a86912b1a05481854ea98c |