alchemy 0.54.0 → 0.55.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/alchemy.js +38717 -11847
- package/lib/aws/ec2/index.d.ts +10 -0
- package/lib/aws/ec2/index.d.ts.map +1 -0
- package/lib/aws/ec2/index.js +10 -0
- package/lib/aws/ec2/index.js.map +1 -0
- package/lib/aws/ec2/internet-gateway-attachment.d.ts +150 -0
- package/lib/aws/ec2/internet-gateway-attachment.d.ts.map +1 -0
- package/lib/aws/ec2/internet-gateway-attachment.js +248 -0
- package/lib/aws/ec2/internet-gateway-attachment.js.map +1 -0
- package/lib/aws/ec2/internet-gateway.d.ts +132 -0
- package/lib/aws/ec2/internet-gateway.d.ts.map +1 -0
- package/lib/aws/ec2/internet-gateway.js +311 -0
- package/lib/aws/ec2/internet-gateway.js.map +1 -0
- package/lib/aws/ec2/nat-gateway.d.ts +145 -0
- package/lib/aws/ec2/nat-gateway.d.ts.map +1 -0
- package/lib/aws/ec2/nat-gateway.js +618 -0
- package/lib/aws/ec2/nat-gateway.js.map +1 -0
- package/lib/aws/ec2/route-table-association.d.ts +134 -0
- package/lib/aws/ec2/route-table-association.d.ts.map +1 -0
- package/lib/aws/ec2/route-table-association.js +364 -0
- package/lib/aws/ec2/route-table-association.js.map +1 -0
- package/lib/aws/ec2/route-table.d.ts +94 -0
- package/lib/aws/ec2/route-table.d.ts.map +1 -0
- package/lib/aws/ec2/route-table.js +253 -0
- package/lib/aws/ec2/route-table.js.map +1 -0
- package/lib/aws/ec2/route.d.ts +130 -0
- package/lib/aws/ec2/route.d.ts.map +1 -0
- package/lib/aws/ec2/route.js +253 -0
- package/lib/aws/ec2/route.js.map +1 -0
- package/lib/aws/ec2/security-group-rule.d.ts +84 -0
- package/lib/aws/ec2/security-group-rule.d.ts.map +1 -0
- package/lib/aws/ec2/security-group-rule.js +123 -0
- package/lib/aws/ec2/security-group-rule.js.map +1 -0
- package/lib/aws/ec2/security-group.d.ts +84 -0
- package/lib/aws/ec2/security-group.d.ts.map +1 -0
- package/lib/aws/ec2/security-group.js +207 -0
- package/lib/aws/ec2/security-group.js.map +1 -0
- package/lib/aws/ec2/subnet.d.ts +110 -0
- package/lib/aws/ec2/subnet.d.ts.map +1 -0
- package/lib/aws/ec2/subnet.js +336 -0
- package/lib/aws/ec2/subnet.js.map +1 -0
- package/lib/aws/ec2/utils.d.ts +15 -0
- package/lib/aws/ec2/utils.d.ts.map +1 -0
- package/lib/aws/ec2/utils.js +79 -0
- package/lib/aws/ec2/utils.js.map +1 -0
- package/lib/aws/ec2/vpc.d.ts +160 -0
- package/lib/aws/ec2/vpc.d.ts.map +1 -0
- package/lib/aws/ec2/vpc.js +453 -0
- package/lib/aws/ec2/vpc.js.map +1 -0
- package/lib/aws/index.d.ts +7 -0
- package/lib/aws/index.d.ts.map +1 -1
- package/lib/aws/index.js +8 -0
- package/lib/aws/index.js.map +1 -1
- package/lib/aws/utils.d.ts +25 -0
- package/lib/aws/utils.d.ts.map +1 -0
- package/lib/aws/utils.js +89 -0
- package/lib/aws/utils.js.map +1 -0
- package/lib/build-date.d.ts +6 -0
- package/lib/build-date.d.ts.map +1 -0
- package/lib/build-date.js +8 -0
- package/lib/build-date.js.map +1 -0
- package/lib/cloudflare/worker-metadata.d.ts +1 -1
- package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
- package/lib/cloudflare/worker-metadata.js +1 -0
- package/lib/cloudflare/worker-metadata.js.map +1 -1
- package/lib/cloudflare/worker.d.ts +0 -2
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +1 -1
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/util/params.d.ts +5 -0
- package/lib/util/params.d.ts.map +1 -0
- package/lib/util/params.js +30 -0
- package/lib/util/params.js.map +1 -0
- package/lib/util/timeout.d.ts +31 -0
- package/lib/util/timeout.d.ts.map +1 -0
- package/lib/util/timeout.js +109 -0
- package/lib/util/timeout.js.map +1 -0
- package/lib/util/xml.d.ts +5 -0
- package/lib/util/xml.d.ts.map +1 -0
- package/lib/util/xml.js +8 -0
- package/lib/util/xml.js.map +1 -0
- package/package.json +7 -5
- package/src/aws/ec2/index.ts +9 -0
- package/src/aws/ec2/internet-gateway-attachment.ts +468 -0
- package/src/aws/ec2/internet-gateway.ts +557 -0
- package/src/aws/ec2/nat-gateway.ts +1123 -0
- package/src/aws/ec2/route-table-association.ts +747 -0
- package/src/aws/ec2/route-table.ts +452 -0
- package/src/aws/ec2/route.ts +447 -0
- package/src/aws/ec2/security-group-rule.ts +229 -0
- package/src/aws/ec2/security-group.ts +418 -0
- package/src/aws/ec2/subnet.ts +625 -0
- package/src/aws/ec2/utils.ts +102 -0
- package/src/aws/ec2/vpc.ts +969 -0
- package/src/aws/index.ts +9 -0
- package/src/aws/utils.ts +137 -0
- package/src/build-date.ts +8 -0
- package/src/cloudflare/worker-metadata.ts +1 -1
- package/src/cloudflare/worker.ts +1 -1
- package/src/util/params.ts +33 -0
- package/src/util/timeout.ts +178 -0
- package/src/util/xml.ts +7 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { XMLParser } from "fast-xml-parser";
|
|
2
|
+
import { Resource } from "../../resource.js";
|
|
3
|
+
import { ignore } from "../../util/ignore.js";
|
|
4
|
+
import { logger } from "../../util/logger.js";
|
|
5
|
+
import { mergeTimeoutConfig, waitForResourceState, } from "../../util/timeout.js";
|
|
6
|
+
import { retry } from "../retry.js";
|
|
7
|
+
import { callEC2Api, createEC2Client } from "./utils.js";
|
|
8
|
+
/**
|
|
9
|
+
* Wait for subnet to be in available state
|
|
10
|
+
*/
|
|
11
|
+
async function waitForSubnetAvailable(client, subnetId, timeoutConfig) {
|
|
12
|
+
const checkFunction = async () => {
|
|
13
|
+
const response = await callEC2Api(client, "DescribeSubnets", parseSubnetXmlResponse, {
|
|
14
|
+
"SubnetId.1": subnetId,
|
|
15
|
+
});
|
|
16
|
+
return response.Subnets?.[0];
|
|
17
|
+
};
|
|
18
|
+
const isReady = (subnet) => {
|
|
19
|
+
return subnet?.State === "available";
|
|
20
|
+
};
|
|
21
|
+
await waitForResourceState(checkFunction, isReady, timeoutConfig, subnetId, "Subnet", "is now available");
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Wait for Subnet to be deleted
|
|
25
|
+
*/
|
|
26
|
+
async function waitForSubnetDeleted(client, subnetId, timeoutConfig) {
|
|
27
|
+
const checkFunction = async () => {
|
|
28
|
+
try {
|
|
29
|
+
const response = await callEC2Api(client, "DescribeSubnets", parseSubnetXmlResponse, {
|
|
30
|
+
"SubnetId.1": subnetId,
|
|
31
|
+
});
|
|
32
|
+
return response.Subnets?.[0];
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
// If Subnet is not found, it's been deleted - return undefined
|
|
36
|
+
if (error.code === "InvalidSubnetID.NotFound" ||
|
|
37
|
+
error.code === "InvalidSubnet.NotFound") {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const isReady = (subnet) => {
|
|
44
|
+
// Subnet is deleted if it doesn't exist
|
|
45
|
+
return !subnet;
|
|
46
|
+
};
|
|
47
|
+
await waitForResourceState(checkFunction, isReady, timeoutConfig, subnetId, "Subnet", "be deleted");
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* AWS Subnet Resource
|
|
51
|
+
*
|
|
52
|
+
* Creates and manages subnets within a VPC. Subnets are used to segment
|
|
53
|
+
* your VPC into smaller networks for organizing resources.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* // Create a public subnet for web servers
|
|
57
|
+
* const publicSubnet = await Subnet("public-subnet", {
|
|
58
|
+
* vpc: myVpc,
|
|
59
|
+
* cidrBlock: "10.0.1.0/24",
|
|
60
|
+
* availabilityZone: process.env.AWS_REGION ? `${process.env.AWS_REGION}a` : "us-east-1a",
|
|
61
|
+
* mapPublicIpOnLaunch: true,
|
|
62
|
+
* tags: {
|
|
63
|
+
* Name: "public-subnet",
|
|
64
|
+
* Type: "public"
|
|
65
|
+
* }
|
|
66
|
+
* });
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* // Create a private subnet for databases
|
|
70
|
+
* const privateSubnet = await Subnet("private-subnet", {
|
|
71
|
+
* vpc: myVpc,
|
|
72
|
+
* cidrBlock: "10.0.2.0/24",
|
|
73
|
+
* availabilityZone: "us-west-2b",
|
|
74
|
+
* mapPublicIpOnLaunch: false,
|
|
75
|
+
* tags: {
|
|
76
|
+
* Name: "private-subnet",
|
|
77
|
+
* Type: "private"
|
|
78
|
+
* }
|
|
79
|
+
* });
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* // Create a subnet with custom timeout configuration
|
|
83
|
+
* const customSubnet = await Subnet("custom-subnet", {
|
|
84
|
+
* vpc: myVpc,
|
|
85
|
+
* cidrBlock: "10.0.3.0/24",
|
|
86
|
+
* availabilityZone: "us-west-2c",
|
|
87
|
+
* timeout: {
|
|
88
|
+
* maxAttempts: 50,
|
|
89
|
+
* delayMs: 500
|
|
90
|
+
* }
|
|
91
|
+
* });
|
|
92
|
+
*/
|
|
93
|
+
export const Subnet = Resource("aws::Subnet", async function (_id, props) {
|
|
94
|
+
const client = await createEC2Client();
|
|
95
|
+
const vpcId = typeof props.vpc === "string" ? props.vpc : props.vpc.vpcId;
|
|
96
|
+
// Validate timeout config early, but use default for deletion if invalid
|
|
97
|
+
let timeoutConfig;
|
|
98
|
+
try {
|
|
99
|
+
timeoutConfig = mergeTimeoutConfig(SUBNET_TIMEOUT, props.timeout);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (this.phase === "delete") {
|
|
103
|
+
// Use default timeout for deletion to avoid blocking cleanup
|
|
104
|
+
timeoutConfig = SUBNET_TIMEOUT;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Re-throw validation error during creation/update
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (this.phase === "delete") {
|
|
112
|
+
if (this.output?.subnetId) {
|
|
113
|
+
logger.log(`🗑️ Deleting Subnet: ${this.output.subnetId}`);
|
|
114
|
+
await retry(async () => {
|
|
115
|
+
await ignore("InvalidSubnetID.NotFound", async () => {
|
|
116
|
+
await callEC2Api(client, "DeleteSubnet", parseSubnetXmlResponse, {
|
|
117
|
+
SubnetId: this.output.subnetId,
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
// Wait for Subnet to be fully deleted to avoid dependency violations
|
|
122
|
+
logger.log(` Waiting for Subnet ${this.output.subnetId} to be fully deleted...`);
|
|
123
|
+
await waitForSubnetDeleted(client, this.output.subnetId, timeoutConfig);
|
|
124
|
+
logger.log(` ✅ Subnet ${this.output.subnetId} deletion completed`);
|
|
125
|
+
}
|
|
126
|
+
return this.destroy();
|
|
127
|
+
}
|
|
128
|
+
let subnet;
|
|
129
|
+
if (this.phase === "update" && this.output?.subnetId) {
|
|
130
|
+
// Get existing subnet
|
|
131
|
+
const response = await callEC2Api(client, "DescribeSubnets", parseSubnetXmlResponse, {
|
|
132
|
+
"SubnetId.1": this.output.subnetId,
|
|
133
|
+
});
|
|
134
|
+
if (!response.Subnets?.[0]) {
|
|
135
|
+
throw new Error(`Subnet ${this.output.subnetId} not found`);
|
|
136
|
+
}
|
|
137
|
+
subnet = response.Subnets[0];
|
|
138
|
+
// Update public IP assignment if it has changed
|
|
139
|
+
if (props.mapPublicIpOnLaunch !== undefined) {
|
|
140
|
+
await callEC2Api(client, "ModifySubnetAttribute", parseSubnetXmlResponse, {
|
|
141
|
+
SubnetId: subnet.SubnetId,
|
|
142
|
+
"MapPublicIpOnLaunch.Value": props.mapPublicIpOnLaunch.toString(),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
// Update tags if provided
|
|
146
|
+
if (props.tags) {
|
|
147
|
+
const tagParams = {};
|
|
148
|
+
Object.entries(props.tags).forEach(([key, value], index) => {
|
|
149
|
+
tagParams[`Tag.${index + 1}.Key`] = key;
|
|
150
|
+
tagParams[`Tag.${index + 1}.Value`] = value;
|
|
151
|
+
});
|
|
152
|
+
await callEC2Api(client, "CreateTags", parseSubnetXmlResponse, {
|
|
153
|
+
"ResourceId.1": subnet.SubnetId,
|
|
154
|
+
...tagParams,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Create new subnet
|
|
160
|
+
const createSubnetParams = {
|
|
161
|
+
VpcId: vpcId,
|
|
162
|
+
CidrBlock: props.cidrBlock,
|
|
163
|
+
AvailabilityZone: props.availabilityZone,
|
|
164
|
+
};
|
|
165
|
+
// Add tags if specified
|
|
166
|
+
if (props.tags) {
|
|
167
|
+
createSubnetParams.TagSpecifications = [
|
|
168
|
+
{
|
|
169
|
+
ResourceType: "subnet",
|
|
170
|
+
Tags: Object.entries(props.tags).map(([key, value]) => ({
|
|
171
|
+
Key: key,
|
|
172
|
+
Value: value,
|
|
173
|
+
})),
|
|
174
|
+
},
|
|
175
|
+
];
|
|
176
|
+
}
|
|
177
|
+
const createParams = convertCreateSubnetParamsToAwsFormat(createSubnetParams);
|
|
178
|
+
const response = await callEC2Api(client, "CreateSubnet", parseSubnetXmlResponse, createParams);
|
|
179
|
+
if (!response.Subnet) {
|
|
180
|
+
throw new Error("Failed to create subnet");
|
|
181
|
+
}
|
|
182
|
+
subnet = response.Subnet;
|
|
183
|
+
// Set public IP assignment if specified
|
|
184
|
+
if (props.mapPublicIpOnLaunch !== undefined) {
|
|
185
|
+
await callEC2Api(client, "ModifySubnetAttribute", parseSubnetXmlResponse, {
|
|
186
|
+
SubnetId: subnet.SubnetId,
|
|
187
|
+
"MapPublicIpOnLaunch.Value": props.mapPublicIpOnLaunch.toString(),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
// Wait for subnet to be available
|
|
191
|
+
await waitForSubnetAvailable(client, subnet.SubnetId, timeoutConfig);
|
|
192
|
+
}
|
|
193
|
+
return this({
|
|
194
|
+
subnetId: subnet.SubnetId,
|
|
195
|
+
vpcId: subnet.VpcId,
|
|
196
|
+
state: subnet.State,
|
|
197
|
+
availableIpAddressCount: subnet.AvailableIpAddressCount,
|
|
198
|
+
defaultForAz: subnet.DefaultForAz,
|
|
199
|
+
...props,
|
|
200
|
+
vpc: vpcId,
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
/**
|
|
204
|
+
* Parse XML responses specifically for Subnet operations
|
|
205
|
+
*/
|
|
206
|
+
function parseSubnetXmlResponse(xmlText) {
|
|
207
|
+
const parser = new XMLParser({
|
|
208
|
+
ignoreAttributes: true,
|
|
209
|
+
parseAttributeValue: true,
|
|
210
|
+
parseTagValue: true,
|
|
211
|
+
trimValues: true,
|
|
212
|
+
});
|
|
213
|
+
const parsed = parser.parse(xmlText);
|
|
214
|
+
const result = {};
|
|
215
|
+
// Parse CreateSubnetResponse
|
|
216
|
+
if (parsed.CreateSubnetResponse) {
|
|
217
|
+
const subnet = parsed.CreateSubnetResponse.subnet;
|
|
218
|
+
if (subnet) {
|
|
219
|
+
result.Subnet = {
|
|
220
|
+
SubnetId: subnet.subnetId,
|
|
221
|
+
VpcId: subnet.vpcId,
|
|
222
|
+
State: subnet.state,
|
|
223
|
+
CidrBlock: subnet.cidrBlock,
|
|
224
|
+
AvailabilityZone: subnet.availabilityZone,
|
|
225
|
+
AvailableIpAddressCount: subnet.availableIpAddressCount,
|
|
226
|
+
DefaultForAz: subnet.defaultForAz,
|
|
227
|
+
MapPublicIpOnLaunch: subnet.mapPublicIpOnLaunch,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Parse DescribeSubnetsResponse
|
|
232
|
+
if (parsed.DescribeSubnetsResponse) {
|
|
233
|
+
const subnetSet = parsed.DescribeSubnetsResponse.subnetSet;
|
|
234
|
+
if (subnetSet?.item) {
|
|
235
|
+
const subnets = Array.isArray(subnetSet.item)
|
|
236
|
+
? subnetSet.item
|
|
237
|
+
: [subnetSet.item];
|
|
238
|
+
result.Subnets = subnets.map((subnet) => ({
|
|
239
|
+
SubnetId: subnet.subnetId,
|
|
240
|
+
VpcId: subnet.vpcId,
|
|
241
|
+
State: subnet.state,
|
|
242
|
+
CidrBlock: subnet.cidrBlock,
|
|
243
|
+
AvailabilityZone: subnet.availabilityZone,
|
|
244
|
+
AvailableIpAddressCount: subnet.availableIpAddressCount,
|
|
245
|
+
DefaultForAz: subnet.defaultForAz,
|
|
246
|
+
MapPublicIpOnLaunch: subnet.mapPublicIpOnLaunch,
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
result.Subnets = [];
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Generic success responses
|
|
254
|
+
const successResponses = [
|
|
255
|
+
"ModifySubnetAttributeResponse",
|
|
256
|
+
"DeleteSubnetResponse",
|
|
257
|
+
];
|
|
258
|
+
for (const responseType of successResponses) {
|
|
259
|
+
if (parsed[responseType]) {
|
|
260
|
+
result.success = true;
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Subnet timeout constants
|
|
268
|
+
*/
|
|
269
|
+
export const SUBNET_TIMEOUT = {
|
|
270
|
+
maxAttempts: 30,
|
|
271
|
+
delayMs: 1000, // 1 second - Subnets are quick
|
|
272
|
+
};
|
|
273
|
+
/**
|
|
274
|
+
* Helper functions to convert typed parameters to AWS API format
|
|
275
|
+
*/
|
|
276
|
+
function convertCreateSubnetParamsToAwsFormat(params) {
|
|
277
|
+
const awsParams = {
|
|
278
|
+
VpcId: params.VpcId,
|
|
279
|
+
};
|
|
280
|
+
if (params.CidrBlock) {
|
|
281
|
+
awsParams.CidrBlock = params.CidrBlock;
|
|
282
|
+
}
|
|
283
|
+
if (params.Ipv6CidrBlock) {
|
|
284
|
+
awsParams.Ipv6CidrBlock = params.Ipv6CidrBlock;
|
|
285
|
+
}
|
|
286
|
+
if (params.AvailabilityZone) {
|
|
287
|
+
awsParams.AvailabilityZone = params.AvailabilityZone;
|
|
288
|
+
}
|
|
289
|
+
if (params.AvailabilityZoneId) {
|
|
290
|
+
awsParams.AvailabilityZoneId = params.AvailabilityZoneId;
|
|
291
|
+
}
|
|
292
|
+
if (params.OutpostArn) {
|
|
293
|
+
awsParams.OutpostArn = params.OutpostArn;
|
|
294
|
+
}
|
|
295
|
+
if (params.CustomerOwnedIpv4Pool) {
|
|
296
|
+
awsParams.CustomerOwnedIpv4Pool = params.CustomerOwnedIpv4Pool;
|
|
297
|
+
}
|
|
298
|
+
if (params.MapPublicIpOnLaunch !== undefined) {
|
|
299
|
+
awsParams.MapPublicIpOnLaunch = params.MapPublicIpOnLaunch.toString();
|
|
300
|
+
}
|
|
301
|
+
if (params.MapCustomerOwnedIpOnLaunch !== undefined) {
|
|
302
|
+
awsParams.MapCustomerOwnedIpOnLaunch =
|
|
303
|
+
params.MapCustomerOwnedIpOnLaunch.toString();
|
|
304
|
+
}
|
|
305
|
+
if (params.Ipv4IpamPoolId) {
|
|
306
|
+
awsParams.Ipv4IpamPoolId = params.Ipv4IpamPoolId;
|
|
307
|
+
}
|
|
308
|
+
if (params.Ipv4NetmaskLength !== undefined) {
|
|
309
|
+
awsParams.Ipv4NetmaskLength = params.Ipv4NetmaskLength.toString();
|
|
310
|
+
}
|
|
311
|
+
if (params.Ipv6IpamPoolId) {
|
|
312
|
+
awsParams.Ipv6IpamPoolId = params.Ipv6IpamPoolId;
|
|
313
|
+
}
|
|
314
|
+
if (params.Ipv6NetmaskLength !== undefined) {
|
|
315
|
+
awsParams.Ipv6NetmaskLength = params.Ipv6NetmaskLength.toString();
|
|
316
|
+
}
|
|
317
|
+
if (params.DryRun !== undefined) {
|
|
318
|
+
awsParams.DryRun = params.DryRun.toString();
|
|
319
|
+
}
|
|
320
|
+
// Handle TagSpecifications
|
|
321
|
+
if (params.TagSpecifications) {
|
|
322
|
+
params.TagSpecifications.forEach((tagSpec, specIndex) => {
|
|
323
|
+
const specNum = specIndex + 1;
|
|
324
|
+
awsParams[`TagSpecification.${specNum}.ResourceType`] =
|
|
325
|
+
tagSpec.ResourceType;
|
|
326
|
+
tagSpec.Tags.forEach((tag, tagIndex) => {
|
|
327
|
+
const tagNum = tagIndex + 1;
|
|
328
|
+
awsParams[`TagSpecification.${specNum}.Tag.${tagNum}.Key`] = tag.Key;
|
|
329
|
+
awsParams[`TagSpecification.${specNum}.Tag.${tagNum}.Value`] =
|
|
330
|
+
tag.Value;
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
return awsParams;
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=subnet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subnet.js","sourceRoot":"","sources":["../../../src/aws/ec2/subnet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AwsClient } from "aws4fetch";
|
|
2
|
+
import { getRegion } from "../utils.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Shared EC2 utilities for all EC2 resources
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create an AWS EC2 client
|
|
8
|
+
*/
|
|
9
|
+
export declare function createEC2Client(): Promise<AwsClient>;
|
|
10
|
+
/**
|
|
11
|
+
* Make an EC2 API call with custom response parser
|
|
12
|
+
*/
|
|
13
|
+
export declare function callEC2Api<T>(client: AwsClient, action: string, responseParser: (xmlText: string) => T, params?: Record<string, any>): Promise<T>;
|
|
14
|
+
export { getRegion };
|
|
15
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/aws/ec2/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;GAEG;AAEH;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,SAAS,CAAC,CAS1D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAChC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,EACtC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAC/B,OAAO,CAAC,CAAC,CAAC,CAkEZ;AAGD,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { fromNodeProviderChain } from "@aws-sdk/credential-providers";
|
|
2
|
+
import { AwsClient } from "aws4fetch";
|
|
3
|
+
import { logger } from "../../util/logger.js";
|
|
4
|
+
import { flattenParams } from "../../util/params.js";
|
|
5
|
+
import { getRegion } from "../utils.js";
|
|
6
|
+
/**
|
|
7
|
+
* Shared EC2 utilities for all EC2 resources
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Create an AWS EC2 client
|
|
11
|
+
*/
|
|
12
|
+
export async function createEC2Client() {
|
|
13
|
+
const credentials = await fromNodeProviderChain()();
|
|
14
|
+
const region = await getRegion();
|
|
15
|
+
return new AwsClient({
|
|
16
|
+
...credentials,
|
|
17
|
+
service: "ec2",
|
|
18
|
+
region,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Make an EC2 API call with custom response parser
|
|
23
|
+
*/
|
|
24
|
+
export async function callEC2Api(client, action, responseParser, params = {}) {
|
|
25
|
+
// Try the API call, and retry once with fresh credentials on auth failure
|
|
26
|
+
for (let attempt = 1; attempt <= 2; attempt++) {
|
|
27
|
+
try {
|
|
28
|
+
const region = await getRegion();
|
|
29
|
+
const url = `https://ec2.${region}.amazonaws.com/`;
|
|
30
|
+
const body = new URLSearchParams({
|
|
31
|
+
Action: action,
|
|
32
|
+
Version: "2016-11-15",
|
|
33
|
+
...flattenParams(params),
|
|
34
|
+
});
|
|
35
|
+
const signedRequest = await client.sign(url, {
|
|
36
|
+
method: "POST",
|
|
37
|
+
headers: {
|
|
38
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
39
|
+
},
|
|
40
|
+
body: body.toString(),
|
|
41
|
+
});
|
|
42
|
+
const response = await fetch(signedRequest);
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
const errorText = await response.text();
|
|
45
|
+
// Parse AWS error code from XML response
|
|
46
|
+
const errorCodeMatch = errorText.match(/<Code>([^<]+)<\/Code>/);
|
|
47
|
+
const errorCode = errorCodeMatch ? errorCodeMatch[1] : null;
|
|
48
|
+
// If this is an auth failure and we haven't retried yet, create a fresh client and retry
|
|
49
|
+
if (errorCode === "AuthFailure" && attempt === 1) {
|
|
50
|
+
logger.log(`🔄 Auth failure detected, refreshing credentials and retrying ${action}...`);
|
|
51
|
+
// Create a fresh client with new credentials
|
|
52
|
+
client = await createEC2Client();
|
|
53
|
+
continue; // Retry with fresh client
|
|
54
|
+
}
|
|
55
|
+
const error = new Error(`EC2 API error: ${response.status} ${response.statusText}\n${errorText}`);
|
|
56
|
+
// Set the error code for the ignore function
|
|
57
|
+
if (errorCode) {
|
|
58
|
+
error.code = errorCode;
|
|
59
|
+
}
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
const xmlText = await response.text();
|
|
63
|
+
const parsed = responseParser(xmlText);
|
|
64
|
+
return parsed;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
// If it's not an auth failure or we've already retried, throw the error
|
|
68
|
+
if (attempt === 2 || !error?.message?.includes("AuthFailure")) {
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
// Otherwise, continue to retry
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// This should never be reached, but TypeScript needs it
|
|
75
|
+
throw new Error("Unexpected error in API call retry logic");
|
|
76
|
+
}
|
|
77
|
+
// Re-export getRegion for convenience
|
|
78
|
+
export { getRegion };
|
|
79
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/aws/ec2/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import type { Context } from "../../context.ts";
|
|
2
|
+
import { Resource } from "../../resource.ts";
|
|
3
|
+
import { type TimeoutConfig } from "../../util/timeout.ts";
|
|
4
|
+
/**
|
|
5
|
+
* Properties for creating or updating a VPC
|
|
6
|
+
*/
|
|
7
|
+
export interface VpcProps {
|
|
8
|
+
/**
|
|
9
|
+
* The IPv4 network range for the VPC, in CIDR notation
|
|
10
|
+
* @example "10.0.0.0/16"
|
|
11
|
+
*/
|
|
12
|
+
cidrBlock: string;
|
|
13
|
+
/**
|
|
14
|
+
* Whether to enable DNS resolution for the VPC
|
|
15
|
+
* @default true
|
|
16
|
+
*/
|
|
17
|
+
enableDnsSupport?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Whether to enable DNS hostnames for the VPC
|
|
20
|
+
* @default true
|
|
21
|
+
*/
|
|
22
|
+
enableDnsHostnames?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* The tenancy option for instances launched into the VPC
|
|
25
|
+
* @default "default"
|
|
26
|
+
*/
|
|
27
|
+
instanceTenancy?: "default" | "dedicated" | "host";
|
|
28
|
+
/**
|
|
29
|
+
* Additional IPv4 CIDR blocks to associate with the VPC
|
|
30
|
+
* These will be associated after VPC creation
|
|
31
|
+
*/
|
|
32
|
+
additionalCidrBlocks?: string[];
|
|
33
|
+
/**
|
|
34
|
+
* IPv6 CIDR block configuration
|
|
35
|
+
*/
|
|
36
|
+
ipv6Config?: {
|
|
37
|
+
/**
|
|
38
|
+
* Whether to assign an Amazon-provided IPv6 CIDR block
|
|
39
|
+
*/
|
|
40
|
+
amazonProvidedIpv6CidrBlock?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* The ID of an IPv6 address pool from which to allocate the IPv6 CIDR block
|
|
43
|
+
*/
|
|
44
|
+
ipv6Pool?: string;
|
|
45
|
+
/**
|
|
46
|
+
* The netmask length of the IPv6 CIDR block
|
|
47
|
+
* @default 56
|
|
48
|
+
*/
|
|
49
|
+
ipv6CidrBlockNetworkBorderGroup?: string;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Tags to apply to the VPC
|
|
53
|
+
*/
|
|
54
|
+
tags?: Record<string, string>;
|
|
55
|
+
/**
|
|
56
|
+
* Timeout configuration for VPC operations
|
|
57
|
+
* @default VPC-specific sensible defaults (60 attempts, 2000ms delay)
|
|
58
|
+
*/
|
|
59
|
+
timeout?: Partial<TimeoutConfig>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Output returned after VPC creation/update
|
|
63
|
+
*/
|
|
64
|
+
export interface Vpc extends Resource<"aws::Vpc">, VpcProps {
|
|
65
|
+
/**
|
|
66
|
+
* The ID of the VPC
|
|
67
|
+
*/
|
|
68
|
+
vpcId: string;
|
|
69
|
+
/**
|
|
70
|
+
* The current state of the VPC
|
|
71
|
+
*/
|
|
72
|
+
state: "pending" | "available";
|
|
73
|
+
/**
|
|
74
|
+
* Whether the VPC is the default VPC
|
|
75
|
+
*/
|
|
76
|
+
isDefault: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* The ID of the set of DHCP options associated with the VPC
|
|
79
|
+
*/
|
|
80
|
+
dhcpOptionsId: string;
|
|
81
|
+
/**
|
|
82
|
+
* Information about the IPv4 CIDR blocks associated with the VPC
|
|
83
|
+
*/
|
|
84
|
+
cidrBlockAssociationSet?: Array<{
|
|
85
|
+
associationId: string;
|
|
86
|
+
cidrBlock: string;
|
|
87
|
+
cidrBlockState: {
|
|
88
|
+
state: "associating" | "associated" | "disassociating" | "disassociated" | "failing" | "failed";
|
|
89
|
+
statusMessage?: string;
|
|
90
|
+
};
|
|
91
|
+
}>;
|
|
92
|
+
/**
|
|
93
|
+
* Information about the IPv6 CIDR blocks associated with the VPC
|
|
94
|
+
*/
|
|
95
|
+
ipv6CidrBlockAssociationSet?: Array<{
|
|
96
|
+
associationId: string;
|
|
97
|
+
ipv6CidrBlock: string;
|
|
98
|
+
ipv6CidrBlockState: {
|
|
99
|
+
state: "associating" | "associated" | "disassociating" | "disassociated" | "failing" | "failed";
|
|
100
|
+
statusMessage?: string;
|
|
101
|
+
};
|
|
102
|
+
networkBorderGroup?: string;
|
|
103
|
+
ipv6Pool?: string;
|
|
104
|
+
}>;
|
|
105
|
+
/**
|
|
106
|
+
* The ID of the AWS account that owns the VPC
|
|
107
|
+
*/
|
|
108
|
+
ownerId?: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* AWS VPC (Virtual Private Cloud) Resource
|
|
112
|
+
*
|
|
113
|
+
* Creates and manages Amazon VPC instances with configurable CIDR blocks,
|
|
114
|
+
* DNS settings, and instance tenancy options.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* // Create a basic VPC with default settings
|
|
118
|
+
* const vpc = await Vpc("main-vpc", {
|
|
119
|
+
* cidrBlock: "10.0.0.0/16",
|
|
120
|
+
* tags: {
|
|
121
|
+
* Name: "main-vpc",
|
|
122
|
+
* Environment: "production"
|
|
123
|
+
* }
|
|
124
|
+
* });
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* // Create a VPC with custom DNS settings
|
|
128
|
+
* const vpc = await Vpc("custom-vpc", {
|
|
129
|
+
* cidrBlock: "172.16.0.0/16",
|
|
130
|
+
* enableDnsSupport: true,
|
|
131
|
+
* enableDnsHostnames: true,
|
|
132
|
+
* instanceTenancy: "default",
|
|
133
|
+
* tags: {
|
|
134
|
+
* Name: "custom-vpc"
|
|
135
|
+
* }
|
|
136
|
+
* });
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* // Create a VPC with dedicated tenancy and custom timeout
|
|
140
|
+
* const dedicatedVpc = await Vpc("dedicated-vpc", {
|
|
141
|
+
* cidrBlock: "192.168.0.0/16",
|
|
142
|
+
* instanceTenancy: "dedicated",
|
|
143
|
+
* enableDnsSupport: false,
|
|
144
|
+
* enableDnsHostnames: false,
|
|
145
|
+
* timeout: {
|
|
146
|
+
* maxAttempts: 90,
|
|
147
|
+
* delayMs: 3000
|
|
148
|
+
* },
|
|
149
|
+
* tags: {
|
|
150
|
+
* Name: "dedicated-vpc",
|
|
151
|
+
* Type: "isolated"
|
|
152
|
+
* }
|
|
153
|
+
* });
|
|
154
|
+
*/
|
|
155
|
+
export declare const Vpc: (((this: any, id: string, props?: {}) => never) & (new (_: never) => never)) | ((this: Context<Vpc>, _id: string, props: VpcProps) => Promise<Vpc>);
|
|
156
|
+
/**
|
|
157
|
+
* VPC timeout constants
|
|
158
|
+
*/
|
|
159
|
+
export declare const VPC_TIMEOUT: TimeoutConfig;
|
|
160
|
+
//# sourceMappingURL=vpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vpc.d.ts","sourceRoot":"","sources":["../../../src/aws/ec2/vpc.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,OAAO,EAEL,KAAK,aAAa,EAEnB,MAAM,uBAAuB,CAAC;AAG/B;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,eAAe,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;IAEnD;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhC;;OAEG;IACH,UAAU,CAAC,EAAE;QACX;;WAEG;QACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;QACtC;;WAEG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB;;;WAGG;QACH,+BAA+B,CAAC,EAAE,MAAM,CAAC;KAC1C,CAAC;IAEF;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,GAAI,SAAQ,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ;IACzD;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC;IAE/B;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,uBAAuB,CAAC,EAAE,KAAK,CAAC;QAC9B,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE;YACd,KAAK,EACD,aAAa,GACb,YAAY,GACZ,gBAAgB,GAChB,eAAe,GACf,SAAS,GACT,QAAQ,CAAC;YACb,aAAa,CAAC,EAAE,MAAM,CAAC;SACxB,CAAC;KACH,CAAC,CAAC;IAEH;;OAEG;IACH,2BAA2B,CAAC,EAAE,KAAK,CAAC;QAClC,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,kBAAkB,EAAE;YAClB,KAAK,EACD,aAAa,GACb,YAAY,GACZ,gBAAgB,GAChB,eAAe,GACf,SAAS,GACT,QAAQ,CAAC;YACb,aAAa,CAAC,EAAE,MAAM,CAAC;SACxB,CAAC;QACF,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IAEH;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,eAAO,MAAM,GAAG,yFAGN,OAAO,CAAC,GAAG,CAAC,OACb,MAAM,SACJ,QAAQ,KACd,OAAO,CAAC,GAAG,CAAC,CAwJhB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,aAGzB,CAAC"}
|