mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-07 04:27:29 +00:00
fix: get all secrets from aws ssm
This commit is contained in:
@@ -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();
|
}
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user