Safely load secrets from sops into secretsmanager and SSM secret Parameter using CDK.
import { SopsSecretsManager } from 'sops-secretsmanager-cdk';
...
const ssm = new SopsSecretsManager(this, 'StoreSecrets', {
path: './path/to/secretsfile.yaml',
kmsKey: myKey, // or use kms.Key.fromKeyArn, or omit and use the key in the sops file
secretName: 'TestSecret', // or secret: mySecret
mappings: {
nameInSecretsManager: {
path: ['path', 'to', 'value', 'in', 'secretsfile'],
// optionally pass encoding: 'json' to pass a portion of the secrets file
},
anotherThingInSecretsManager: {
path: ['other', 'path'],
},
// etc
},
});
if(ssm.secret) {
// secret is a Secret you can tag, for example
}secretandsecretName- must set exactly one of these- if
secret, must besecretsManager.Secret | secretsManager.ISecret- this secret will be populated with the data from the sops file
- if
secretName, must be astring- a secret with this name will be created
- if
assetandpath- must set exactly one of these- if
asset, must be as3Assets.Asset- this asset should contain the encrypted sops file
- if
path, must be astring- should point to the encrypted sops file on disk
- if
kmsKey- optional- must be a
kms.IKey - the sops file contains a reference to the KMS key, so probably not actually needed
- must be a
mappingsandwholeFile- must setmappingsor setwholeFiletotrue- if
mappings, must be aSopsSecretsManagerMappings- which determines how the values from the sops file are mapped to keys in the secret (see below)
- if
wholeFileis true- then rather than treating the sops data as structured and mapping keys over, the whole file will be decrypted and stored as the body of the secret
- if
fileType- optional- must be
'yaml'or'json'if set - tells sops how to decode the file
- will default getting the extension from the filename
- unless
wholeFileis true, then defaults to'json'
- must be
The mappings property, if given, specifies how to make values from
the structured sops data (json or yaml) to keys in secrets manager.
It takes an object, where:
- the keys are strings determining the target name in Secrets Manager
- the values are objects with keys:
path, required, an array of strings, pointing to a value in the structured sops dataencoding, optional,'string'or'json', control how to alter the value found from sops for storage in Secrets Manager
Using the CDK's custom resource mini-framework, the sops secrets file is uploaded to S3 as an asset as is, still encoded. The custom resource Lambda then decodes the secrets (in memory, never on disk) and puts them into the SecretsManager secret.
The same applies when using the parameter store in AWS system manager. The advantage of ssm is that it is free.
Run the following to deploy a test stack named
SopsExampleStack. Note that if a stack with this name exists, it
will be deleted:
$ npm run deploy-example
This compiles and uses the code from your working directory, finds an existing customer-managed KMS key, deploys a stack that uses an sample secret, and verifies that the created secret contains the expected data.
- (Almost certainly) be on latest master, with no unpublished changes
- Run
npm version (patch|minor|major)as appropriate - Run
git pushandgit push origin TAGwhereTAGis the tag thatnpm versionjust created
The tag triggers a Github Actions job to publish to npm.