Metadata-Version: 2.1
Name: croudtech-python-aws-app-config
Version: 1.1.13
Summary: Applicaton config via AWS SSM
Home-page: https://github.com/CroudTech/croudtech-python-aws-app-config
Author: Jim Robinson
Author-email: jscrobinson@gmail.com
License: mit
Platform: any
Classifier: Development Status :: 5 - Production/Stable
Classifier: Programming Language :: Python
Classifier: Intended Audience :: Developers
Description-Content-Type: text/markdown; charset=UTF-8
License-File: LICENSE.txt
License-File: AUTHORS.rst
Requires-Dist: boto3 (==1.22.1)
Requires-Dist: bson (==0.5.10)
Requires-Dist: certifi (==2021.10.8)
Requires-Dist: click (==8.1.2)
Requires-Dist: http-status-codes (==1.0.3)
Requires-Dist: loguru (==0.6.0)
Requires-Dist: pyaml (==21.10.1)
Requires-Dist: pyyaml (==6.0)
Requires-Dist: redis (==4.2.2)
Requires-Dist: requests (==2.27.1)
Requires-Dist: pyparsing (==3.0.8) ; python_full_version >= "3.6.8"
Requires-Dist: deprecated (==1.2.13) ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
Requires-Dist: python-dateutil (==2.8.2) ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
Requires-Dist: six (==1.16.0) ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
Requires-Dist: wrapt (==1.14.0) ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3, 3.4"
Requires-Dist: urllib3 (==1.26.9) ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3, 3.4" and python_version < "4"
Requires-Dist: charset-normalizer (==2.0.12) ; python_version >= "3"
Requires-Dist: idna (==3.3) ; python_version >= "3"
Requires-Dist: async-timeout (==4.0.2) ; python_version >= "3.6"
Requires-Dist: botocore (==1.25.1) ; python_version >= "3.6"
Requires-Dist: packaging (==21.3) ; python_version >= "3.6"
Requires-Dist: s3transfer (==0.5.2) ; python_version >= "3.6"
Requires-Dist: jmespath (==1.0.0) ; python_version >= "3.7"

# croudtech-python-aws-app-config

croudtech-python-aws-app-config us a utility to help manage application config using the AWS SSM Parameter Store

There is a cli tool to help set the values and a utility to use the SSM parameters within you application.

## Installation

