alchemy 0.1.16 → 0.1.17
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/lib/$.d.ts +12 -0
- package/lib/$.d.ts.map +1 -0
- package/lib/$.js +42 -0
- package/lib/$.js.map +1 -0
- package/lib/alchemize.d.ts +43 -0
- package/lib/alchemize.d.ts.map +1 -0
- package/lib/alchemize.js +112 -0
- package/lib/alchemize.js.map +1 -0
- package/lib/apply.d.ts +23 -0
- package/lib/aws/account-id.d.ts +5 -0
- package/lib/aws/account-id.d.ts.map +1 -0
- package/lib/aws/account-id.js +10 -0
- package/lib/aws/account-id.js.map +1 -0
- package/lib/aws/bucket.d.ts +21 -0
- package/lib/aws/bucket.d.ts.map +1 -0
- package/lib/aws/bucket.js +114 -0
- package/lib/aws/bucket.js.map +1 -0
- package/lib/aws/function.d.ts +53 -0
- package/lib/aws/function.d.ts.map +1 -0
- package/lib/aws/function.js +195 -0
- package/lib/aws/function.js.map +1 -0
- package/lib/aws/index.d.ts +9 -0
- package/lib/aws/index.d.ts.map +1 -0
- package/lib/aws/index.js +9 -0
- package/lib/aws/index.js.map +1 -0
- package/lib/aws/oidc/github-oidc-provider.d.ts +11 -0
- package/lib/aws/oidc/github-oidc-provider.d.ts.map +1 -0
- package/lib/aws/oidc/github-oidc-provider.js +22 -0
- package/lib/aws/oidc/github-oidc-provider.js.map +1 -0
- package/lib/aws/oidc/index.d.ts +3 -0
- package/lib/aws/oidc/index.d.ts.map +1 -0
- package/lib/aws/oidc/index.js +3 -0
- package/lib/aws/oidc/index.js.map +1 -0
- package/lib/aws/oidc/oidc-provider.d.ts +60 -0
- package/lib/aws/oidc/oidc-provider.d.ts.map +1 -0
- package/lib/aws/oidc/oidc-provider.js +140 -0
- package/lib/aws/oidc/oidc-provider.js.map +1 -0
- package/lib/aws/policy.d.ts +46 -0
- package/lib/aws/policy.d.ts.map +1 -0
- package/lib/aws/policy.js +139 -0
- package/lib/aws/policy.js.map +1 -0
- package/lib/aws/queue.d.ts +62 -0
- package/lib/aws/queue.d.ts.map +1 -0
- package/lib/aws/queue.js +167 -0
- package/lib/aws/queue.js.map +1 -0
- package/lib/aws/role.d.ts +27 -0
- package/lib/aws/role.d.ts.map +1 -0
- package/lib/aws/role.js +197 -0
- package/lib/aws/role.js.map +1 -0
- package/lib/aws/ses.d.ts +75 -0
- package/lib/aws/ses.d.ts.map +1 -0
- package/lib/aws/ses.js +189 -0
- package/lib/aws/ses.js.map +1 -0
- package/lib/aws/table.d.ts +26 -0
- package/lib/aws/table.d.ts.map +1 -0
- package/lib/aws/table.js +154 -0
- package/lib/aws/table.js.map +1 -0
- package/lib/cloudflare/api.d.ts +88 -0
- package/lib/cloudflare/api.d.ts.map +1 -0
- package/lib/cloudflare/api.js +184 -0
- package/lib/cloudflare/api.js.map +1 -0
- package/lib/cloudflare/asset-manifest.d.ts +15 -0
- package/lib/cloudflare/asset-manifest.d.ts.map +1 -0
- package/lib/cloudflare/asset-manifest.js +2 -0
- package/lib/cloudflare/asset-manifest.js.map +1 -0
- package/lib/cloudflare/auth.d.ts +52 -0
- package/lib/cloudflare/auth.d.ts.map +1 -0
- package/lib/cloudflare/auth.js +114 -0
- package/lib/cloudflare/auth.js.map +1 -0
- package/lib/cloudflare/bindings.d.ts +260 -0
- package/lib/cloudflare/bindings.d.ts.map +1 -0
- package/lib/cloudflare/bindings.js +2 -0
- package/lib/cloudflare/bindings.js.map +1 -0
- package/lib/cloudflare/bucket.d.ts +54 -0
- package/lib/cloudflare/bucket.d.ts.map +1 -0
- package/lib/cloudflare/bucket.js +120 -0
- package/lib/cloudflare/bucket.js.map +1 -0
- package/lib/cloudflare/durable-object-namespace.d.ts +20 -0
- package/lib/cloudflare/durable-object-namespace.d.ts.map +1 -0
- package/lib/cloudflare/durable-object-namespace.js +21 -0
- package/lib/cloudflare/durable-object-namespace.js.map +1 -0
- package/lib/cloudflare/generate-asset-manifest.d.ts +3 -0
- package/lib/cloudflare/generate-asset-manifest.d.ts.map +1 -0
- package/lib/cloudflare/generate-asset-manifest.js +69 -0
- package/lib/cloudflare/generate-asset-manifest.js.map +1 -0
- package/lib/cloudflare/index.d.ts +8 -0
- package/lib/cloudflare/index.d.ts.map +1 -0
- package/lib/cloudflare/index.js +8 -0
- package/lib/cloudflare/index.js.map +1 -0
- package/lib/cloudflare/kv-namespace.d.ts +64 -0
- package/lib/cloudflare/kv-namespace.d.ts.map +1 -0
- package/lib/cloudflare/kv-namespace.js +114 -0
- package/lib/cloudflare/kv-namespace.js.map +1 -0
- package/lib/cloudflare/state.d.ts +83 -0
- package/lib/cloudflare/state.d.ts.map +1 -0
- package/lib/cloudflare/state.js +109 -0
- package/lib/cloudflare/state.js.map +1 -0
- package/lib/cloudflare/static-site-router.d.ts +19 -0
- package/lib/cloudflare/static-site-router.d.ts.map +1 -0
- package/lib/cloudflare/static-site-router.js +110 -0
- package/lib/cloudflare/static-site-router.js.map +1 -0
- package/lib/cloudflare/static-site.d.ts +166 -0
- package/lib/cloudflare/static-site.d.ts.map +1 -0
- package/lib/cloudflare/static-site.js +161 -0
- package/lib/cloudflare/static-site.js.map +1 -0
- package/lib/cloudflare/types.d.ts +52 -0
- package/lib/cloudflare/types.d.ts.map +1 -0
- package/lib/cloudflare/types.js +21 -0
- package/lib/cloudflare/types.js.map +1 -0
- package/lib/cloudflare/upload-asset-manifest.d.ts +12 -0
- package/lib/cloudflare/upload-asset-manifest.d.ts.map +1 -0
- package/lib/cloudflare/upload-asset-manifest.js +55 -0
- package/lib/cloudflare/upload-asset-manifest.js.map +1 -0
- package/lib/cloudflare/worker-metadata.d.ts +130 -0
- package/lib/cloudflare/worker-metadata.d.ts.map +1 -0
- package/lib/cloudflare/worker-metadata.js +2 -0
- package/lib/cloudflare/worker-metadata.js.map +1 -0
- package/lib/cloudflare/worker-migration.d.ts +110 -0
- package/lib/cloudflare/worker-migration.d.ts.map +1 -0
- package/lib/cloudflare/worker-migration.js +11 -0
- package/lib/cloudflare/worker-migration.js.map +1 -0
- package/lib/cloudflare/worker.d.ts +108 -0
- package/lib/cloudflare/worker.d.ts.map +1 -0
- package/lib/cloudflare/worker.js +407 -0
- package/lib/cloudflare/worker.js.map +1 -0
- package/lib/destroy.d.ts +19 -0
- package/lib/error.d.ts +2 -0
- package/lib/error.d.ts.map +1 -0
- package/lib/error.js +13 -0
- package/lib/error.js.map +1 -0
- package/lib/esbuild.d.ts +152 -0
- package/lib/esbuild.d.ts.map +1 -0
- package/lib/esbuild.js +67 -0
- package/lib/esbuild.js.map +1 -0
- package/lib/fs.d.ts +12 -0
- package/lib/fs.d.ts.map +1 -0
- package/lib/fs.js +41 -0
- package/lib/fs.js.map +1 -0
- package/lib/github/client.d.ts +34 -0
- package/lib/github/client.d.ts.map +1 -0
- package/lib/github/client.js +91 -0
- package/lib/github/client.js.map +1 -0
- package/lib/github/index.d.ts +2 -0
- package/lib/github/index.d.ts.map +1 -0
- package/lib/github/index.js +2 -0
- package/lib/github/index.js.map +1 -0
- package/lib/github/secret.d.ts +46 -0
- package/lib/github/secret.d.ts.map +1 -0
- package/lib/github/secret.js +103 -0
- package/lib/github/secret.js.map +1 -0
- package/lib/global.d.ts +16 -0
- package/lib/global.d.ts.map +1 -0
- package/lib/global.js +42 -0
- package/lib/global.js.map +1 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +9 -0
- package/lib/index.js.map +1 -0
- package/lib/input.d.ts +6 -0
- package/lib/input.d.ts.map +1 -0
- package/lib/input.js +2 -0
- package/lib/input.js.map +1 -0
- package/lib/main.d.ts +3 -0
- package/lib/main.d.ts.map +1 -0
- package/lib/main.js +32 -0
- package/lib/main.js.map +1 -0
- package/lib/output.d.ts +24 -0
- package/lib/output.d.ts.map +1 -0
- package/lib/output.js +23 -0
- package/lib/output.js.map +1 -0
- package/lib/print.d.ts +7 -0
- package/lib/print.d.ts.map +1 -0
- package/lib/print.js +10 -0
- package/lib/print.js.map +1 -0
- package/lib/resource.d.ts +71 -0
- package/lib/resource.d.ts.map +1 -0
- package/lib/resource.js +276 -0
- package/lib/resource.js.map +1 -0
- package/lib/scope.d.ts +18 -0
- package/lib/scope.d.ts.map +1 -0
- package/lib/scope.js +30 -0
- package/lib/scope.js.map +1 -0
- package/lib/slug.d.ts +2 -0
- package/lib/slug.d.ts.map +1 -0
- package/lib/slug.js +4 -0
- package/lib/slug.js.map +1 -0
- package/lib/state.d.ts +40 -0
- package/lib/state.d.ts.map +1 -0
- package/lib/state.js +73 -0
- package/lib/state.js.map +1 -0
- package/lib/stripe/index.d.ts +4 -0
- package/lib/stripe/index.d.ts.map +1 -0
- package/lib/stripe/index.js +4 -0
- package/lib/stripe/index.js.map +1 -0
- package/lib/stripe/price.d.ts +109 -0
- package/lib/stripe/price.d.ts.map +1 -0
- package/lib/stripe/price.js +112 -0
- package/lib/stripe/price.js.map +1 -0
- package/lib/stripe/product.d.ts +86 -0
- package/lib/stripe/product.d.ts.map +1 -0
- package/lib/stripe/product.js +90 -0
- package/lib/stripe/product.js.map +1 -0
- package/lib/stripe/webhook.d.ts +73 -0
- package/lib/stripe/webhook.d.ts.map +1 -0
- package/lib/stripe/webhook.js +94 -0
- package/lib/stripe/webhook.js.map +1 -0
- package/lib/utils/content-type.d.ts +8 -0
- package/lib/utils/content-type.d.ts.map +1 -0
- package/lib/utils/content-type.js +41 -0
- package/lib/utils/content-type.js.map +1 -0
- package/lib/utils/retry.d.ts +13 -0
- package/lib/utils/retry.d.ts.map +1 -0
- package/lib/utils/retry.js +32 -0
- package/lib/utils/retry.js.map +1 -0
- package/package.json +1 -1
- package/src/cloudflare/bindings.ts +7 -1
- package/src/cloudflare/bucket.ts +240 -0
- package/src/cloudflare/index.ts +1 -0
- package/src/cloudflare/static-site.ts +13 -1
- package/src/cloudflare/worker.ts +7 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { Architecture, CreateFunctionCommand, DeleteFunctionCommand, GetFunctionCommand, GetFunctionConfigurationCommand, LambdaClient, ResourceNotFoundException, Runtime, UpdateFunctionCodeCommand, UpdateFunctionConfigurationCommand, } from "@aws-sdk/client-lambda";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { ignore } from "../error";
|
|
5
|
+
import { Resource } from "../resource";
|
|
6
|
+
async function resolveRegion(client) {
|
|
7
|
+
const region = client.config.region;
|
|
8
|
+
if (typeof region === "string")
|
|
9
|
+
return region;
|
|
10
|
+
if (typeof region === "function")
|
|
11
|
+
return region();
|
|
12
|
+
throw new Error("Could not resolve AWS region");
|
|
13
|
+
}
|
|
14
|
+
export class Function extends Resource("lambda::Function", async (ctx, props) => {
|
|
15
|
+
const client = new LambdaClient({});
|
|
16
|
+
const region = await resolveRegion(client);
|
|
17
|
+
const code = await zipCode(props.zipPath);
|
|
18
|
+
if (ctx.event === "delete") {
|
|
19
|
+
await ignore(ResourceNotFoundException.name, () => client.send(new DeleteFunctionCommand({
|
|
20
|
+
FunctionName: props.functionName,
|
|
21
|
+
})));
|
|
22
|
+
// Return a minimal FunctionOutput for deleted state
|
|
23
|
+
return {
|
|
24
|
+
...props,
|
|
25
|
+
id: props.functionName,
|
|
26
|
+
arn: `arn:aws:lambda:${region}:${process.env.AWS_ACCOUNT_ID}:function:${props.functionName}`,
|
|
27
|
+
lastModified: new Date().toISOString(),
|
|
28
|
+
version: "$LATEST",
|
|
29
|
+
qualifiedArn: `arn:aws:lambda:${region}:${process.env.AWS_ACCOUNT_ID}:function:${props.functionName}:$LATEST`,
|
|
30
|
+
invokeArn: `arn:aws:apigateway:${region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${region}:${process.env.AWS_ACCOUNT_ID}:function:${props.functionName}/invocations`,
|
|
31
|
+
sourceCodeHash: "",
|
|
32
|
+
sourceCodeSize: 0,
|
|
33
|
+
architectures: props.architecture
|
|
34
|
+
? [props.architecture]
|
|
35
|
+
: [Architecture.x86_64],
|
|
36
|
+
revisionId: "",
|
|
37
|
+
state: "Inactive",
|
|
38
|
+
packageType: "Zip",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
try {
|
|
43
|
+
// Check if function exists
|
|
44
|
+
const func = await client.send(new GetFunctionCommand({
|
|
45
|
+
FunctionName: props.functionName,
|
|
46
|
+
}));
|
|
47
|
+
if (ctx.event === "update") {
|
|
48
|
+
// Wait for function to stabilize
|
|
49
|
+
await waitForFunctionStabilization(client, props.functionName);
|
|
50
|
+
// Update function code
|
|
51
|
+
await client.send(new UpdateFunctionCodeCommand({
|
|
52
|
+
FunctionName: props.functionName,
|
|
53
|
+
ZipFile: code,
|
|
54
|
+
}));
|
|
55
|
+
// Wait for code update to stabilize
|
|
56
|
+
await waitForFunctionStabilization(client, props.functionName);
|
|
57
|
+
// Update function configuration
|
|
58
|
+
await client.send(new UpdateFunctionConfigurationCommand({
|
|
59
|
+
FunctionName: props.functionName,
|
|
60
|
+
Handler: props.handler,
|
|
61
|
+
Runtime: props.runtime,
|
|
62
|
+
Role: props.roleArn,
|
|
63
|
+
Description: props.description,
|
|
64
|
+
Timeout: props.timeout,
|
|
65
|
+
MemorySize: props.memorySize,
|
|
66
|
+
Environment: props.environment
|
|
67
|
+
? { Variables: props.environment }
|
|
68
|
+
: undefined,
|
|
69
|
+
}));
|
|
70
|
+
// Wait for configuration update to stabilize
|
|
71
|
+
await waitForFunctionStabilization(client, props.functionName);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error.name === "ResourceNotFoundException") {
|
|
76
|
+
// Create function if it doesn't exist
|
|
77
|
+
const startTime = Date.now();
|
|
78
|
+
let delay = 100; // Start with 100ms delay
|
|
79
|
+
while (true) {
|
|
80
|
+
try {
|
|
81
|
+
await client.send(new CreateFunctionCommand({
|
|
82
|
+
FunctionName: props.functionName,
|
|
83
|
+
Code: { ZipFile: code },
|
|
84
|
+
Handler: props.handler || "index.handler",
|
|
85
|
+
Runtime: props.runtime || Runtime.nodejs20x,
|
|
86
|
+
Role: props.roleArn,
|
|
87
|
+
Description: props.description,
|
|
88
|
+
Timeout: props.timeout || 3,
|
|
89
|
+
MemorySize: props.memorySize || 128,
|
|
90
|
+
Environment: props.environment
|
|
91
|
+
? { Variables: props.environment }
|
|
92
|
+
: undefined,
|
|
93
|
+
Architectures: props.architecture
|
|
94
|
+
? [props.architecture]
|
|
95
|
+
: [Architecture.x86_64],
|
|
96
|
+
Tags: props.tags,
|
|
97
|
+
}));
|
|
98
|
+
break; // Success - exit retry loop
|
|
99
|
+
}
|
|
100
|
+
catch (createError) {
|
|
101
|
+
if (createError.name !== "InvalidParameterValueException" ||
|
|
102
|
+
!createError.message?.includes("cannot be assumed by Lambda")) {
|
|
103
|
+
throw createError; // Different error - rethrow
|
|
104
|
+
}
|
|
105
|
+
if (Date.now() - startTime > 10000) {
|
|
106
|
+
throw new Error("Timeout waiting for IAM role to be assumable by Lambda after 10s");
|
|
107
|
+
}
|
|
108
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
109
|
+
delay = Math.min(delay * 2, 1000); // Exponential backoff capped at 1s
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Wait for function to be active
|
|
113
|
+
let isCreating = true;
|
|
114
|
+
while (isCreating) {
|
|
115
|
+
const config = await client.send(new GetFunctionConfigurationCommand({
|
|
116
|
+
FunctionName: props.functionName,
|
|
117
|
+
}));
|
|
118
|
+
isCreating = config.State === "Pending";
|
|
119
|
+
if (isCreating) {
|
|
120
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Get complete function details
|
|
129
|
+
const [func, config] = await Promise.all([
|
|
130
|
+
client.send(new GetFunctionCommand({
|
|
131
|
+
FunctionName: props.functionName,
|
|
132
|
+
})),
|
|
133
|
+
client.send(new GetFunctionConfigurationCommand({
|
|
134
|
+
FunctionName: props.functionName,
|
|
135
|
+
})),
|
|
136
|
+
]);
|
|
137
|
+
const output = {
|
|
138
|
+
...props,
|
|
139
|
+
id: props.functionName,
|
|
140
|
+
arn: config.FunctionArn,
|
|
141
|
+
lastModified: config.LastModified,
|
|
142
|
+
version: config.Version,
|
|
143
|
+
qualifiedArn: `${config.FunctionArn}:${config.Version}`,
|
|
144
|
+
invokeArn: `arn:aws:apigateway:${region}:lambda:path/2015-03-31/functions/${config.FunctionArn}/invocations`,
|
|
145
|
+
sourceCodeHash: config.CodeSha256,
|
|
146
|
+
sourceCodeSize: config.CodeSize,
|
|
147
|
+
ephemeralStorageSize: config.EphemeralStorage?.Size,
|
|
148
|
+
architectures: config.Architectures || [],
|
|
149
|
+
masterArn: config.MasterArn,
|
|
150
|
+
revisionId: config.RevisionId,
|
|
151
|
+
state: config.State,
|
|
152
|
+
stateReason: config.StateReason,
|
|
153
|
+
stateReasonCode: config.StateReasonCode,
|
|
154
|
+
lastUpdateStatus: config.LastUpdateStatus,
|
|
155
|
+
lastUpdateStatusReason: config.LastUpdateStatusReason,
|
|
156
|
+
lastUpdateStatusReasonCode: config.LastUpdateStatusReasonCode,
|
|
157
|
+
packageType: config.PackageType,
|
|
158
|
+
signingProfileVersionArn: config.SigningProfileVersionArn,
|
|
159
|
+
signingJobArn: config.SigningJobArn,
|
|
160
|
+
};
|
|
161
|
+
return output;
|
|
162
|
+
}
|
|
163
|
+
}) {
|
|
164
|
+
}
|
|
165
|
+
// Helper to wait for function to stabilize
|
|
166
|
+
async function waitForFunctionStabilization(client, functionName) {
|
|
167
|
+
while (true) {
|
|
168
|
+
const config = await client.send(new GetFunctionConfigurationCommand({
|
|
169
|
+
FunctionName: functionName,
|
|
170
|
+
}));
|
|
171
|
+
// Check if function is in a stable state
|
|
172
|
+
if (config.State === "Active" && config.LastUpdateStatus === "Successful") {
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
// If there's a failure, throw an error
|
|
176
|
+
if (config.State === "Failed" || config.LastUpdateStatus === "Failed") {
|
|
177
|
+
throw new Error(`Function failed to stabilize: ${config.StateReason || config.LastUpdateStatusReason}`);
|
|
178
|
+
}
|
|
179
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Helper to zip the code
|
|
183
|
+
async function zipCode(filePath) {
|
|
184
|
+
const fileContent = await fs.promises.readFile(filePath);
|
|
185
|
+
const fileName = path.basename(filePath);
|
|
186
|
+
// Create a zip buffer in memory
|
|
187
|
+
const zip = new (await import("jszip")).default();
|
|
188
|
+
zip.file(fileName, fileContent);
|
|
189
|
+
return zip.generateAsync({
|
|
190
|
+
type: "nodebuffer",
|
|
191
|
+
compression: "DEFLATE",
|
|
192
|
+
platform: "UNIX",
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/aws/function.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/aws/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC"}
|
package/lib/aws/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/aws/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Input } from "../../input";
|
|
2
|
+
import { OIDCProvider, type OIDCProviderProps } from "./oidc-provider";
|
|
3
|
+
export interface GitHubOIDCProviderProps extends Omit<OIDCProviderProps, "thumbprint"> {
|
|
4
|
+
owner: string;
|
|
5
|
+
repository: string;
|
|
6
|
+
thumbprint?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class GitHubOIDCProvider extends OIDCProvider {
|
|
9
|
+
constructor(id: string, props: Input<GitHubOIDCProviderProps>);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=github-oidc-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-oidc-provider.d.ts","sourceRoot":"","sources":["../../../src/aws/oidc/github-oidc-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AASvE,MAAM,WAAW,uBACf,SAAQ,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,uBAAuB,CAAC;CAc9D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { isOutput } from "../../output";
|
|
2
|
+
import { OIDCProvider } from "./oidc-provider";
|
|
3
|
+
/**
|
|
4
|
+
* Default thumbprint for GitHub's OIDC provider
|
|
5
|
+
* This is the certificate thumbprint that GitHub uses to sign OIDC tokens
|
|
6
|
+
* @see https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#adding-the-identity-provider-to-aws
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_GITHUB_THUMBPRINT = "6938fd4d98bab03faadb97b34396831e3780aea1";
|
|
9
|
+
export class GitHubOIDCProvider extends OIDCProvider {
|
|
10
|
+
constructor(id, props) {
|
|
11
|
+
super(id, isOutput(props)
|
|
12
|
+
? props.apply((props) => ({
|
|
13
|
+
...props,
|
|
14
|
+
thumbprint: props.thumbprint ?? DEFAULT_GITHUB_THUMBPRINT,
|
|
15
|
+
}))
|
|
16
|
+
: {
|
|
17
|
+
...props,
|
|
18
|
+
thumbprint: props.thumbprint ?? DEFAULT_GITHUB_THUMBPRINT,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=github-oidc-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-oidc-provider.js","sourceRoot":"","sources":["../../../src/aws/oidc/github-oidc-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAA0B,MAAM,iBAAiB,CAAC;AAEvE;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,0CAA0C,CAAC;AAS7E,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAClD,YAAY,EAAU,EAAE,KAAqC;QAC3D,KAAK,CACH,EAAE,EACF,QAAQ,CAA0B,KAAK,CAAC;YACtC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtB,GAAG,KAAK;gBACR,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,yBAAyB;aAC1D,CAAC,CAAC;YACL,CAAC,CAAE;gBACC,GAAG,KAAK;gBACR,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,yBAAyB;aAC7B,CACnC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/aws/oidc/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/aws/oidc/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Properties for configuring an AWS OIDC provider for GitHub Actions
|
|
3
|
+
*/
|
|
4
|
+
export interface OIDCProviderProps {
|
|
5
|
+
/**
|
|
6
|
+
* The GitHub organization or user that owns the repository
|
|
7
|
+
*/
|
|
8
|
+
owner: string;
|
|
9
|
+
/**
|
|
10
|
+
* The name of the GitHub repository
|
|
11
|
+
*/
|
|
12
|
+
repository: string;
|
|
13
|
+
/**
|
|
14
|
+
* Optional list of branches to restrict access to
|
|
15
|
+
* If not provided, all branches will be allowed
|
|
16
|
+
*/
|
|
17
|
+
branches?: string[];
|
|
18
|
+
/**
|
|
19
|
+
* Optional list of environments to restrict access to
|
|
20
|
+
* If not provided, all environments will be allowed
|
|
21
|
+
*/
|
|
22
|
+
environments?: string[];
|
|
23
|
+
/**
|
|
24
|
+
* The ARN of the IAM role to be assumed
|
|
25
|
+
*/
|
|
26
|
+
roleArn: string;
|
|
27
|
+
/**
|
|
28
|
+
* Optional maximum session duration in seconds (default: 3600)
|
|
29
|
+
*/
|
|
30
|
+
maxSessionDuration?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Thumbprint for the OIDC provider
|
|
33
|
+
*/
|
|
34
|
+
thumbprint: string;
|
|
35
|
+
/**
|
|
36
|
+
* Optional AWS region (defaults to AWS_REGION environment variable)
|
|
37
|
+
*/
|
|
38
|
+
region?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Output returned after OIDC provider configuration
|
|
42
|
+
*/
|
|
43
|
+
export interface OIDCProviderOutput extends OIDCProviderProps {
|
|
44
|
+
/**
|
|
45
|
+
* The ARN of the OIDC provider
|
|
46
|
+
*/
|
|
47
|
+
providerArn: string;
|
|
48
|
+
/**
|
|
49
|
+
* Time at which the provider was created
|
|
50
|
+
*/
|
|
51
|
+
createdAt: number;
|
|
52
|
+
}
|
|
53
|
+
declare const OIDCProvider_base: import("../../resource").Provider<"aws::OIDCProvider", [props: OIDCProviderProps], OIDCProviderOutput>;
|
|
54
|
+
/**
|
|
55
|
+
* Resource for configuring AWS OIDC provider for GitHub Actions
|
|
56
|
+
*/
|
|
57
|
+
export declare class OIDCProvider extends OIDCProvider_base {
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=oidc-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc-provider.d.ts","sourceRoot":"","sources":["../../../src/aws/oidc/oidc-provider.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;;AAQD;;GAEG;AACH,qBAAa,YAAa,SAAQ,iBAyKjC;CAAG"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { CreateOpenIDConnectProviderCommand, DeleteOpenIDConnectProviderCommand, GetOpenIDConnectProviderCommand, GetRoleCommand, IAMClient, UpdateAssumeRolePolicyCommand, } from "@aws-sdk/client-iam";
|
|
2
|
+
import { Resource } from "../../resource";
|
|
3
|
+
import { getAccountId } from "../account-id";
|
|
4
|
+
/**
|
|
5
|
+
* Unique identifier for our trust policy statement
|
|
6
|
+
* Used to track and remove our specific statement without affecting others
|
|
7
|
+
*/
|
|
8
|
+
const TRUST_POLICY_SID = "GitHubOIDCTrust";
|
|
9
|
+
/**
|
|
10
|
+
* Resource for configuring AWS OIDC provider for GitHub Actions
|
|
11
|
+
*/
|
|
12
|
+
export class OIDCProvider extends Resource("aws::OIDCProvider", async (ctx, props) => {
|
|
13
|
+
// Initialize AWS SDK client
|
|
14
|
+
const client = new IAMClient({
|
|
15
|
+
region: props.region,
|
|
16
|
+
});
|
|
17
|
+
if (ctx.event === "delete") {
|
|
18
|
+
if (ctx.output?.providerArn) {
|
|
19
|
+
try {
|
|
20
|
+
// First, remove our trust policy statement from the role
|
|
21
|
+
const getRole = await client.send(new GetRoleCommand({
|
|
22
|
+
RoleName: props.roleArn.split("/").pop(),
|
|
23
|
+
}));
|
|
24
|
+
if (getRole.Role?.AssumeRolePolicyDocument) {
|
|
25
|
+
const policy = JSON.parse(decodeURIComponent(getRole.Role.AssumeRolePolicyDocument));
|
|
26
|
+
// Remove our specific statement while preserving others
|
|
27
|
+
policy.Statement = policy.Statement.filter((stmt) => stmt.Sid !== TRUST_POLICY_SID);
|
|
28
|
+
await client.send(new UpdateAssumeRolePolicyCommand({
|
|
29
|
+
RoleName: props.roleArn.split("/").pop(),
|
|
30
|
+
PolicyDocument: JSON.stringify(policy),
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
// Then delete the OIDC provider if we're the last user
|
|
34
|
+
const provider = await client.send(new GetOpenIDConnectProviderCommand({
|
|
35
|
+
OpenIDConnectProviderArn: ctx.output.providerArn,
|
|
36
|
+
}));
|
|
37
|
+
// Only delete the provider if it exists and has no other tags
|
|
38
|
+
if (provider && (!provider.Tags || provider.Tags.length === 0)) {
|
|
39
|
+
await client.send(new DeleteOpenIDConnectProviderCommand({
|
|
40
|
+
OpenIDConnectProviderArn: ctx.output.providerArn,
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
// Log but don't throw on cleanup errors
|
|
46
|
+
console.error("Error during cleanup:", error);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const url = "https://token.actions.githubusercontent.com";
|
|
53
|
+
const thumbprint = props.thumbprint;
|
|
54
|
+
// Create or get existing OIDC provider
|
|
55
|
+
let providerArn;
|
|
56
|
+
try {
|
|
57
|
+
const createProvider = await client.send(new CreateOpenIDConnectProviderCommand({
|
|
58
|
+
Url: url,
|
|
59
|
+
ClientIDList: ["sts.amazonaws.com"],
|
|
60
|
+
ThumbprintList: [thumbprint],
|
|
61
|
+
Tags: [
|
|
62
|
+
{
|
|
63
|
+
Key: "ManagedBy",
|
|
64
|
+
Value: "alchemy",
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
}));
|
|
68
|
+
providerArn = createProvider.OpenIDConnectProviderArn;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error.name === "EntityAlreadyExistsException") {
|
|
72
|
+
// Provider exists, use its ARN
|
|
73
|
+
providerArn = `arn:aws:iam::${await getAccountId()}:oidc-provider/${url}`;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Get current role policy
|
|
80
|
+
const getRole = await client.send(new GetRoleCommand({
|
|
81
|
+
RoleName: props.roleArn.split("/").pop(),
|
|
82
|
+
}));
|
|
83
|
+
let policy;
|
|
84
|
+
if (getRole.Role?.AssumeRolePolicyDocument) {
|
|
85
|
+
policy = JSON.parse(decodeURIComponent(getRole.Role.AssumeRolePolicyDocument));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
policy = {
|
|
89
|
+
Version: "2012-10-17",
|
|
90
|
+
Statement: [],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Construct the trust policy conditions
|
|
94
|
+
const conditions = {
|
|
95
|
+
StringEquals: {
|
|
96
|
+
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
|
|
97
|
+
"token.actions.githubusercontent.com:sub": `repo:${props.owner}/${props.repository}:`,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
if (props.branches?.length) {
|
|
101
|
+
conditions.StringEquals["token.actions.githubusercontent.com:sub"] =
|
|
102
|
+
props.branches.map((branch) => `repo:${props.owner}/${props.repository}:ref:refs/heads/${branch}`);
|
|
103
|
+
}
|
|
104
|
+
if (props.environments?.length) {
|
|
105
|
+
conditions.StringEquals["token.actions.githubusercontent.com:sub"] =
|
|
106
|
+
props.environments.map((env) => `repo:${props.owner}/${props.repository}:environment:${env}`);
|
|
107
|
+
}
|
|
108
|
+
// Create our policy statement
|
|
109
|
+
const ourStatement = {
|
|
110
|
+
Sid: TRUST_POLICY_SID,
|
|
111
|
+
Effect: "Allow",
|
|
112
|
+
Principal: {
|
|
113
|
+
Federated: providerArn,
|
|
114
|
+
},
|
|
115
|
+
Action: "sts:AssumeRoleWithWebIdentity",
|
|
116
|
+
Condition: conditions,
|
|
117
|
+
};
|
|
118
|
+
// Remove any existing statement with our SID and add the new one
|
|
119
|
+
policy.Statement = [
|
|
120
|
+
...policy.Statement.filter((stmt) => stmt.Sid !== TRUST_POLICY_SID),
|
|
121
|
+
ourStatement,
|
|
122
|
+
];
|
|
123
|
+
// Update the role's trust policy
|
|
124
|
+
await client.send(new UpdateAssumeRolePolicyCommand({
|
|
125
|
+
RoleName: props.roleArn.split("/").pop(),
|
|
126
|
+
PolicyDocument: JSON.stringify(policy),
|
|
127
|
+
}));
|
|
128
|
+
return {
|
|
129
|
+
...props,
|
|
130
|
+
providerArn,
|
|
131
|
+
createdAt: Date.now(),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
console.error("Error configuring OIDC provider:", error);
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}) {
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=oidc-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc-provider.js","sourceRoot":"","sources":["../../../src/aws/oidc/oidc-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type Effect = "Allow" | "Deny";
|
|
2
|
+
export interface PolicyStatement {
|
|
3
|
+
Sid?: string;
|
|
4
|
+
Effect: Effect;
|
|
5
|
+
Action: string | string[];
|
|
6
|
+
Resource?: string | string[];
|
|
7
|
+
Condition?: Record<string, Record<string, string | string[]>>;
|
|
8
|
+
Principal?: Record<string, string | string[]>;
|
|
9
|
+
NotPrincipal?: Record<string, string | string[]>;
|
|
10
|
+
NotAction?: string | string[];
|
|
11
|
+
NotResource?: string | string[];
|
|
12
|
+
}
|
|
13
|
+
export interface PolicyDocument {
|
|
14
|
+
Version: "2012-10-17";
|
|
15
|
+
Statement: PolicyStatement[];
|
|
16
|
+
}
|
|
17
|
+
export interface PolicyProps {
|
|
18
|
+
policyName: string;
|
|
19
|
+
document: PolicyDocument;
|
|
20
|
+
description?: string;
|
|
21
|
+
path?: string;
|
|
22
|
+
tags?: Record<string, string>;
|
|
23
|
+
}
|
|
24
|
+
export interface PolicyOutput extends PolicyProps {
|
|
25
|
+
id: string;
|
|
26
|
+
arn: string;
|
|
27
|
+
defaultVersionId: string;
|
|
28
|
+
attachmentCount: number;
|
|
29
|
+
createDate: Date;
|
|
30
|
+
updateDate: Date;
|
|
31
|
+
isAttachable: boolean;
|
|
32
|
+
}
|
|
33
|
+
declare const Policy_base: import("../resource").Provider<"iam::Policy", [props: PolicyProps], PolicyOutput>;
|
|
34
|
+
export declare class Policy extends Policy_base {
|
|
35
|
+
}
|
|
36
|
+
export interface PolicyAttachmentProps {
|
|
37
|
+
policyArn: string;
|
|
38
|
+
roleName: string;
|
|
39
|
+
}
|
|
40
|
+
export interface PolicyAttachmentOutput extends PolicyAttachmentProps {
|
|
41
|
+
}
|
|
42
|
+
declare const PolicyAttachment_base: import("../resource").Provider<"iam::PolicyAttachment", [props: PolicyAttachmentProps], PolicyAttachmentProps>;
|
|
43
|
+
export declare class PolicyAttachment extends PolicyAttachment_base {
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/aws/policy.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtC,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAGD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;;AAED,qBAAa,MAAO,SAAQ,WA0J3B;CAAG;AAGJ,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;CAAG;;AAExE,qBAAa,gBAAiB,SAAQ,qBAyBrC;CAAG"}
|