-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathapp.ts
77 lines (70 loc) · 1.8 KB
/
app.ts
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
73
74
75
76
77
import { alchemize } from "alchemy";
import { Function, Queue, Role, Table } from "alchemy/aws";
import { Bundle } from "alchemy/esbuild";
import path from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const queue = new Queue("alchemy-items-queue", {
queueName: "alchemy-items-queue",
visibilityTimeout: 30,
messageRetentionPeriod: 345600, // 4 days
});
// Create DynamoDB table
const table = new Table("alchemy-items-table", {
tableName: "alchemy-items",
partitionKey: {
name: "id",
type: "S",
},
});
// Create Lambda execution role with DynamoDB access
const role = new Role("alchemy-api-role", {
roleName: "alchemy-api-lambda-role",
assumeRolePolicy: {
Version: "2012-10-17",
Statement: [
{
Effect: "Allow",
Principal: {
Service: "lambda.amazonaws.com",
},
Action: "sts:AssumeRole",
},
],
},
});
// Create Lambda function
const bundle = new Bundle("api-bundle", {
entryPoint: path.join(__dirname, "handler.ts"),
outdir: ".out",
format: "esm",
platform: "node",
target: "node20",
minify: true,
sourcemap: true,
// Don't bundle aws-sdk as it's provided by Lambda
external: ["@aws-sdk/*"],
});
const api = new Function("api", {
functionName: "alchemy-items-api",
zipPath: bundle.path,
roleArn: role.arn,
handler: "index.handler",
environment: {
TABLE_NAME: table.tableName,
},
url: {
// Enable public access
authType: "NONE",
cors: {
allowOrigins: ["*"],
allowMethods: ["GET", "POST", "PUT", "DELETE"],
allowHeaders: ["content-type"],
},
},
});
await alchemize({
// decide the mode/stage however you want
mode: process.argv[2] === "destroy" ? "destroy" : "up",
stage: process.argv[3],
});