1import * as AWS from "alchemy/AWS";
2import type { Output } from "alchemy/Output";
3import * as Context from "effect/Context";
4import * as Effect from "effect/Effect";
5import * as Layer from "effect/Layer";
6
7export interface ExampleNetwork {
8 network: AWS.EC2.Network;
9 publicSubnetIds: Output<AWS.EC2.SubnetId>[];
10 appSecurityGroupId: Output<AWS.EC2.SecurityGroupId>;
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.42.0.0/16",
22 availabilityZones: 2,
23 nat: "single",
24 });
25
26 const appSecurityGroup = yield* AWS.EC2.SecurityGroup("AppSecurityGroup", {
27 vpcId: network.vpcId,
28 description: "Security group for the EC2 application instance",
29 ingress: [
30 {
31 ipProtocol: "tcp",
32 fromPort: 3000,
33 toPort: 3000,
34 cidrIpv4: "0.0.0.0/0",
35 },
36 ],
37 });
38
39 return {
40 network,
41 publicSubnetIds: network.publicSubnetIds,
42 appSecurityGroupId: appSecurityGroup.groupId,
43 };
44 }),
45);