Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | 3x 3x 3x 3x 3x 39x 39x 39x 39x 7x 7x 128x 128x 128x 106x 22x 22x 39x 39x 39x | import { CustomerVariableProvider, CustomerVariableType, CustomerVariableValue } from '../types'
import { SecretsManagerClient } from '@aws-sdk/client-secrets-manager'
import { CloudFrontRequest } from 'aws-lambda'
import { getHeaderValue } from '../../headers'
import { retrieveSecret } from './retrieve-secret'
import { NonNullableObject } from '../../types'
import { DEFAULT_REGION, SECRET_NAME_HEADER_KEY } from '../defaults'
interface SecretsInfo {
secretName: string | null
secretRegion: string | null
}
export class SecretsManagerVariables implements CustomerVariableProvider {
readonly name = 'SecretsManagerVariables'
private secretsInfo?: SecretsInfo
private readonly secretsManager?: SecretsManagerClient
constructor(private readonly request: CloudFrontRequest) {
this.readSecretsInfoFromHeaders()
if (SecretsManagerVariables.isValidSecretInfo(this.secretsInfo)) {
try {
this.secretsManager = new SecretsManagerClient({ region: this.secretsInfo.secretRegion })
} catch (error) {
console.error('Failed to create secrets manager', {
error,
secretsInfo: this.secretsInfo,
})
}
}
}
async getVariable(variable: CustomerVariableType): Promise<CustomerVariableValue> {
const secretsObject = await this.retrieveSecrets()
return secretsObject?.[variable] ?? null
}
private async retrieveSecrets() {
if (!this.secretsManager) {
return null
}
try {
return await retrieveSecret(this.secretsManager, this.secretsInfo!.secretName!)
} catch (error) {
console.error('Error retrieving secret from secrets manager', {
error,
secretsInfo: this.secretsInfo,
})
return null
}
}
private readSecretsInfoFromHeaders() {
if (!this.secretsInfo) {
this.secretsInfo = {
secretName: getHeaderValue(this.request, SECRET_NAME_HEADER_KEY),
secretRegion: DEFAULT_REGION,
}
}
}
private static isValidSecretInfo(secretsInfo?: SecretsInfo): secretsInfo is NonNullableObject<SecretsInfo> {
return Boolean(secretsInfo?.secretRegion && secretsInfo?.secretName)
}
}
|