@ez4/aws-function 0.0.0 → 0.1.0
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/dist/function/client.d.ts +4 -1
- package/dist/main.cjs +95 -67
- package/dist/main.d.ts +3 -0
- package/dist/main.mjs +87 -58
- package/dist/mapping/client.d.ts +18 -0
- package/dist/mapping/handler.d.ts +3 -0
- package/dist/mapping/service.d.ts +5 -0
- package/dist/mapping/types.d.ts +18 -0
- package/dist/permission/service.d.ts +2 -2
- package/dist/permission/types.d.ts +6 -3
- package/package.json +7 -8
|
@@ -23,9 +23,12 @@ export type UpdateConfigRequest = {
|
|
|
23
23
|
timeout?: number;
|
|
24
24
|
memory?: number;
|
|
25
25
|
};
|
|
26
|
+
export type UpdateSourceCodeRequest = {
|
|
27
|
+
sourceFile: string;
|
|
28
|
+
};
|
|
26
29
|
export declare const createFunction: (request: CreateRequest) => Promise<CreateResponse>;
|
|
27
30
|
export declare const tagFunction: (functionArn: Arn, tags: ResourceTags) => Promise<void>;
|
|
28
31
|
export declare const untagFunction: (functionArn: Arn, tagKeys: string[]) => Promise<void>;
|
|
29
|
-
export declare const updateSourceCode: (functionName: string,
|
|
32
|
+
export declare const updateSourceCode: (functionName: string, request: UpdateSourceCodeRequest) => Promise<void>;
|
|
30
33
|
export declare const updateConfiguration: (functionName: string, request: UpdateConfigRequest) => Promise<void>;
|
|
31
34
|
export declare const deleteFunction: (functionName: string) => Promise<void>;
|
package/dist/main.cjs
CHANGED
|
@@ -1,68 +1,96 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
typeof t=="object"||typeof t=="function")for(let o of
|
|
3
|
-
|
|
4
|
-
enumerable:!0}):
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
{
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
{FunctionName:e,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
e.result.functionArn===t.result?.functionArn,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
async()=>{
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
e.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
1
|
+
"use strict";var Ce=Object.create;var v=Object.defineProperty;var Ae=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var Ne=Object.getPrototypeOf,ve=Object.prototype.hasOwnProperty;var be=(e,t)=>{for(var n in t)v(e,n,{get:t[n],enumerable:!0})},L=(e,t,n,r)=>{if(t&&
|
|
2
|
+
typeof t=="object"||typeof t=="function")for(let o of Ee(t))!ve.call(e,o)&&o!==n&&
|
|
3
|
+
v(e,o,{get:()=>t[o],enumerable:!(r=Ae(t,o))||r.enumerable});return e};var Me=(e,t,n)=>(n=e!=null?Ce(Ne(e)):{},L(t||!e||!e.__esModule?v(n,"default",{value:e,
|
|
4
|
+
enumerable:!0}):n,e)),he=e=>L(v({},"__esModule",{value:!0}),e);var ct={};be(ct,{FunctionServiceName:()=>i,FunctionServiceType:()=>c,MappingServiceName:()=>u,
|
|
5
|
+
MappingServiceType:()=>d,PermissionServiceName:()=>g,PermissionServiceType:()=>f,
|
|
6
|
+
createFunction:()=>et,createMapping:()=>at,createPermission:()=>rt,getFunction:()=>tt,
|
|
7
|
+
getFunctionArn:()=>$e,getFunctionName:()=>F,isFunction:()=>fe,isMapping:()=>ot,isPermission:()=>nt,
|
|
8
|
+
registerTriggers:()=>it});module.exports=he(ct);var I=require("@ez4/aws-common");var X=require("@aws-sdk/client-lambda"),w=require("@ez4/aws-common"),m=require("@ez4/utils"),
|
|
9
|
+
U=require("@ez4/aws-identity");var a=require("@aws-sdk/client-lambda"),l=require("@ez4/aws-common");var V=require("@ez4/aws-common");var i="AWS:Lambda/Function",c="aws:lambda.function";var Ie=/[a-z][\w]+/i,Te=e=>Ie.test(e),T=e=>{for(let t in e)if(!Te(t))throw new V.InvalidParameterError(
|
|
10
|
+
i,`name ${t} for variable unsupported.`)};var B=Me(require("adm-zip"),1),$=require("node:fs/promises"),W=async(e,t)=>{let n=new B.default,
|
|
11
|
+
r=await(0,$.readFile)(e);return n.addFile(t,r),n.toBufferPromise()};var y=new a.LambdaClient({}),z={maxWaitTime:90,client:y},Z=async e=>{l.Logger.logCreate(
|
|
12
|
+
i,e.functionName),e.variables&&T(e.variables);let t=await y.send(new a.CreateFunctionCommand(
|
|
13
|
+
{Publish:!0,FunctionName:e.functionName,Description:e.description,MemorySize:e.memory,
|
|
14
|
+
Timeout:e.timeout,Role:e.roleArn,PackageType:"Zip",Handler:Q(e.handlerName),Runtime:"\
|
|
15
|
+
nodejs20.x",Code:{ZipFile:await J(e.sourceFile)},Environment:{Variables:e.variables},
|
|
16
|
+
Tags:{...e.tags,ManagedBy:"EZ4"}})),n=t.FunctionName,r=t.FunctionArn;return await(0,a.waitUntilFunctionActive)(
|
|
17
|
+
z,{FunctionName:n}),{functionName:n,functionArn:r}},G=async(e,t)=>{l.Logger.logTag(
|
|
18
|
+
i,e),await y.send(new a.TagResourceCommand({Resource:e,Tags:{...t,ManagedBy:"EZ4"}}))},
|
|
19
|
+
k=async(e,t)=>{l.Logger.logUntag(i,e),await y.send(new a.UntagResourceCommand({Resource:e,
|
|
20
|
+
TagKeys:t}))},O=async(e,t)=>{l.Logger.logUpdate(i,`${e} source code`);let{sourceFile:n}=t;
|
|
21
|
+
await y.send(new a.UpdateFunctionCodeCommand({FunctionName:e,ZipFile:await J(n),
|
|
22
|
+
Publish:!0})),await(0,a.waitUntilFunctionUpdated)(z,{FunctionName:e})},K=async(e,t)=>{
|
|
23
|
+
l.Logger.logUpdate(i,`${e} configuration`),t.variables&&T(t.variables);let{handlerName:n}=t;
|
|
24
|
+
await y.send(new a.UpdateFunctionConfigurationCommand({FunctionName:e,Description:t.
|
|
25
|
+
description,MemorySize:t.memory,Timeout:t.timeout,Role:t.roleArn,...n&&{Handler:Q(
|
|
26
|
+
n)},Environment:{Variables:t.variables}})),await(0,a.waitUntilFunctionUpdated)(z,
|
|
27
|
+
{FunctionName:e})},_=async e=>{l.Logger.logDelete(i,e),await y.send(new a.DeleteFunctionCommand(
|
|
28
|
+
{FunctionName:e}))},J=e=>W(e,"main.mjs"),Q=e=>`main.${e}`;var Y=()=>({equals:ze,create:q,replace:De,preview:Ue,update:He,delete:je}),ze=(e,t)=>!!e.
|
|
29
|
+
result&&e.result.functionArn===t.result?.functionArn,Ue=async(e,t)=>{let n=e.parameters,
|
|
30
|
+
r=(0,m.deepCompare)({...e.parameters,sourceHash:await(0,m.hashFile)(n.sourceFile)},
|
|
31
|
+
{...t.parameters,sourceHash:t.result?.sourceHash});if(r.counts)return{...r,name:n.
|
|
32
|
+
functionName}},De=async(e,t,n)=>{if(t.result)throw new w.ReplaceResourceError(i,
|
|
33
|
+
e.entryId,t.entryId);return q(e,n)},q=async(e,t)=>{let n=e.parameters,r=n.functionName,
|
|
34
|
+
o=(0,U.getRoleArn)(i,r,t),p=n.sourceFile,A=await(0,m.hashFile)(p),S,E=await(0,m.waitFor)(
|
|
35
|
+
async()=>{try{return await Z({...n,sourceFile:p,roleArn:o})}catch(N){if(!(N instanceof
|
|
36
|
+
X.InvalidParameterValueException))throw N;return S=N,null}});if(!E)throw S;return{
|
|
37
|
+
functionName:E.functionName,functionArn:E.functionArn,sourceHash:A,roleArn:o}},He=async(e,t,n)=>{
|
|
38
|
+
let r=e.result;if(!r)return;let o=e.parameters.functionName,p=(0,U.getRoleArn)(i,
|
|
39
|
+
o,n),A=t.result?.roleArn??p,S={...e.parameters,roleArn:p},E={...t.parameters,roleArn:A};
|
|
40
|
+
await Promise.all([Le(o,S,E),Ve(r.functionArn,e.parameters,t.parameters)]);let N=await Be(
|
|
41
|
+
o,e.parameters,t.result);return{...r,sourceHash:N,roleArn:p}},je=async e=>{let t=e.
|
|
42
|
+
result;t&&await(0,w.waitDeletion)(()=>_(t.functionName))},Le=async(e,t,n)=>{!(0,m.deepEqual)(
|
|
43
|
+
t,n,{sourceFile:!0,functionName:!0,tags:!0})&&await K(e,t)},Ve=async(e,t,n)=>{await(0,w.applyTagUpdates)(
|
|
44
|
+
t.tags,n.tags,r=>G(e,r),r=>k(e,r))},Be=async(e,t,n)=>{let r=t.sourceFile,o=await(0,m.hashFile)(
|
|
45
|
+
r);return o!==n?.sourceHash&&await O(e,t),o};var re=require("@ez4/aws-common");var D=require("@ez4/aws-common");var F=(e,t,n)=>{let r=n.getDependencies(c).at(0)?.result;if(!r?.functionName)throw new D.IncompleteResourceError(
|
|
46
|
+
e,t,"functionName");return r.functionName},$e=(e,t,n)=>{let r=n.getDependencies(
|
|
47
|
+
c).at(0)?.result;if(!r?.functionArn)throw new D.IncompleteResourceError(e,t,"fun\
|
|
48
|
+
ctionArn");return r.functionArn};var P=require("@aws-sdk/client-lambda"),H=require("@ez4/aws-common");var g="AWS:Lambda/Permission",f="aws:lambda.permission";var ee=new P.LambdaClient({}),te=async e=>{H.Logger.logCreate(g,e.functionName);
|
|
49
|
+
let t=e.statementId??`SID${Date.now()}`;return await ee.send(new P.AddPermissionCommand(
|
|
50
|
+
{StatementId:t,FunctionName:e.functionName,SourceArn:e.sourceArn,Principal:e.principal,
|
|
51
|
+
Action:e.action})),{statementId:t}},ne=async(e,t)=>{H.Logger.logDelete(g,e),await ee.
|
|
52
|
+
send(new P.RemovePermissionCommand({FunctionName:e,StatementId:t}))};var oe=()=>({equals:We,create:ae,replace:Ge,preview:Ze,update:ke,delete:Oe}),We=(e,t)=>!!e.
|
|
53
|
+
result&&e.result.functionName===t.result?.functionName,Ze=async(e,t)=>{},Ge=async(e,t,n)=>{
|
|
54
|
+
if(t.result)throw new re.ReplaceResourceError(g,e.entryId,t.entryId);return ae(e,
|
|
55
|
+
n)},ae=async(e,t)=>{let n=e.parameters,r=F(g,"permission",t),o=await n.getPermission(
|
|
56
|
+
t);return{statementId:(await te({functionName:r,principal:o.principal,sourceArn:o.
|
|
57
|
+
sourceArn,action:"lambda:InvokeFunction"})).statementId,functionName:r}},ke=async()=>{},
|
|
58
|
+
Oe=async e=>{let t=e.result;t&&await ne(t.functionName,t.statementId)};var ue=require("@ez4/aws-common"),M=require("@ez4/utils");var s=require("@aws-sdk/client-lambda"),x=require("@ez4/aws-common"),ie=require("@ez4/utils");var u="AWS:Lambda/Mapping",d="aws:lambda.mapping";var b=new s.LambdaClient({}),se=async e=>{x.Logger.logCreate(u,e.functionName);let{
|
|
59
|
+
service:t}=(0,x.parseArn)(e.sourceArn),{batch:n}=e,o=(await b.send(new s.CreateEventSourceMappingCommand(
|
|
60
|
+
{FunctionName:e.functionName,EventSourceArn:e.sourceArn,Enabled:e.enabled,...t===
|
|
61
|
+
"dynamodb"&&{StartingPosition:s.EventSourcePosition.LATEST},...n&&{BatchSize:n.batchSize,
|
|
62
|
+
MaximumBatchingWindowInSeconds:n.maxWindow}}))).UUID;return await me(o),{eventId:o}},
|
|
63
|
+
pe=async(e,t)=>{x.Logger.logUpdate(u,e);let{batch:n}=t;await b.send(new s.UpdateEventSourceMappingCommand(
|
|
64
|
+
{UUID:e,FunctionName:t.functionName,Enabled:t.enabled,...n&&{BatchSize:n.batchSize,
|
|
65
|
+
MaximumBatchingWindowInSeconds:n.maxWindow}})),await me(e)},ce=async e=>{x.Logger.
|
|
66
|
+
logDelete(u,e),await b.send(new s.DeleteEventSourceMappingCommand({UUID:e}))},Ke=async e=>(await b.
|
|
67
|
+
send(new s.GetEventSourceMappingCommand({UUID:e}))).State,me=async e=>{let t=new Set(
|
|
68
|
+
["Enabled","Disabled"]);await(0,ie.waitFor)(async()=>{let n=await Ke(e);return t.
|
|
69
|
+
has(n)})};var le=()=>({equals:_e,create:ye,replace:Qe,preview:Je,update:Xe,delete:Ye}),_e=(e,t)=>!!e.
|
|
70
|
+
result&&e.result.eventId===t.result?.eventId,Je=async(e,t)=>{let n=(0,M.deepCompare)(
|
|
71
|
+
e.parameters,t.parameters,{getSourceArn:!0});return n.counts?n:void 0},Qe=async(e,t,n)=>{
|
|
72
|
+
if(t.result)throw new ue.ReplaceResourceError(u,e.entryId,t.entryId);return ye(e,
|
|
73
|
+
n)},ye=async(e,t)=>{let n=e.parameters,r=F(u,"mapping",t),o=await n.getSourceArn(
|
|
74
|
+
t);return{eventId:(await se({...e.parameters,functionName:r,sourceArn:o})).eventId,
|
|
75
|
+
functionName:r,sourceArn:o}},Xe=async(e,t,n)=>{let r=e.result;if(!r)return;let o=F(
|
|
76
|
+
u,"mapping",n),p=t.result?.functionName??r.functionName,A={...e.parameters,functionName:o},
|
|
77
|
+
S={...t.parameters,functionName:p};return await qe(r.eventId,A,S),{...r,functionName:o}},
|
|
78
|
+
Ye=async e=>{let t=e.result;t&&await ce(t.eventId)},qe=async(e,t,n)=>{(0,M.deepEqual)(
|
|
79
|
+
t,n,{getSourceArn:!0})||await pe(e,t)};var R=require("@ez4/utils"),ge=require("@ez4/stateful");var fe=e=>e.type===c,et=(e,t,n)=>{let r=(0,R.toKebabCase)(n.functionName),o=(0,R.hashData)(
|
|
80
|
+
c,t.entryId,r);return(0,ge.attachEntry)(e,{type:c,entryId:o,dependencies:[t.entryId],
|
|
81
|
+
parameters:{...n,functionName:r}})},tt=(e,t,n)=>{let r=(0,R.hashData)((0,R.toKebabCase)(
|
|
82
|
+
n)),o=e[t.entryId,r];return o&&fe(o)?o:null};var de=require("@ez4/utils"),Se=require("@ez4/stateful");var nt=e=>e.type===f,rt=(e,t,n,r)=>{let o=(0,de.hashData)(f,t.entryId,n.entryId);
|
|
83
|
+
return(0,Se.attachEntry)(e,{type:f,entryId:o,dependencies:[t.entryId,n.entryId],
|
|
84
|
+
parameters:r})};var we=require("@ez4/utils"),Fe=require("@ez4/stateful");var ot=e=>e.type===d,at=(e,t,n,r)=>{let o=(0,we.hashData)(d,t.entryId,n.entryId);
|
|
85
|
+
return(0,Fe.attachEntry)(e,{type:d,entryId:o,dependencies:[t.entryId,n.entryId],
|
|
86
|
+
parameters:r})};var xe=require("@ez4/aws-common"),h=require("@ez4/aws-identity"),Re=require("@ez4/project");var C=require("@ez4/aws-identity"),Pe=async e=>{let[t,n]=await Promise.all([(0,C.getRegion)(),
|
|
87
|
+
(0,C.getAccountId)()]);return(0,C.createPolicyDocument)([{permissions:["logs:Cre\
|
|
61
88
|
ateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],resourceIds:[`arn:aws:l\
|
|
62
|
-
ogs:${t}:${
|
|
63
|
-
"@ez4/aws-function",{"deploy:prepareIdentityAccount":
|
|
64
|
-
Policy":
|
|
65
|
-
state:t,options:
|
|
66
|
-
t,{policyName:`${
|
|
67
|
-
|
|
68
|
-
|
|
89
|
+
ogs:${t}:${n}:log-group:/aws/lambda/${e}-*:*`]}])};var j=!1,it=()=>(j||((0,xe.registerTriggers)(),(0,h.registerTriggers)(),(0,Re.createTrigger)(
|
|
90
|
+
"@ez4/aws-function",{"deploy:prepareIdentityAccount":st,"deploy:prepareExecution\
|
|
91
|
+
Policy":pt}),j=!0),j),st=()=>[{account:"lambda.amazonaws.com"}],pt=async e=>{let{
|
|
92
|
+
state:t,options:n}=e,{resourcePrefix:r,projectName:o}=n;return(0,h.createPolicy)(
|
|
93
|
+
t,{policyName:`${r}-${o}-lambda-policy`,policyDocument:await Pe(r)})};(0,I.registerProvider)(c,Y());(0,I.registerProvider)(f,oe());(0,I.registerProvider)(
|
|
94
|
+
d,le());0&&(module.exports={FunctionServiceName,FunctionServiceType,MappingServiceName,MappingServiceType,
|
|
95
|
+
PermissionServiceName,PermissionServiceType,createFunction,createMapping,createPermission,
|
|
96
|
+
getFunction,getFunctionArn,getFunctionName,isFunction,isMapping,isPermission,registerTriggers});
|
package/dist/main.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
export * from './types/variables.js';
|
|
1
2
|
export * from './function/service.js';
|
|
2
3
|
export * from './function/types.js';
|
|
3
4
|
export * from './function/utils.js';
|
|
4
5
|
export * from './permission/service.js';
|
|
5
6
|
export * from './permission/types.js';
|
|
7
|
+
export * from './mapping/service.js';
|
|
8
|
+
export * from './mapping/types.js';
|
|
6
9
|
export * from './triggers/register.js';
|
package/dist/main.mjs
CHANGED
|
@@ -1,60 +1,89 @@
|
|
|
1
|
-
import{registerProvider as
|
|
2
|
-
|
|
3
|
-
import{deepEqual as
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
let
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
e.result.functionArn===t.result?.functionArn,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
roleArn:
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
e,t
|
|
39
|
-
|
|
40
|
-
import{
|
|
41
|
-
|
|
1
|
+
import{registerProvider as E}from"@ez4/aws-common";import{InvalidParameterValueException as ge}from"@aws-sdk/client-lambda";import{
|
|
2
|
+
applyTagUpdates as fe,ReplaceResourceError as de,waitDeletion as Se}from"@ez4/aws-common";
|
|
3
|
+
import{deepCompare as we,deepEqual as Fe,hashFile as R,waitFor as Pe}from"@ez4/utils";
|
|
4
|
+
import{getRoleArn as H}from"@ez4/aws-identity";import{CreateFunctionCommand as ie,DeleteFunctionCommand as se,LambdaClient as pe,
|
|
5
|
+
TagResourceCommand as ce,UntagResourceCommand as me,UpdateFunctionCodeCommand as ue,
|
|
6
|
+
UpdateFunctionConfigurationCommand as le,waitUntilFunctionActive as ye,waitUntilFunctionUpdated as v}from"@aws-sdk/client-lambda";
|
|
7
|
+
import{Logger as u}from"@ez4/aws-common";import{InvalidParameterError as te}from"@ez4/aws-common";var a="AWS:Lambda/Function",s="aws:lambda.function";var ne=/[a-z][\w]+/i,re=e=>ne.test(e),P=e=>{for(let t in e)if(!re(t))throw new te(
|
|
8
|
+
a,`name ${t} for variable unsupported.`)};import oe from"adm-zip";import{readFile as ae}from"node:fs/promises";var N=async(e,t)=>{
|
|
9
|
+
let n=new oe,r=await ae(e);return n.addFile(t,r),n.toBufferPromise()};var c=new pe({}),x={maxWaitTime:90,client:c},b=async e=>{u.logCreate(a,e.functionName),
|
|
10
|
+
e.variables&&P(e.variables);let t=await c.send(new ie({Publish:!0,FunctionName:e.
|
|
11
|
+
functionName,Description:e.description,MemorySize:e.memory,Timeout:e.timeout,Role:e.
|
|
12
|
+
roleArn,PackageType:"Zip",Handler:D(e.handlerName),Runtime:"nodejs20.x",Code:{ZipFile:await U(
|
|
13
|
+
e.sourceFile)},Environment:{Variables:e.variables},Tags:{...e.tags,ManagedBy:"EZ\
|
|
14
|
+
4"}})),n=t.FunctionName,r=t.FunctionArn;return await ye(x,{FunctionName:n}),{functionName:n,
|
|
15
|
+
functionArn:r}},M=async(e,t)=>{u.logTag(a,e),await c.send(new ce({Resource:e,Tags:{
|
|
16
|
+
...t,ManagedBy:"EZ4"}}))},h=async(e,t)=>{u.logUntag(a,e),await c.send(new me({Resource:e,
|
|
17
|
+
TagKeys:t}))},I=async(e,t)=>{u.logUpdate(a,`${e} source code`);let{sourceFile:n}=t;
|
|
18
|
+
await c.send(new ue({FunctionName:e,ZipFile:await U(n),Publish:!0})),await v(x,{
|
|
19
|
+
FunctionName:e})},T=async(e,t)=>{u.logUpdate(a,`${e} configuration`),t.variables&&
|
|
20
|
+
P(t.variables);let{handlerName:n}=t;await c.send(new le({FunctionName:e,Description:t.
|
|
21
|
+
description,MemorySize:t.memory,Timeout:t.timeout,Role:t.roleArn,...n&&{Handler:D(
|
|
22
|
+
n)},Environment:{Variables:t.variables}})),await v(x,{FunctionName:e})},z=async e=>{
|
|
23
|
+
u.logDelete(a,e),await c.send(new se({FunctionName:e}))},U=e=>N(e,"main.mjs"),D=e=>`\
|
|
24
|
+
main.${e}`;var j=()=>({equals:xe,create:L,replace:Ce,preview:Re,update:Ae,delete:Ee}),xe=(e,t)=>!!e.
|
|
25
|
+
result&&e.result.functionArn===t.result?.functionArn,Re=async(e,t)=>{let n=e.parameters,
|
|
26
|
+
r=we({...e.parameters,sourceHash:await R(n.sourceFile)},{...t.parameters,sourceHash:t.
|
|
27
|
+
result?.sourceHash});if(r.counts)return{...r,name:n.functionName}},Ce=async(e,t,n)=>{
|
|
28
|
+
if(t.result)throw new de(a,e.entryId,t.entryId);return L(e,n)},L=async(e,t)=>{let n=e.
|
|
29
|
+
parameters,r=n.functionName,o=H(a,r,t),i=n.sourceFile,f=await R(i),m,d=await Pe(
|
|
30
|
+
async()=>{try{return await b({...n,sourceFile:i,roleArn:o})}catch(S){if(!(S instanceof
|
|
31
|
+
ge))throw S;return m=S,null}});if(!d)throw m;return{functionName:d.functionName,
|
|
32
|
+
functionArn:d.functionArn,sourceHash:f,roleArn:o}},Ae=async(e,t,n)=>{let r=e.result;
|
|
33
|
+
if(!r)return;let o=e.parameters.functionName,i=H(a,o,n),f=t.result?.roleArn??i,m={
|
|
34
|
+
...e.parameters,roleArn:i},d={...t.parameters,roleArn:f};await Promise.all([Ne(o,
|
|
35
|
+
m,d),ve(r.functionArn,e.parameters,t.parameters)]);let S=await be(o,e.parameters,
|
|
36
|
+
t.result);return{...r,sourceHash:S,roleArn:i}},Ee=async e=>{let t=e.result;t&&await Se(
|
|
37
|
+
()=>z(t.functionName))},Ne=async(e,t,n)=>{!Fe(t,n,{sourceFile:!0,functionName:!0,
|
|
38
|
+
tags:!0})&&await T(e,t)},ve=async(e,t,n)=>{await fe(t.tags,n.tags,r=>M(e,r),r=>h(
|
|
39
|
+
e,r))},be=async(e,t,n)=>{let r=t.sourceFile,o=await R(r);return o!==n?.sourceHash&&
|
|
40
|
+
await I(e,t),o};import{ReplaceResourceError as Te}from"@ez4/aws-common";import{IncompleteResourceError as V}from"@ez4/aws-common";var w=(e,t,n)=>{let r=n.getDependencies(s).at(0)?.result;if(!r?.functionName)throw new V(
|
|
41
|
+
e,t,"functionName");return r.functionName},Vt=(e,t,n)=>{let r=n.getDependencies(
|
|
42
|
+
s).at(0)?.result;if(!r?.functionArn)throw new V(e,t,"functionArn");return r.functionArn};import{AddPermissionCommand as Me,LambdaClient as he,RemovePermissionCommand as Ie}from"@aws-sdk/client-lambda";
|
|
43
|
+
import{Logger as B}from"@ez4/aws-common";var l="AWS:Lambda/Permission",y="aws:lambda.permission";var $=new he({}),W=async e=>{B.logCreate(l,e.functionName);let t=e.statementId??
|
|
44
|
+
`SID${Date.now()}`;return await $.send(new Me({StatementId:t,FunctionName:e.functionName,
|
|
42
45
|
SourceArn:e.sourceArn,Principal:e.principal,Action:e.action})),{statementId:t}},
|
|
43
|
-
|
|
44
|
-
e.result.functionName===t.result?.functionName,
|
|
45
|
-
|
|
46
|
-
parameters(t);return{statementId:(await
|
|
47
|
-
sourceArn:
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
var
|
|
46
|
+
Z=async(e,t)=>{B.logDelete(l,e),await $.send(new Ie({FunctionName:e,StatementId:t}))};var G=()=>({equals:ze,create:k,replace:De,preview:Ue,update:He,delete:je}),ze=(e,t)=>!!e.
|
|
47
|
+
result&&e.result.functionName===t.result?.functionName,Ue=async(e,t)=>{},De=async(e,t,n)=>{
|
|
48
|
+
if(t.result)throw new Te(l,e.entryId,t.entryId);return k(e,n)},k=async(e,t)=>{let n=e.
|
|
49
|
+
parameters,r=w(l,"permission",t),o=await n.getPermission(t);return{statementId:(await W(
|
|
50
|
+
{functionName:r,principal:o.principal,sourceArn:o.sourceArn,action:"lambda:Invok\
|
|
51
|
+
eFunction"})).statementId,functionName:r}},He=async()=>{},je=async e=>{let t=e.result;
|
|
52
|
+
t&&await Z(t.functionName,t.statementId)};import{ReplaceResourceError as Ke}from"@ez4/aws-common";import{deepCompare as _e,
|
|
53
|
+
deepEqual as Je}from"@ez4/utils";import{CreateEventSourceMappingCommand as Le,UpdateEventSourceMappingCommand as Ve,
|
|
54
|
+
DeleteEventSourceMappingCommand as Be,GetEventSourceMappingCommand as $e,EventSourcePosition as We,
|
|
55
|
+
LambdaClient as Ze}from"@aws-sdk/client-lambda";import{Logger as C,parseArn as Ge}from"@ez4/aws-common";
|
|
56
|
+
import{waitFor as ke}from"@ez4/utils";var p="AWS:Lambda/Mapping",g="aws:lambda.mapping";var F=new Ze({}),O=async e=>{C.logCreate(p,e.functionName);let{service:t}=Ge(e.sourceArn),
|
|
57
|
+
{batch:n}=e,o=(await F.send(new Le({FunctionName:e.functionName,EventSourceArn:e.
|
|
58
|
+
sourceArn,Enabled:e.enabled,...t==="dynamodb"&&{StartingPosition:We.LATEST},...n&&
|
|
59
|
+
{BatchSize:n.batchSize,MaximumBatchingWindowInSeconds:n.maxWindow}}))).UUID;return await J(
|
|
60
|
+
o),{eventId:o}},K=async(e,t)=>{C.logUpdate(p,e);let{batch:n}=t;await F.send(new Ve(
|
|
61
|
+
{UUID:e,FunctionName:t.functionName,Enabled:t.enabled,...n&&{BatchSize:n.batchSize,
|
|
62
|
+
MaximumBatchingWindowInSeconds:n.maxWindow}})),await J(e)},_=async e=>{C.logDelete(
|
|
63
|
+
p,e),await F.send(new Be({UUID:e}))},Oe=async e=>(await F.send(new $e({UUID:e}))).
|
|
64
|
+
State,J=async e=>{let t=new Set(["Enabled","Disabled"]);await ke(async()=>{let n=await Oe(
|
|
65
|
+
e);return t.has(n)})};var Q=()=>({equals:Qe,create:X,replace:Ye,preview:Xe,update:qe,delete:et}),Qe=(e,t)=>!!e.
|
|
66
|
+
result&&e.result.eventId===t.result?.eventId,Xe=async(e,t)=>{let n=_e(e.parameters,
|
|
67
|
+
t.parameters,{getSourceArn:!0});return n.counts?n:void 0},Ye=async(e,t,n)=>{if(t.
|
|
68
|
+
result)throw new Ke(p,e.entryId,t.entryId);return X(e,n)},X=async(e,t)=>{let n=e.
|
|
69
|
+
parameters,r=w(p,"mapping",t),o=await n.getSourceArn(t);return{eventId:(await O(
|
|
70
|
+
{...e.parameters,functionName:r,sourceArn:o})).eventId,functionName:r,sourceArn:o}},
|
|
71
|
+
qe=async(e,t,n)=>{let r=e.result;if(!r)return;let o=w(p,"mapping",n),i=t.result?.
|
|
72
|
+
functionName??r.functionName,f={...e.parameters,functionName:o},m={...t.parameters,
|
|
73
|
+
functionName:i};return await tt(r.eventId,f,m),{...r,functionName:o}},et=async e=>{
|
|
74
|
+
let t=e.result;t&&await _(t.eventId)},tt=async(e,t,n)=>{Je(t,n,{getSourceArn:!0})||
|
|
75
|
+
await K(e,t)};import{toKebabCase as Y,hashData as q}from"@ez4/utils";import{attachEntry as nt}from"@ez4/stateful";var rt=e=>e.type===s,yn=(e,t,n)=>{let r=Y(n.functionName),o=q(s,t.entryId,r);return nt(
|
|
76
|
+
e,{type:s,entryId:o,dependencies:[t.entryId],parameters:{...n,functionName:r}})},
|
|
77
|
+
gn=(e,t,n)=>{let r=q(Y(n)),o=e[t.entryId,r];return o&&rt(o)?o:null};import{hashData as ot}from"@ez4/utils";import{attachEntry as at}from"@ez4/stateful";var Fn=e=>e.type===y,Pn=(e,t,n,r)=>{let o=ot(y,t.entryId,n.entryId);return at(e,
|
|
78
|
+
{type:y,entryId:o,dependencies:[t.entryId,n.entryId],parameters:r})};import{hashData as it}from"@ez4/utils";import{attachEntry as st}from"@ez4/stateful";var En=e=>e.type===g,Nn=(e,t,n,r)=>{let o=it(g,t.entryId,n.entryId);return st(e,
|
|
79
|
+
{type:g,entryId:o,dependencies:[t.entryId,n.entryId],parameters:r})};import{registerTriggers as ut}from"@ez4/aws-common";import{createPolicy as lt,registerTriggers as yt}from"@ez4/aws-identity";
|
|
80
|
+
import{createTrigger as gt}from"@ez4/project";import{getAccountId as pt,getRegion as ct,createPolicyDocument as mt}from"@ez4/aws-identity";
|
|
81
|
+
var ee=async e=>{let[t,n]=await Promise.all([ct(),pt()]);return mt([{permissions:[
|
|
54
82
|
"logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],resourceIds:[`\
|
|
55
|
-
arn:aws:logs:${t}:${
|
|
56
|
-
count":
|
|
57
|
-
.amazonaws.com"}],
|
|
58
|
-
return
|
|
59
|
-
|
|
60
|
-
|
|
83
|
+
arn:aws:logs:${t}:${n}:log-group:/aws/lambda/${e}-*:*`]}])};var A=!1,Un=()=>(A||(ut(),yt(),gt("@ez4/aws-function",{"deploy:prepareIdentityAc\
|
|
84
|
+
count":ft,"deploy:prepareExecutionPolicy":dt}),A=!0),A),ft=()=>[{account:"lambda\
|
|
85
|
+
.amazonaws.com"}],dt=async e=>{let{state:t,options:n}=e,{resourcePrefix:r,projectName:o}=n;
|
|
86
|
+
return lt(t,{policyName:`${r}-${o}-lambda-policy`,policyDocument:await ee(r)})};E(s,j());E(y,G());E(g,Q());export{a as FunctionServiceName,s as FunctionServiceType,p as MappingServiceName,
|
|
87
|
+
g as MappingServiceType,l as PermissionServiceName,y as PermissionServiceType,yn as createFunction,
|
|
88
|
+
Nn as createMapping,Pn as createPermission,gn as getFunction,Vt as getFunctionArn,
|
|
89
|
+
w as getFunctionName,rt as isFunction,En as isMapping,Fn as isPermission,Un as registerTriggers};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Arn } from '@ez4/aws-common';
|
|
2
|
+
export type BatchOptions = {
|
|
3
|
+
batchSize: number;
|
|
4
|
+
maxWindow: number;
|
|
5
|
+
};
|
|
6
|
+
export type CreateRequest = {
|
|
7
|
+
functionName: string;
|
|
8
|
+
batch?: BatchOptions;
|
|
9
|
+
sourceArn: Arn;
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type CreateResponse = {
|
|
13
|
+
eventId: string;
|
|
14
|
+
};
|
|
15
|
+
export type UpdateRequest = Partial<Omit<CreateRequest, 'sourceArn'>>;
|
|
16
|
+
export declare const createMapping: (request: CreateRequest) => Promise<CreateResponse>;
|
|
17
|
+
export declare const updateMapping: (eventId: string, request: UpdateRequest) => Promise<void>;
|
|
18
|
+
export declare const deleteMapping: (eventId: string) => Promise<void>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { EntryState, EntryStates } from '@ez4/stateful';
|
|
2
|
+
import type { MappingParameters, MappingState } from './types.js';
|
|
3
|
+
import type { FunctionState } from '../function/types.js';
|
|
4
|
+
export declare const isMapping: (resource: EntryState) => resource is MappingState;
|
|
5
|
+
export declare const createMapping: <E extends EntryState>(state: EntryStates<E>, sourceState: EntryState, functionState: FunctionState, parameters: MappingParameters) => MappingState;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Arn } from '@ez4/aws-common';
|
|
2
|
+
import type { EntryState, StepContext } from '@ez4/stateful';
|
|
3
|
+
import type { CreateRequest, CreateResponse } from './client.js';
|
|
4
|
+
export declare const MappingServiceName = "AWS:Lambda/Mapping";
|
|
5
|
+
export declare const MappingServiceType = "aws:lambda.mapping";
|
|
6
|
+
export type GetMappingSourceArn = (context: StepContext) => Promise<Arn> | Arn;
|
|
7
|
+
export type MappingParameters = Omit<CreateRequest, 'functionName' | 'sourceArn'> & {
|
|
8
|
+
getSourceArn: GetMappingSourceArn;
|
|
9
|
+
};
|
|
10
|
+
export type MappingResult = CreateResponse & {
|
|
11
|
+
functionName: string;
|
|
12
|
+
sourceArn: Arn;
|
|
13
|
+
};
|
|
14
|
+
export type MappingState = EntryState & {
|
|
15
|
+
type: typeof MappingServiceType;
|
|
16
|
+
parameters: MappingParameters;
|
|
17
|
+
result?: MappingResult;
|
|
18
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EntryState, EntryStates } from '@ez4/stateful';
|
|
2
2
|
import type { FunctionState } from '../function/types.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { PermissionParameters, PermissionState } from './types.js';
|
|
4
4
|
export declare const isPermission: (resource: EntryState) => resource is PermissionState;
|
|
5
|
-
export declare const createPermission: <E extends EntryState>(state: EntryStates<E>, sourceState: EntryState, functionState: FunctionState,
|
|
5
|
+
export declare const createPermission: <E extends EntryState>(state: EntryStates<E>, sourceState: EntryState, functionState: FunctionState, parameters: PermissionParameters) => PermissionState;
|
|
@@ -2,13 +2,16 @@ import type { EntryState, StepContext } from '@ez4/stateful';
|
|
|
2
2
|
import type { CreateRequest, CreateResponse } from './client.js';
|
|
3
3
|
export declare const PermissionServiceName = "AWS:Lambda/Permission";
|
|
4
4
|
export declare const PermissionServiceType = "aws:lambda.permission";
|
|
5
|
-
export type
|
|
5
|
+
export type Permission = Omit<CreateRequest, 'functionName' | 'statementId' | 'action'>;
|
|
6
|
+
export type GetPermission = (context: StepContext) => Promise<Permission> | Permission;
|
|
7
|
+
export type PermissionParameters = {
|
|
8
|
+
getPermission: GetPermission;
|
|
9
|
+
};
|
|
6
10
|
export type PermissionResult = CreateResponse & {
|
|
7
11
|
functionName: string;
|
|
8
12
|
};
|
|
9
|
-
export type PermissionParametersGenerator = (context: StepContext) => Promise<PermissionParameters> | PermissionParameters;
|
|
10
13
|
export type PermissionState = EntryState & {
|
|
11
14
|
type: typeof PermissionServiceType;
|
|
12
|
-
parameters:
|
|
15
|
+
parameters: PermissionParameters;
|
|
13
16
|
result?: PermissionResult;
|
|
14
17
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ez4/aws-function",
|
|
3
3
|
"description": "EZ4: Self-managed AWS lambda functions",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.1.0",
|
|
5
5
|
"author": "Silas B.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
@@ -23,16 +23,15 @@
|
|
|
23
23
|
"test:types": "npm run build && tsc -p tsconfig.test.json",
|
|
24
24
|
"local:publish": "npm run build && npm run clean:registry && npm publish --registry http://localhost:4873",
|
|
25
25
|
"clean:registry": "rm -rf ../../.registry/@ez4/aws-function",
|
|
26
|
-
"
|
|
27
|
-
"publish": "npm publish --access public"
|
|
26
|
+
"live:publish": "npm run test && npm publish --access public"
|
|
28
27
|
},
|
|
29
28
|
"dependencies": {
|
|
30
29
|
"@aws-sdk/client-lambda": "^3.614.0",
|
|
31
|
-
"@ez4/aws-common": "^0.
|
|
32
|
-
"@ez4/aws-identity": "^0.
|
|
33
|
-
"@ez4/project": "^0.
|
|
34
|
-
"@ez4/stateful": "^0.
|
|
35
|
-
"@ez4/utils": "^0.
|
|
30
|
+
"@ez4/aws-common": "^0.1.0",
|
|
31
|
+
"@ez4/aws-identity": "^0.1.0",
|
|
32
|
+
"@ez4/project": "^0.1.0",
|
|
33
|
+
"@ez4/stateful": "^0.1.0",
|
|
34
|
+
"@ez4/utils": "^0.1.0",
|
|
36
35
|
"@types/adm-zip": "^0.5.5",
|
|
37
36
|
"adm-zip": "^0.5.14"
|
|
38
37
|
}
|