Skip to content

Commit 62d6285

Browse files
fix(aws/cloudformation): add missing region validation and client cleanup to create-stack
- Add validateAwsRegion refinement to create-stack contract (completes P2 fix from Greptile review) - Wrap AWS SDK call in try/finally with client.destroy() (completes P2 fix from Greptile review) - Aligns create-stack with the pattern used across all 7 other new CloudFormation routes Co-authored-by: Waleed <waleedlatif1@users.noreply.github.com>
1 parent ebc0a1a commit 62d6285

2 files changed

Lines changed: 27 additions & 17 deletions

File tree

apps/sim/app/api/tools/cloudformation/create-stack/route.ts

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,24 +34,28 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
3434

3535
logger.info(`Creating CloudFormation stack "${validatedData.stackName}"`)
3636

37-
const command = new CreateStackCommand({
38-
StackName: validatedData.stackName,
39-
TemplateBody: validatedData.templateBody,
40-
Parameters: toStackParameters(validatedData.parameters),
41-
Capabilities: parseCapabilities(validatedData.capabilities),
42-
Tags: toStackTags(validatedData.tags),
43-
OnFailure: validatedData.onFailure,
44-
TimeoutInMinutes: validatedData.timeoutInMinutes,
45-
})
37+
try {
38+
const command = new CreateStackCommand({
39+
StackName: validatedData.stackName,
40+
TemplateBody: validatedData.templateBody,
41+
Parameters: toStackParameters(validatedData.parameters),
42+
Capabilities: parseCapabilities(validatedData.capabilities),
43+
Tags: toStackTags(validatedData.tags),
44+
OnFailure: validatedData.onFailure,
45+
TimeoutInMinutes: validatedData.timeoutInMinutes,
46+
})
4647

47-
const response = await client.send(command)
48+
const response = await client.send(command)
4849

49-
return NextResponse.json({
50-
success: true,
51-
output: {
52-
stackId: response.StackId ?? '',
53-
},
54-
})
50+
return NextResponse.json({
51+
success: true,
52+
output: {
53+
stackId: response.StackId ?? '',
54+
},
55+
})
56+
} finally {
57+
client.destroy()
58+
}
5559
} catch (error) {
5660
const errorMessage = getErrorMessage(error, 'Failed to create CloudFormation stack')
5761
logger.error('CreateStack failed', { error: errorMessage })

apps/sim/lib/api/contracts/tools/aws/cloudformation-create-stack.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,15 @@ import type {
55
ContractJsonResponse,
66
} from '@/lib/api/contracts/types'
77
import { defineRouteContract } from '@/lib/api/contracts/types'
8+
import { validateAwsRegion } from '@/lib/core/security/input-validation'
89

910
const CreateStackSchema = z.object({
10-
region: z.string().min(1, 'AWS region is required'),
11+
region: z
12+
.string()
13+
.min(1, 'AWS region is required')
14+
.refine((v) => validateAwsRegion(v).isValid, {
15+
message: 'Invalid AWS region format (e.g., us-east-1, eu-west-2)',
16+
}),
1117
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
1218
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
1319
stackName: z.string().min(1, 'Stack name is required'),

0 commit comments

Comments
 (0)