diff --git a/backend/src/ee/services/external-kms/external-kms-service.ts b/backend/src/ee/services/external-kms/external-kms-service.ts index bda6310a7..59e6e5bc4 100644 --- a/backend/src/ee/services/external-kms/external-kms-service.ts +++ b/backend/src/ee/services/external-kms/external-kms-service.ts @@ -73,12 +73,11 @@ export const externalKmsServiceFactory = ({ case KmsProviders.Aws: { const externalKms = await AwsKmsProviderFactory({ inputs: provider.inputs }); - if (provider.inputs.kmsKeyId) { - await externalKms.validateConnection(); - } // if missing kms key this generate a new kms key id and returns new provider input const newProviderInput = await externalKms.generateInputKmsKey(); sanitizedProviderInput = JSON.stringify(newProviderInput); + + await externalKms.validateConnection(); } break; default: diff --git a/backend/src/ee/services/external-kms/providers/aws-kms.ts b/backend/src/ee/services/external-kms/providers/aws-kms.ts index 5a437fd2d..6d9166a3a 100644 --- a/backend/src/ee/services/external-kms/providers/aws-kms.ts +++ b/backend/src/ee/services/external-kms/providers/aws-kms.ts @@ -50,17 +50,26 @@ type TAwsKmsProviderFactoryReturn = TExternalKmsProviderFns & { }; export const AwsKmsProviderFactory = async ({ inputs }: AwsKmsProviderArgs): Promise => { - const providerInputs = await ExternalKmsAwsSchema.parseAsync(inputs); - const awsClient = await getAwsKmsClient(providerInputs); + let providerInputs = await ExternalKmsAwsSchema.parseAsync(inputs); + let awsClient = await getAwsKmsClient(providerInputs); const generateInputKmsKey = async () => { if (providerInputs.kmsKeyId) return providerInputs; const command = new CreateKeyCommand({ Tags: [{ TagKey: "author", TagValue: "infisical" }] }); const kmsKey = await awsClient.send(command); + if (!kmsKey.KeyMetadata?.KeyId) throw new Error("Failed to generate kms key"); - return { ...providerInputs, kmsKeyId: kmsKey.KeyMetadata?.KeyId }; + const updatedProviderInputs = await ExternalKmsAwsSchema.parseAsync({ + ...providerInputs, + kmsKeyId: kmsKey.KeyMetadata?.KeyId + }); + + providerInputs = updatedProviderInputs; + awsClient = await getAwsKmsClient(providerInputs); + + return updatedProviderInputs; }; const validateConnection = async () => {