typescript - AWS SecretsManager-värde kommer inte att lösas
Jag använder aws-cdk-lib (2.13.0). Här är ett utdrag av min kod:
import { App, Stack } from 'aws-cdk-lib';
import { Secret } from 'aws-cdk-lib/aws-secretsmanager';
export class CognitoStack extends Stack {
constructor(scope: App) {
super(scope, 'cognito');
const secret = this.getSecret('google');
console.log({ secret });
}
public getSecret(path: string) {
const secret = Secret.fromSecretNameV2(this, `Secret${path}`, path);
console.log({ path, secret, secretArn: secret.secretArn, string: secret.secretValue.toString() });
return secret.secretValue.toJSON();
}
}
De resulterande loggarna ser ut så här:
{
path: 'google',
secret: <ref *1> SecretBase {
node: Node {
host: [Circular *1],
_locked: false,
_children: {},
_context: {},
_metadata: [],
_dependencies: Set(0) {},
_validations: [Array],
id: 'Secretgoogle',
scope: [CognitoStack]
},
stack: CognitoStack {
node: [Node],
_missingContext: [],
_stackDependencies: {},
templateOptions: {},
_logicalIds: [LogicalIDs],
account: '${Token[AWS.AccountId.4]}',
region: '${Token[AWS.Region.8]}',
environment: 'aws://unknown-account/unknown-region',
terminationProtection: undefined,
_stackName: 'cognito',
tags: [TagManager],
artifactId: 'cognito',
templateFile: 'cognito.template.json',
_versionReportingEnabled: true,
synthesizer: [DefaultStackSynthesizer],
[Symbol(@aws-cdk/core.DependableTrait)]: [Object]
},
env: {
account: '${Token[AWS.AccountId.4]}',
region: '${Token[AWS.Region.8]}'
},
_physicalName: undefined,
_allowCrossEnvironment: false,
physicalName: '${Token[TOKEN.332]}',
encryptionKey: undefined,
secretName: 'google',
secretArn: 'arn:${Token[AWS.Partition.7]}:secretsmanager:${Token[AWS.Region.8]}:${Token[AWS.AccountId.4]}:secret:google',
autoCreatePolicy: false,
[Symbol(@aws-cdk/core.DependableTrait)]: { dependencyRoots: [Array] }
},
secretArn: 'arn:${Token[AWS.Partition.7]}:secretsmanager:${Token[AWS.Region.8]}:${Token[AWS.AccountId.4]}:secret:google',
string: '${Token[TOKEN.333]}'
}
{ secret: '<unresolved-token>' }Resultaten av npx cdk diff sandbox-cognito ser ut så här:
Stack sandbox-cognito
Resources
[~] AWS::Cognito::UserPoolIdentityProvider Google GoogleAF1E99FA
└─ [~] ProviderDetails
├─ [-] Removed: .client_id
└─ [-] Removed: .client_secret
Vilket betyder att det tar bort client_id/client_secret som jag kunde ställa in manuellt. Nu när jag försöker ladda värdena från en hemlighet fungerar det inte.
Problemet är att jag inte kan tolka JSON (lägg märke till <unresolved-token> i loggarna. Jag tror att det inte är löst än, men jag är inte säker på hur man löser det... Den försöker tolka denna strängliteral: $ {Token[TOKEN.333]}, istället för det hemliga värdet. Hur kan jag få resultaten av den hemliga strängen?
Svar #1
Importera din befintliga hemlighet som ett SecretValue. Skicka den till clientSecret:string egenskapen med hjälp av .toString()-metoden.
// Existing secret as SecretValue. Or use Secret.fromSecretNameV2.
const secretVal = cdk.SecretValue.secretsManager('GoogleSecrets', {
jsonField: 'client-secret',
});
new cognito.UserPoolIdentityProviderGoogle(this, 'GoogleProvider', {
userPool,
// creates a dynamic reference which resolves to the actual secret value at deploy-time
clientSecret: secretVal.toString(),
clientId: 'my-id',
});
Förklaring
SecretValue.toString() "löses" till olika värden under livscykeln: När du console.log det får du ett (värdelöst) opakt platshållar-Token-värde som $ {Token[TOKEN.198]}. Vid synth-tid renderar CDK en CloudFormation-dynamisk referens i mallen:
//my-stack.template.json
{"client_secret": "{{resolve:secretsmanager:arn:aws:secretsmanager:us-east-1:123456789012:secret:GoogleSecrets:SecretString:client-secret::}}"}
Vid distributionstidpunkt "löses" det faktiska hemliga värdet från den dynamiska referensen av CloudFormation.
Det viktiga att ta med sig är att det faktiska hemliga värdet aldrig exponeras för din lokala miljö eller mallartefakterna.
Svar #2
Använd secretValue.unsafeUnwrap(), detta är det enda sättet att få det att fungera med CDK. Annars kommer det att misslyckas, eftersom hemlig data finns tillgänglig i den genererade yaml- eller json-filen som används av CDK ... med andra ord CloudFormation.
