Skip to main content

AWS config sources for the typedconfig package

Project description

Build Status codecov

typed-config-aws-sources

AWS config sources for the typed-config package.

pip install typed-config-aws-sources

Requires python 3.6 or above.

Basic usage

Please read the readme for typed-config first.

# my_app/config.py
from typedconfig_awssource import IniS3ConfigSource
from typedconfig import Config, key, section

@section('database')
class AppConfig(Config):
    port = key(cast=int)

config = AppConfig()
config.add_source(IniS3ConfigSource('my_bucket_name', 'config_key.cfg'))
config.read()
# my_app/main.py
from my_app.config import config
print(config.host)

Supplied Config Sources

IniS3ConfigSource

This loads configuration from an INI file stored in an S3 bucket

from typedconfig_awssource import IniS3ConfigSource
source = IniS3ConfigSource('bucket_name', 'key_name.cfg', encoding='utf8', must_exist=True)
  • Supply the bucket name and key name as the first two arguments
  • encoding defaults to 'utf8' if not supplied
  • must_exist defaults to True if not supplied. If must_exist is False, and the bucket or key can't be found, or AWS credentials fail, then no error is thrown and this config source will just return than it cannot find the requested config value every time.

An example INI file might look like this:

[database]
port = 2000

DynamoDBConfigSource

This reads configuration from a DynamoDB table. The table should have a partition key which holds the config section, a sort key which holds the config key name, and another 'column' containing the config value as a string.

So an item in DynamoDB corresponding to the above INI file example would look like this

{
    "section": "database",
    "key": "port",
    "value": "2000"
}

Create the DynamoDBConfigSource like this:

from typedconfig_awssource import DynamoDbConfigSource
source = DynamoDbConfigSource('table_name', 
                               section_attribute_name='config_section_column_name',
                               key_attribute_name='config_key_column_name',
                               value_attribute_name='config_value_column_name')
  • The first argument is the DynamoDB table name and is required
  • The other three arguments are optional, and are supplying the attribute (or "column") names in the table which store the three things defining a config parameter (section, key, and value)
  • Default attribute names are "section", "key", and "value"

SecretsManagerConfigSource

This reads secret values from secrets manager. Permission to read AWS secrets is required. One secrets should be stored for each config section with the name format prefix/section, and contain json key-value pairs. For example, for a project called myproject there may be a secret called myproject/database containing the following value. Note that even numeric values should be stored as strings.

{
    "user": "secretuser",
    "password": "secretpassword"
}

Create the SecretsManagerConfigSource like this:

from typedconfig_awssource import SecretsManagerConfigSource
source = SecretsManagerConfigSource('myproject', must_exist=False)
  • The first argument passed is the prefix which is placed before the / in the secret name. So when I try to get the database password, the secret myproject/database is retrieved, the JSON is parsed and value the field password is returned.
  • The must_exist argument specifies whether to error if AWS secretsmanager cannot be accessed, or if the key does not exist. Default is False.

ParameterStoreConfigSource

This reads (optionally secret) values from AWS SSM parameter store. Storing secrets here is cheaper than using secrets manager. Permission to read from SSM parameter store is required. Each config parameter should be stored in parameter store as an individual SecureString parameter. For example, I would store the database password in a key called

myproject/database/password

where database is the section name and password is the configuration key name.

Create a ParameterStoreConfigSource like this:

from typedconfig_awssource import ParameterStoreConfigSource
source = ParameterStoreConfigSource('myproject', must_exist=False)
  • The first argument passed is the prefix at the start of the SSM parameter name, before the first /.
  • The must_exist argument specifies whether to error if AWS parameter store cannot be accessed, or if the requested key does not exist.

Contributing

Ideas for new features and pull requests are welcome. PRs must come with tests included. This was developed using Python 3.7 but Travis tests run with v3.6 too.

Development setup

  1. Clone the git repository
  2. Create a virtual environment virtualenv venv
  3. Activate the environment venv/scripts/activate
  4. Install development dependencies pip install -r requirements.txt

Running tests

pytest

To run with coverage:

pytest --cov

Deploying to PyPI

You'll need to pip install twine if you don't have it.

  1. Bump version number in typedconfig_awssource/__version__.py
  2. Tag the release in git git tag -a v0.1.0 -m "Message"
  3. python setup.py sdist bdist_wheel
  4. twine check dist/*
  5. Upload to the test PyPI twine upload --repository-url https://test.pypi.org/legacy/ dist/*
  6. Check all looks ok at https://test.pypi.org/project/typed-config-aws-sources
  7. Upload to live PyPI twine upload dist/*

Here is a good tutorial on publishing packages to PyPI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

typed-config-aws-sources-0.3.1.tar.gz (6.1 kB view details)

Uploaded Source

Built Distribution

typed_config_aws_sources-0.3.1-py3-none-any.whl (6.3 kB view details)

Uploaded Python 3

File details

Details for the file typed-config-aws-sources-0.3.1.tar.gz.

File metadata

  • Download URL: typed-config-aws-sources-0.3.1.tar.gz
  • Upload date:
  • Size: 6.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.2

File hashes

Hashes for typed-config-aws-sources-0.3.1.tar.gz
Algorithm Hash digest
SHA256 d6e0174a569e5a050b5fc1e41ae5b052e52dd443e126111f1f4a3fe8e0602036
MD5 9b255f5ebd356d02139fc104330b33d7
BLAKE2b-256 11386a617aa46853fd14f38e7046f9bbde93fcd171233aa51265c31285b43688

See more details on using hashes here.

File details

Details for the file typed_config_aws_sources-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: typed_config_aws_sources-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 6.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.2

File hashes

Hashes for typed_config_aws_sources-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ff41be7ffa05dde405ec81cd1a2b4900cdf2f156768a292c7b59e07b39f60ba2
MD5 c6f392cc5adf1fbcbc383cbe2f8e8556
BLAKE2b-256 2bcd140cab4faf13a7dfc46aaa188da426fc11696614af0ebf343b18f4ca8cd1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page