Skip to content

Commit 4c032ee

Browse files
committed
Move slackBotManagedPolicy from Functions to IamResources
1 parent 8b19a6c commit 4c032ee

File tree

4 files changed

+46
-34
lines changed

4 files changed

+46
-34
lines changed

packages/cdk/nagSuppressions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export const nagSuppressions = (stack: Stack) => {
127127
// Suppress wildcard permissions for SlackBot managed policy
128128
safeAddNagSuppression(
129129
stack,
130-
"/EpsAssistMeStack/Functions/SlackBotManagedPolicy/Resource",
130+
"/EpsAssistMeStack/IamResources/SlackBotManagedPolicy/Resource",
131131
[
132132
{
133133
id: "AwsSolutions-IAM5",

packages/cdk/resources/Functions.ts

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {Construct} from "constructs"
22
import {LambdaFunction} from "../constructs/LambdaFunction"
3-
import {PolicyStatement, ManagedPolicy} from "aws-cdk-lib/aws-iam"
3+
import {ManagedPolicy} from "aws-cdk-lib/aws-iam"
44
import {StringParameter} from "aws-cdk-lib/aws-ssm"
55
import {Secret} from "aws-cdk-lib/aws-secretsmanager"
66

@@ -17,6 +17,7 @@ export interface FunctionsProps {
1717
logRetentionInDays: number
1818
logLevel: string
1919
createIndexManagedPolicy: ManagedPolicy
20+
slackBotManagedPolicy: ManagedPolicy
2021
slackBotTokenParameter: StringParameter
2122
slackSigningSecretParameter: StringParameter
2223
guardrailId: string
@@ -47,36 +48,6 @@ export class Functions extends Construct {
4748
additionalPolicies: [props.createIndexManagedPolicy]
4849
})
4950

50-
// Create managed policies for SlackBot Lambda
51-
const slackBotManagedPolicy = new ManagedPolicy(this, "SlackBotManagedPolicy", {
52-
description: "Policy for SlackBot Lambda to access Bedrock, SSM, and Lambda",
53-
statements: [
54-
new PolicyStatement({
55-
actions: ["bedrock:InvokeModel"],
56-
resources: [`arn:aws:bedrock:${props.region}::foundation-model/${RAG_MODEL_ID}`]
57-
}),
58-
new PolicyStatement({
59-
actions: ["bedrock:Retrieve", "bedrock:RetrieveAndGenerate"],
60-
resources: [`arn:aws:bedrock:${props.region}:${props.account}:knowledge-base/*`]
61-
}),
62-
new PolicyStatement({
63-
actions: ["ssm:GetParameter"],
64-
resources: [
65-
`arn:aws:ssm:${props.region}:${props.account}:parameter${props.slackBotTokenParameter.parameterName}`,
66-
`arn:aws:ssm:${props.region}:${props.account}:parameter${props.slackSigningSecretParameter.parameterName}`
67-
]
68-
}),
69-
new PolicyStatement({
70-
actions: ["lambda:InvokeFunction"],
71-
resources: [`arn:aws:lambda:${props.region}:${props.account}:function:*`]
72-
}),
73-
new PolicyStatement({
74-
actions: ["bedrock:ApplyGuardrail"],
75-
resources: [`arn:aws:bedrock:${props.region}:${props.account}:guardrail/*`]
76-
})
77-
]
78-
})
79-
8051
// Lambda function to handle Slack bot interactions
8152
const slackBotLambda = new LambdaFunction(this, "SlackBotLambda", {
8253
stackName: props.stackName,
@@ -85,7 +56,7 @@ export class Functions extends Construct {
8556
entryPoint: "app.py",
8657
logRetentionInDays: props.logRetentionInDays,
8758
logLevel: props.logLevel,
88-
additionalPolicies: [slackBotManagedPolicy],
59+
additionalPolicies: [props.slackBotManagedPolicy],
8960
environmentVariables: {
9061
"RAG_MODEL_ID": RAG_MODEL_ID,
9162
"SLACK_SLASH_COMMAND": SLACK_SLASH_COMMAND,

packages/cdk/resources/IamResources.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,21 @@ import {Bucket} from "aws-cdk-lib/aws-s3"
99

1010
// Amazon Titan embedding model for vector generation
1111
const EMBEDDING_MODEL = "amazon.titan-embed-text-v2:0"
12+
// Claude model for RAG responses
13+
const RAG_MODEL_ID = "anthropic.claude-3-sonnet-20240229-v1:0"
1214

1315
export interface IamResourcesProps {
1416
region: string
1517
account: string
1618
kbDocsBucket: Bucket
19+
slackBotTokenParameterName: string
20+
slackSigningSecretParameterName: string
1721
}
1822

1923
export class IamResources extends Construct {
2024
public readonly bedrockExecutionRole: Role
2125
public readonly createIndexManagedPolicy: ManagedPolicy
26+
public readonly slackBotManagedPolicy: ManagedPolicy
2227

2328
constructor(scope: Construct, id: string, props: IamResourcesProps) {
2429
super(scope, id)
@@ -104,5 +109,38 @@ export class IamResources extends Construct {
104109
description: "Policy for Lambda to create OpenSearch index"
105110
})
106111
this.createIndexManagedPolicy.addStatements(createIndexPolicy)
112+
113+
// Create managed policy for SlackBot Lambda function
114+
const slackBotPolicy = new PolicyStatement()
115+
slackBotPolicy.addActions("bedrock:InvokeModel")
116+
slackBotPolicy.addResources(`arn:aws:bedrock:${props.region}::foundation-model/${RAG_MODEL_ID}`)
117+
118+
const slackBotKnowledgeBasePolicy = new PolicyStatement()
119+
slackBotKnowledgeBasePolicy.addActions("bedrock:Retrieve", "bedrock:RetrieveAndGenerate")
120+
slackBotKnowledgeBasePolicy.addResources(`arn:aws:bedrock:${props.region}:${props.account}:knowledge-base/*`)
121+
122+
const slackBotSSMPolicy = new PolicyStatement()
123+
slackBotSSMPolicy.addActions("ssm:GetParameter")
124+
slackBotSSMPolicy.addResources(
125+
`arn:aws:ssm:${props.region}:${props.account}:parameter${props.slackBotTokenParameterName}`,
126+
`arn:aws:ssm:${props.region}:${props.account}:parameter${props.slackSigningSecretParameterName}`
127+
)
128+
129+
const slackBotLambdaPolicy = new PolicyStatement()
130+
slackBotLambdaPolicy.addActions("lambda:InvokeFunction")
131+
slackBotLambdaPolicy.addResources(`arn:aws:lambda:${props.region}:${props.account}:function:*`)
132+
133+
const slackBotGuardrailPolicy = new PolicyStatement()
134+
slackBotGuardrailPolicy.addActions("bedrock:ApplyGuardrail")
135+
slackBotGuardrailPolicy.addResources(`arn:aws:bedrock:${props.region}:${props.account}:guardrail/*`)
136+
137+
this.slackBotManagedPolicy = new ManagedPolicy(this, "SlackBotManagedPolicy", {
138+
description: "Policy for SlackBot Lambda to access Bedrock, SSM, and Lambda"
139+
})
140+
this.slackBotManagedPolicy.addStatements(slackBotPolicy)
141+
this.slackBotManagedPolicy.addStatements(slackBotKnowledgeBasePolicy)
142+
this.slackBotManagedPolicy.addStatements(slackBotSSMPolicy)
143+
this.slackBotManagedPolicy.addStatements(slackBotLambdaPolicy)
144+
this.slackBotManagedPolicy.addStatements(slackBotGuardrailPolicy)
107145
}
108146
}

packages/cdk/stacks/EpsAssistMeStack.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ export class EpsAssistMeStack extends Stack {
5656
const iamResources = new IamResources(this, "IamResources", {
5757
region,
5858
account,
59-
kbDocsBucket: storage.kbDocsBucket.bucket
59+
kbDocsBucket: storage.kbDocsBucket.bucket,
60+
slackBotTokenParameterName: secrets.slackBotTokenParameter.parameterName,
61+
slackSigningSecretParameterName: secrets.slackSigningSecretParameter.parameterName
6062
})
6163

6264
// Create OpenSearch Resources
@@ -75,6 +77,7 @@ export class EpsAssistMeStack extends Stack {
7577
logRetentionInDays,
7678
logLevel,
7779
createIndexManagedPolicy: iamResources.createIndexManagedPolicy,
80+
slackBotManagedPolicy: iamResources.slackBotManagedPolicy,
7881
slackBotTokenParameter: secrets.slackBotTokenParameter,
7982
slackSigningSecretParameter: secrets.slackSigningSecretParameter,
8083
guardrailId: "", // Will be set after vector KB is created

0 commit comments

Comments
 (0)