fix: get all secrets from aws ssm

This commit is contained in:
=
2024-05-16 20:51:07 +05:30
parent 5e678b1ad2
commit 7fce51e8c1
@@ -462,79 +462,86 @@ const syncSecretsAWSParameterStore = async ({
ssm.config.update(config); ssm.config.update(config);
const metadata = z.record(z.any()).parse(integration.metadata || {}); const metadata = z.record(z.any()).parse(integration.metadata || {});
const awsParameterStoreSecretsObj: Record<string, AWS.SSM.Parameter> = {};
const params = { // now fetch all aws parameter store secrets
Path: integration.path as string, let hasNext = true;
Recursive: false, let nextToken: string | undefined;
WithDecryption: true while (hasNext) {
}; const parameters = await ssm
.getParametersByPath({
Path: integration.path as string,
Recursive: false,
WithDecryption: true,
MaxResults: 10,
NextToken: nextToken
})
.promise();
const parameterList = (await ssm.getParametersByPath(params).promise()).Parameters; if (parameters.Parameters) {
parameters.Parameters.forEach((sec) => {
const awsParameterStoreSecretsObj = (parameterList || []) if (sec.Name) {
.filter(({ Name }) => Boolean(Name)) const secKey = sec.Name.substring((integration.path as string).length);
.reduce( awsParameterStoreSecretsObj[secKey] = sec;
(obj, secret) => ({
...obj,
[(secret.Name as string).substring((integration.path as string).length)]: secret
}),
{} as Record<string, AWS.SSM.Parameter>
);
// Identify secrets to create
await Promise.all(
Object.keys(secrets).map(async (key) => {
if (!(key in awsParameterStoreSecretsObj)) {
// case: secret does not exist in AWS parameter store
// -> create secret
if (secrets[key].value) {
await ssm
.putParameter({
Name: `${integration.path}${key}`,
Type: "SecureString",
Value: secrets[key].value,
...(metadata.kmsKeyId && { KeyId: metadata.kmsKeyId }),
// Overwrite: true,
Tags: metadata.secretAWSTag
? metadata.secretAWSTag.map((tag: { key: string; value: string }) => ({
Key: tag.key,
Value: tag.value
}))
: []
})
.promise();
} }
// case: secret exists in AWS parameter store });
} else if (awsParameterStoreSecretsObj[key].Value !== secrets[key].value) { }
// case: secret value doesn't match one in AWS parameter store hasNext = Boolean(parameters.NextToken);
// -> update secret nextToken = parameters.NextToken;
}
// Identify secrets to create
// don't use Promise.all() and promise map here
// it will cause rate limit
for (const key in secrets) {
if (!(key in awsParameterStoreSecretsObj)) {
// case: secret does not exist in AWS parameter store
// -> create secret
if (secrets[key].value) {
await ssm await ssm
.putParameter({ .putParameter({
Name: `${integration.path}${key}`, Name: `${integration.path}${key}`,
Type: "SecureString", Type: "SecureString",
Value: secrets[key].value, Value: secrets[key].value,
Overwrite: true ...(metadata.kmsKeyId && { KeyId: metadata.kmsKeyId }),
// Tags: metadata.secretAWSTag ? [{ Key: metadata.secretAWSTag.key, Value: metadata.secretAWSTag.value }] : [] // Overwrite: true,
Tags: metadata.secretAWSTag
? metadata.secretAWSTag.map((tag: { key: string; value: string }) => ({
Key: tag.key,
Value: tag.value
}))
: []
}) })
.promise(); .promise();
} }
}) // case: secret exists in AWS parameter store
); } else if (awsParameterStoreSecretsObj[key].Value !== secrets[key].value) {
// case: secret value doesn't match one in AWS parameter store
// -> update secret
await ssm
.putParameter({
Name: `${integration.path}${key}`,
Type: "SecureString",
Value: secrets[key].value,
Overwrite: true
// Tags: metadata.secretAWSTag ? [{ Key: metadata.secretAWSTag.key, Value: metadata.secretAWSTag.value }] : []
})
.promise();
}
}
if (!metadata.shouldDisableDelete) { if (!metadata.shouldDisableDelete) {
// Identify secrets to delete for (const key in awsParameterStoreSecretsObj) {
await Promise.all( if (!(key in secrets)) {
Object.keys(awsParameterStoreSecretsObj).map(async (key) => { // case:
if (!(key in secrets)) { // -> delete secret
// case: await ssm
// -> delete secret .deleteParameter({
await ssm Name: awsParameterStoreSecretsObj[key].Name as string
.deleteParameter({ })
Name: awsParameterStoreSecretsObj[key].Name as string .promise();
}) }
.promise(); }
}
})
);
} }
}; };