diff --git a/CHANGELOG.md b/CHANGELOG.md
index 54b1a3c..ff3263c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,20 @@
 
 ## [Unreleased][]
 
-[Unreleased]: https://github.com/chaostoolkit/chaostoolkit-lib/compare/0.15.0...HEAD
+[Unreleased]: https://github.com/chaostoolkit/chaostoolkit-lib/compare/0.15.1...HEAD
+
+## [0.15.1][] - 2018-03-09
+
+[0.15.1]: https://github.com/chaostoolkit/chaostoolkit-lib/compare/0.15.0...0.15.1
+
+### Changed
+
+-   Log a message wgen loding the configuration 
+-   Raise `InvalidExperiment` when a configuration or secret references a key
+    in the environment and that key does not exist (it may not be set however)
+    [#40][40]. This bails the experiment at validation time so before it runs.
+
+[40]: https://github.com/chaostoolkit/chaostoolkit-lib/issues/40
 
 ## [0.15.0][] - 2018-02-20
 
diff --git a/chaoslib/__init__.py b/chaoslib/__init__.py
index ebb5445..e2065c9 100644
--- a/chaoslib/__init__.py
+++ b/chaoslib/__init__.py
@@ -6,7 +6,7 @@ from typing import Any, Dict, List, Mapping, Union
 from chaoslib.types import Configuration, Secrets
 
 __all__ = ["__version__", "substitute"]
-__version__ = '0.15.0'
+__version__ = '0.15.1'
 
 
 def substitute(data: Union[str, Dict[str, Any], List],
diff --git a/chaoslib/configuration.py b/chaoslib/configuration.py
index cb34bd4..4d97032 100644
--- a/chaoslib/configuration.py
+++ b/chaoslib/configuration.py
@@ -4,6 +4,7 @@ from typing import Dict
 
 from logzero import logger
 
+from chaoslib.exceptions import InvalidExperiment
 from chaoslib.types import Configuration
 
 __all__ = ["load_configuration"]
@@ -32,13 +33,19 @@ def load_configuration(config_info: Dict[str, str]) -> Configuration:
     configuration key is dynamically fetched from the `MY_TOKEN` environment
     variable.
     """
+    logger.debug("Loading configuration...")
     env = os.environ
     conf = {}
 
     for (key, value) in config_info.items():
         if isinstance(value, dict) and "type" in value:
             if value["type"] == "env":
-                conf[key] = env.get(value["key"])
+                env_key = value["key"]
+                if env_key not in env:
+                    raise InvalidExperiment(
+                        "Configuration makes reference to an environment key"
+                        " that does not exist: {}".format(env_key))
+                conf[key] = env.get(env_key)
         else:
             conf[key] = value
 
diff --git a/chaoslib/experiment.py b/chaoslib/experiment.py
index 4bcd6f6..b909733 100644
--- a/chaoslib/experiment.py
+++ b/chaoslib/experiment.py
@@ -73,6 +73,9 @@ def ensure_experiment_is_valid(experiment: Experiment):
             raise InvalidExperiment(
                 "experiment tags must be a non-empty string")
 
+    config = load_configuration(experiment.get("configuration", {}))
+    secrets = load_secrets(experiment.get("secrets", {}), config)
+
     ensure_hypothesis_is_valid(experiment)
 
     method = experiment.get("method")
diff --git a/chaoslib/secret.py b/chaoslib/secret.py
index dfe1dd2..a272151 100644
--- a/chaoslib/secret.py
+++ b/chaoslib/secret.py
@@ -10,6 +10,7 @@ try:
 except ImportError:
     HAS_HVAC = False
 
+from chaoslib.exceptions import InvalidExperiment
 from chaoslib.types import Configuration, Secrets
 
 __all__ = ["load_secrets"]
@@ -123,7 +124,12 @@ def load_secrets_from_env(secrets_info: Dict[str, Dict[str, str]],
 
         for (key, value) in keys.items():
             if isinstance(value, dict) and value.get("type") == "env":
-                secrets[target][key] = env.get(value["key"])
+                env_key = value["key"]
+                if env_key not in env:
+                    raise InvalidExperiment(
+                        "Secrets make reference to an environment key "
+                        "that does not exist: {}".format(env_key))
+                secrets[target][key] = env.get(env_key)
 
         if not secrets[target]:
             secrets.pop(target)

Bail cleanly when environment key was not found
It appears the toolkit doesn't tell you when a key couldn't be found in the environment. 
diff --git a/tests/fixtures/experiments.py b/tests/fixtures/experiments.py
index 627ce70..757f6f4 100644
--- a/tests/fixtures/experiments.py
+++ b/tests/fixtures/experiments.py
@@ -160,3 +160,11 @@ Experiment = {
         }
     ]
 }
+
+ExperimentWithConfigurationCallingMissingEnvKey = Experiment.copy()
+ExperimentWithConfigurationCallingMissingEnvKey["configuration"] = {
+    "mykey": {
+        "type": "env",
+        "key": "DOES_NOT_EXIST"
+    }
+}
\ No newline at end of file
diff --git a/tests/test_experiment.py b/tests/test_experiment.py
index 28046b4..444746f 100644
--- a/tests/test_experiment.py
+++ b/tests/test_experiment.py
@@ -152,3 +152,12 @@ def test_experiment_may_run_without_steady_state():
 
     journal = run_experiment(experiment)
     assert journal is not None
+
+
+def test_should_bail_experiment_when_env_was_not_found():
+    experiment = experiments.ExperimentWithConfigurationCallingMissingEnvKey
+
+    with pytest.raises(InvalidExperiment) as x:
+        run_experiment(experiment)
+    assert "Configuration makes reference to an environment key that does " \
+           "not exist" in str(x)
\ No newline at end of file

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-sugar
3.7
requirements.txt requirements-dev.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi @ file:///croot/certifi_1671487769961/work/certifi
-e git+https://github.com/chaostoolkit/chaostoolkit-lib.git@80fb16cd50d4f6d761cf2c0c5919574d2972932c#egg=chaostoolkit_lib
charset-normalizer==3.4.1
coverage==7.2.7
exceptiongroup==1.2.2
hvac==0.11.2
idna==3.10
importlib-metadata==6.7.0
iniconfig==2.0.0
logzero==1.7.0
packaging==24.0
pluggy==1.2.0
ply==3.4
pycodestyle==2.10.0
pyhcl==0.2.3
pytest==7.4.4
pytest-cov==4.1.0
pytest-sugar==1.0.0
PyYAML==6.0.1
requests==2.31.0
requests-mock==1.12.1
six==1.17.0
termcolor==2.3.0
tomli==2.0.1
typing_extensions==4.7.1
urllib3==2.0.7
zipp==3.15.0

name: chaostoolkit-lib
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - charset-normalizer==3.4.1
      - coverage==7.2.7
      - exceptiongroup==1.2.2
      - hvac==0.11.2
      - idna==3.10
      - importlib-metadata==6.7.0
      - iniconfig==2.0.0
      - logzero==1.7.0
      - packaging==24.0
      - pluggy==1.2.0
      - ply==3.4
      - pycodestyle==2.10.0
      - pyhcl==0.2.3
      - pytest==7.4.4
      - pytest-cov==4.1.0
      - pytest-sugar==1.0.0
      - pyyaml==6.0.1
      - requests==2.31.0
      - requests-mock==1.12.1
      - six==1.17.0
      - termcolor==2.3.0
      - tomli==2.0.1
      - typing-extensions==4.7.1
      - urllib3==2.0.7
      - zipp==3.15.0
prefix: /opt/conda/envs/chaostoolkit-lib

tests/test_experiment.py::test_should_bail_experiment_when_env_was_not_found
tests/test_experiment.py::test_empty_experiment_is_invalid tests/test_experiment.py::test_experiment_must_have_a_method tests/test_experiment.py::test_experiment_must_have_at_least_one_step tests/test_experiment.py::test_experiment_must_have_a_title tests/test_experiment.py::test_experiment_must_have_a_description tests/test_experiment.py::test_experiment_may_not_have_a_hypothesis tests/test_experiment.py::test_experiment_hypothesis_must_have_a_title tests/test_experiment.py::test_experiment_hypothesis_must_have_a_valid_probe tests/test_experiment.py::test_valid_experiment tests/test_experiment.py::test_can_run_experiment_in_dry_mode tests/test_experiment.py::test_can_iterate_over_activities tests/test_experiment.py::test_no_rollback_even_on_SIGINT tests/test_experiment.py::test_no_rollback_even_on_SystemExit tests/test_experiment.py::test_probes_can_reference_each_other tests/test_experiment.py::test_probes_missing_ref_should_fail_the_experiment tests/test_experiment.py::test_experiment_with_steady_state tests/test_experiment.py::test_experiment_may_run_without_steady_state
chaoslib/configuration.py chaoslib/experiment.py CHANGELOG.md chaoslib/secret.py chaoslib/__init__.py
chaoslib/configuration.py chaoslib/experiment.py CHANGELOG.md chaoslib/secret.py chaoslib/__init__.py