Properties/configuration

properties is file containing a set of key value mappings (in different formats ie json/yaml/properties) that are constants used in the app for specific environments (ie same keys but different values for different environments)

Types of properties

  • deployment

    • These are necessary to start the application up

      • ie java options, which env to deploy to

    • They can also be used as a precondition before startup.

      • if not set or are wrong, then application cannot startup (obvisouly should be done before it gets to deployment)

  • startup

    • These are needed for the app to run, after being deployed.

    • If they are not there then the application cannot do it's tasks

    • ie database properties

  • In life properties

    • These properties can be changed throughout the lifecycle/running of the application

    • ie 3rd party url, toggles, certificates

  • Secrets

    • These are generally things like passwords, usernames, tokens, private keys

    • They need to be encrypted when saved or stored anywhere (ie db/git), but upon deployment or usage needs to be decrypted

      • Either by the devs or someone with clearance

    • Generally decrypted on the environment/server, so the application can use them to function

      • This means they should never be shown in logs (or at least obfuscated), accessed by some user via the application (ie endpoint)

    • These secrets will generally have self life where they become out of date and need to be replaced (ie encrypted and stored)

  • Local properties

    • these are a file which is a combination of all the above.

    • Where the property file is used by the app when done on a local environment ie dev computer, minikube etc

      • They can also be used when running the build ie all the tests, or running a test, or running the app via the main method, or docker container

    • Secrets would not be encrypted, unless decryption happens in the app (but this is not a good idea as the decryption key would need to be in the app)

Property manager

  • applications which manage the properties

  • Use during the phases of the application (deployment, startup and inlife)

  • Do not need to go through whole software process, ie change code

    • They are dynamic changes

    • The application will have system to call or listen for changes in the the PM and apply them ie for inlife properties

  • Non developers can change it

    • Secruity reasons ie changing production passwords/certs, should be done by as few people as possible

  • Can have properties passed in at time of deployment

    • the deployment system ie kubernetes, will pass in the properties at deployment and startup

  • drawback

    • Not versioned control, lack of audits on who did what and hard to roll back

      • although this can be implemented

    • Properties changed while the application is running, may be reverted on the deployment of a new version of the application and thus lost

      • Need to remember to add these to the permenant property file for future versions

      • although the dynamic property might have been short lived, and not needed permenantly

    • Another DSL to learn

Secret Management

  • Vault

Other

  • Can separate CI and CD

    • When CI is complete a binary/jar/image is versioned and produced

    • The CD is configured with the version of the app which is ready to be deployed

    • The CD can now deploy to different environments (with different properties settings) independently instead of deploying in a set order (ie CI->test -> stage -> prod)

    • So we can do a release/deployment to prod with just changes to inlife properties to a version already in prod

Separating properties from app in different projects

  • stop deploying full app and only properties

Other

  • Use of environment variables in properties ie local database url

  • https://docs.oracle.com/javase/tutorial/essential/environment/properties.html

Last updated