Skip to content

Commit c8bc7a8

Browse files
committed
Extract Secrets and SSM resources from stack and update NAG suppressions
1 parent e19fc72 commit c8bc7a8

File tree

3 files changed

+63
-38
lines changed

3 files changed

+63
-38
lines changed

packages/cdk/nagSuppressions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ export const nagSuppressions = (stack: Stack) => {
262262
// Suppress secrets without rotation
263263
safeAddNagSuppression(
264264
stack,
265-
"/EpsAssistMeStack/SlackBotTokenSecret/Resource",
265+
"/EpsAssistMeStack/Secrets/SlackBotTokenSecret/Resource",
266266
[
267267
{
268268
id: "AwsSolutions-SMG4",
@@ -273,7 +273,7 @@ export const nagSuppressions = (stack: Stack) => {
273273

274274
safeAddNagSuppression(
275275
stack,
276-
"/EpsAssistMeStack/SlackBotSigningSecret/Resource",
276+
"/EpsAssistMeStack/Secrets/SlackBotSigningSecret/Resource",
277277
[
278278
{
279279
id: "AwsSolutions-SMG4",

packages/cdk/resources/Secrets.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import {Construct} from "constructs"
2+
import * as cdk from "aws-cdk-lib"
3+
import * as ssm from "aws-cdk-lib/aws-ssm"
4+
import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager"
5+
6+
export interface SecretsProps {
7+
slackBotToken: string
8+
slackSigningSecret: string
9+
}
10+
11+
export class Secrets extends Construct {
12+
public readonly slackBotTokenSecret: secretsmanager.Secret
13+
public readonly slackBotSigningSecret: secretsmanager.Secret
14+
public readonly slackBotTokenParameter: ssm.StringParameter
15+
public readonly slackSigningSecretParameter: ssm.StringParameter
16+
17+
constructor(scope: Construct, id: string, props: SecretsProps) {
18+
super(scope, id)
19+
20+
// Create secrets in Secrets Manager
21+
this.slackBotTokenSecret = new secretsmanager.Secret(this, "SlackBotTokenSecret", {
22+
secretName: "/eps-assist/slack/bot-token",
23+
description: "Slack Bot OAuth Token for EPS Assist",
24+
secretStringValue: cdk.SecretValue.unsafePlainText(JSON.stringify({
25+
token: props.slackBotToken
26+
}))
27+
})
28+
29+
this.slackBotSigningSecret = new secretsmanager.Secret(this, "SlackBotSigningSecret", {
30+
secretName: "/eps-assist/slack/signing-secret",
31+
description: "Slack Signing Secret",
32+
secretStringValue: cdk.SecretValue.unsafePlainText(JSON.stringify({
33+
secret: props.slackSigningSecret
34+
}))
35+
})
36+
37+
// Create SSM parameters that reference the secrets
38+
this.slackBotTokenParameter = new ssm.StringParameter(this, "SlackBotTokenParameter", {
39+
parameterName: "/eps-assist/slack/bot-token/parameter",
40+
stringValue: `{{resolve:secretsmanager:${this.slackBotTokenSecret.secretName}}}`,
41+
description: "Reference to Slack Bot Token in Secrets Manager",
42+
tier: ssm.ParameterTier.STANDARD
43+
})
44+
45+
this.slackSigningSecretParameter = new ssm.StringParameter(this, "SlackSigningSecretParameter", {
46+
parameterName: "/eps-assist/slack/signing-secret/parameter",
47+
stringValue: `{{resolve:secretsmanager:${this.slackBotSigningSecret.secretName}}}`,
48+
description: "Reference to Slack Signing Secret in Secrets Manager",
49+
tier: ssm.ParameterTier.STANDARD
50+
})
51+
}
52+
}

packages/cdk/stacks/EpsAssistMeStack.ts

Lines changed: 9 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@ import * as cdk from "aws-cdk-lib"
1515
import * as iam from "aws-cdk-lib/aws-iam"
1616
import * as ops from "aws-cdk-lib/aws-opensearchserverless"
1717
import * as cr from "aws-cdk-lib/custom-resources"
18-
import * as ssm from "aws-cdk-lib/aws-ssm"
19-
import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager"
2018
import {nagSuppressions} from "../nagSuppressions"
2119
import {Apis} from "../resources/Apis"
2220
import {Functions} from "../resources/Functions"
2321
import {Storage} from "../resources/Storage"
22+
import {Secrets} from "../resources/Secrets"
2423

2524
const EMBEDDING_MODEL = "amazon.titan-embed-text-v2:0"
2625
const COLLECTION_NAME = "eps-assist-vector-db"
@@ -51,36 +50,10 @@ export class EpsAssistMeStack extends Stack {
5150
throw new Error("Missing required context variables. Please provide slackBotToken and slackSigningSecret")
5251
}
5352

54-
// Create secrets in Secrets Manager
55-
const slackBotTokenSecret = new secretsmanager.Secret(this, "SlackBotTokenSecret", {
56-
secretName: "/eps-assist/slack/bot-token",
57-
description: "Slack Bot OAuth Token for EPS Assist",
58-
secretStringValue: cdk.SecretValue.unsafePlainText(JSON.stringify({
59-
token: slackBotToken
60-
}))
61-
})
62-
63-
const slackBotSigningSecret = new secretsmanager.Secret(this, "SlackBotSigningSecret", {
64-
secretName: "/eps-assist/slack/signing-secret",
65-
description: "Slack Signing Secret",
66-
secretStringValue: cdk.SecretValue.unsafePlainText(JSON.stringify({
67-
secret: slackSigningSecret
68-
}))
69-
})
70-
71-
// Create SSM parameters that reference the secrets
72-
const slackBotTokenParameter = new ssm.StringParameter(this, "SlackBotTokenParameter", {
73-
parameterName: "/eps-assist/slack/bot-token/parameter",
74-
stringValue: `{{resolve:secretsmanager:${slackBotTokenSecret.secretName}}}`,
75-
description: "Reference to Slack Bot Token in Secrets Manager",
76-
tier: ssm.ParameterTier.STANDARD
77-
})
78-
79-
const slackSigningSecretParameter = new ssm.StringParameter(this, "SlackSigningSecretParameter", {
80-
parameterName: "/eps-assist/slack/signing-secret/parameter",
81-
stringValue: `{{resolve:secretsmanager:${slackBotSigningSecret.secretName}}}`,
82-
description: "Reference to Slack Signing Secret in Secrets Manager",
83-
tier: ssm.ParameterTier.STANDARD
53+
// Create Secrets construct
54+
const secrets = new Secrets(this, "Secrets", {
55+
slackBotToken,
56+
slackSigningSecret
8457
})
8558

8659
// Create an IAM policy to invoke Bedrock models and access titan v1 embedding model
@@ -272,16 +245,16 @@ export class EpsAssistMeStack extends Stack {
272245
logRetentionInDays,
273246
logLevel,
274247
createIndexFunctionRole,
275-
slackBotTokenParameter,
276-
slackSigningSecretParameter,
248+
slackBotTokenParameter: secrets.slackBotTokenParameter,
249+
slackSigningSecretParameter: secrets.slackSigningSecretParameter,
277250
guardrailId: GUARD_RAIL_ID,
278251
guardrailVersion: GUARD_RAIL_VERSION,
279252
collectionId: osCollection.attrId,
280253
knowledgeBaseId: bedrockkb.attrKnowledgeBaseId,
281254
region,
282255
account,
283-
slackBotTokenSecret,
284-
slackBotSigningSecret
256+
slackBotTokenSecret: secrets.slackBotTokenSecret,
257+
slackBotSigningSecret: secrets.slackBotSigningSecret
285258
})
286259

287260
// Define OpenSearchServerless access policy to access the index and collection

0 commit comments

Comments
 (0)