1import * as AWS from "alchemy/AWS";
2import * as Context from "effect/Context";
3import * as Effect from "effect/Effect";
4import * as Layer from "effect/Layer";
5
6export interface ExampleNetwork {
7 vpc: AWS.EC2.Network;
8 functionSecurityGroup: AWS.EC2.SecurityGroup;
9 databaseSecurityGroup: AWS.EC2.SecurityGroup;
10 privateSecurityGroups: AWS.EC2.SecurityGroup[];
11}
12
13export class Network extends Context.Service<Network, ExampleNetwork>()(
14 "Network",
15) {}
16
17export const NetworkLive = Layer.effect(
18 Network,
19 Effect.gen(function* () {
20 const network = yield* AWS.EC2.Network("Network", {
21 cidrBlock: "10.0.0.0/16",
22 availabilityZones: 2,
23 nat: "single",
24 });
25
26 const functionSecurityGroup = yield* AWS.EC2.SecurityGroup(
27 "FunctionSecurityGroup",
28 {
29 vpcId: network.vpcId,
30 description: "Security group for the RDS example Lambda function",
31 },
32 );
33
34 const databaseSecurityGroup = yield* AWS.EC2.SecurityGroup(
35 "DatabaseSecurityGroup",
36 {
37 vpcId: network.vpcId,
38 description: "Security group for the RDS example Aurora cluster",
39 ingress: [
40 {
41 ipProtocol: "tcp",
42 fromPort: 5432,
43 toPort: 5432,
44 referencedGroupId: functionSecurityGroup.groupId,
45 description: "Allow Lambda to reach Aurora PostgreSQL",
46 },
47 ],
48 },
49 );
50
51 return {
52 vpc: network,
53 functionSecurityGroup,
54 databaseSecurityGroup,
55 privateSecurityGroups: [functionSecurityGroup],
56 } satisfies ExampleNetwork;
57 }),
58);