Use the package manager [pip](https://pip.pypa.io/en/stable/) to install croudtech-python-aws-app-config.

```bash
pip install croudtech-python-aws-app-config
```

## Command Line Usage

```
Usage: cli.py [OPTIONS] COMMAND [ARGS]...

Options:
  --debug / --no-debug
  --endpoint-url TEXT
  --help                Show this message and exit.

Commands:
  delete-parameters
  get-arns
  get-parameters
  put-parameters
  put-parameters-recursive
  manage-redis
```

--endpoint-url specified the AWS API endpoint URL used. This should be used if using localstack or a similar aws mock service. You can also set the `AWS_ENDPOINT_URL` env var to enable this feature.

### Sub Commands

#### delete-parameters

Delete parameters from SSM for a specified app and environment

```
Usage: cli.py delete-parameters [OPTIONS]

Options:
  --environment-name TEXT  The environment name  [required]
  --app-name TEXT          The app name  [required]
  --ssm-prefix TEXT        The ssm path prefix
  --region TEXT            The AWS region
  --help                   Show this message and exit.
```

#### get-arns

Get ARNs for published parameters

```
Usage: cli.py get-arns [OPTIONS]

Options:
  --environment-name TEXT         The environment name  [required]
  --app-name TEXT                 The app name  [required]
  --ssm-prefix TEXT               The ssm path prefix
  --region TEXT                   The AWS region
  --include-common / --ignore-common
                                  Include shared variables
  --output-format [ecs]
  --help                          Show this message and exit.
```

#### get-parameters

Get parameters for a specific app and environment

```
Usage: cli.py get-parameters [OPTIONS]

Options:
  --environment-name TEXT         The environment name  [required]
  --app-name TEXT                 The app name  [required]
  --ssm-prefix TEXT               The ssm path prefix
  --region TEXT                   The AWS region
  --include-common / --ignore-common
                                  Include shared variables
  --output-format [json|yaml|environment|environment-export]
  --help                          Show this message and exit.
```

You can export the variables to your local shell by using

```
eval $(croudtech-app-config get-parameters --app-name myapp --environment-name myenv --output-format environment-export)
```
#### put-parameters

INPUT should be the path to a yaml or json file

```
Usage: cli.py put-parameters [OPTIONS] INPUT

Options:
  --environment-name TEXT  The environment name  [required]
  --app-name TEXT          The app name  [required]
  --ssm-prefix TEXT        The ssm path prefix
  --region TEXT            The AWS region
  --encrypted TEXT         Do you want these parameters to be encrypted?
  --delete-first           Delete the values in this path before pushing
                           (useful for cleanup)

  --help                   Show this message and exit.
```

#### put-parameters-recursive

Recursively put parameters from a directory with the following structure

```
├── EnvironmentName1
│   ├── AppName1.yaml
│   ├── AppName1.secret.yaml
│   ├── AppName2.yaml
│   └──AppName2.secret.yaml
└── EnvironmentName2
    ├── AppName1.yaml
    ├── AppName1.secret.yaml
    ├── AppName2.yaml
    └──AppName2.secret.yaml
```

Files with a *secret.yaml* or *secret.json* suffix will have the parameters encrypted in SSM.

```
Usage: cli.py put-parameters-recursive [OPTIONS] VALUES_PATH

Options:
  --ssm-prefix TEXT  The ssm path prefix
  --region TEXT      The AWS region
  --delete-first     Delete the values in this path before pushing (useful for
                     cleanup)

  --help             Show this message and exit.
```

## Managing Redis DB Allocation

Manage redis DB allocation

### Sub commands

#### allocate-db

```
Usage: python -m croudtech_python_aws_app_config.cli manage-redis allocate-db
           [OPTIONS]

  Allocate a Redis database for a specified application and environment

Options:
  --redis-host TEXT        The redis host  [required]
  --redis-port INTEGER     The redis port  [required]
  --environment-name TEXT  The environment name  [required]
  --app-name TEXT          The application name  [required]
  --help                   Show this message and exit.
```

#### deallocate-db
```
Usage: python -m croudtech_python_aws_app_config.cli manage-redis deallocate-db
           [OPTIONS]

  Remove Redis database allocation for the specified application and
  environment

Options:
  --redis-host TEXT        The redis host  [required]
  --redis-port INTEGER     The redis port  [required]
  --environment-name TEXT  The environment name  [required]
  --app-name TEXT          The application name  [required]
  --help                   Show this message and exit.
```
#### show-db
```
Usage: python -m croudtech_python_aws_app_config.cli manage-redis show-db
           [OPTIONS]

  Show Allocated Redis Database for a specified application

Options:
  --environment-name TEXT         The environment name  [required]
  --app-name TEXT                 The app name  [required]
  --ssm-prefix TEXT               The ssm path prefix
  --region TEXT                   The AWS region
  --include-common / --ignore-common
                                  Include shared variables
  --help                          Show this message and exit.
```
#### show-dbs
```
Usage: python -m croudtech_python_aws_app_config.cli manage-redis show-dbs
           [OPTIONS]

  Show all allocated Redis databases

Options:
  --redis-host TEXT     The redis host  [required]
  --redis-port INTEGER  The redis port  [required]
  --help                Show this message and exit.
```

## Nested file structure and environment variables

Nested values will have their keys flattened when being converted to environment variables. This allows for a simpler structure than just adding all your env vars separately.

For example:

```
SOME_VARIABLE: test
ANOTHER_VAR: 123
SOME_OTHER_VAR: foo
CONNECTIONS:
  POSTGRESS:
    HOST: somehost
    PORT: 1234
    USERNAME: someuser
    PASSWORD: somepass
```

Would translate into the following environment variables:

```
SOME_VARIABLE="test"
ANOTHER_VAR="123"
SOME_OTHER_VAR="foo"
CONNECTIONS_POSTGRESS_HOST="somehost"
CONNECTIONS_POSTGRESS_PORT="1234"
CONNECTIONS_POSTGRESS_USERNAME="someuser"
CONNECTIONS_POSTGRESS_PASSWORD="somepass"
```

## Usage in application code

In the top of your application bootstrap file (or settings.py in django) add:

```
from croudtech_python_aws_app_config.ssm_config import SsmConfig

ssm_config = SsmConfig(
    environment_name=os.environ.get("ENVIRONMENT_NAME"), app_name=os.environ.get("APP_NAME")
)
ssm_config.params_to_env()
```

Make sure your ENVIRONMENT_NAME and APP_NAME env vars are set.

This will pull values from SSM and inject them into your application environment variables.

## Contributing
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.




