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
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
Hashes for aws_tag_a_day-0.1.7-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a2ab6a786d79ae52818ebe22861e1f4540f8a835c31072621866c1e09bf1e4bb |
|
MD5 | a7fd16cb8f1ff20b3f8f301b931bb07e |
|
BLAKE2b-256 | 9de02548c57fa4f67ea997bcd48d19949e23087636b8d3cd4d4eed6e7c5b48ba |