runtheops / ssm-diff

A human-friendly way of managing parameters in AWS SSM
MIT License
46 stars 25 forks source link

Fix nested parameters with values #30

Open arthurian opened 3 years ago

arthurian commented 3 years ago

This PR fixes an issue related to #28 so that it's possible to pull parameters that have values anywhere along the path. Currently, an error is raised if a parameter has a value and then that parameter participates in a longer path.

Given these remote parameters:

/qa/ci               = ci_value
/qa/ci/api           = api_value
/qa/ci/api/db_schema = schema_value
/qa/ci/api/db_user   = user_value

The YAML representation would look like this:

qa:
  ci:
    '@value': ci_value
    api:
      '@value': api_value
      db_schema: schema_value
      db_user: user_value

Since the @ character is not allowed in parameter names, @value is used as the mapping key for intermediate path values (must be quoted). There should be no conflict with remote parameters and any attempt to update a remote parameter would result in an error.

To apply changes, simply treat @value as any other key and then run ssm-diff plan and ssm-diff apply. For example, changing the YAML to this:

qa:
  ci:
    api:
      '@value': api_value_changed
      db_schema: schema_value
      db_user: user_value

Would result in the following plan to remove /qa/ci and update /qa/ci/api:

- /qa/ci
~ /qa/ci/api:
    < api_value
    > api_value_changed

@runtheops