@ashishpandeyone/cdk-lambda-web-function 0.1.9 → 0.1.10
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/.jsii +132 -95
- package/.jsii.tabl.json +1 -1
- package/API.md +38 -0
- package/README.md +18 -0
- package/lib/nodejs-web-function.d.ts +5 -0
- package/lib/nodejs-web-function.js +9 -2
- package/lib/private/property-injection.d.ts +6 -0
- package/lib/private/property-injection.js +19 -0
- package/lib/web-function-deployment.js +1 -1
- package/lib/web-function-endpoint.js +1 -1
- package/lib/web-function-grants.js +1 -1
- package/lib/web-function-origin.js +1 -1
- package/lib/web-function-revision.js +1 -1
- package/lib/web-function.d.ts +5 -0
- package/lib/web-function.js +10 -3
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -9745,7 +9745,7 @@
|
|
|
9745
9745
|
},
|
|
9746
9746
|
"name": "@ashishpandeyone/cdk-lambda-web-function",
|
|
9747
9747
|
"readme": {
|
|
9748
|
-
"markdown": "# CDK constructs for AWS Lambda Web Functions\n\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\n[AWS Lambda Web Functions](https://docs.aws.amazon.com/lambda/latest/dg/web-functions.html) run an ordinary Node.js HTTP server (Express, Fastify, Hono, `node:http`) on Lambda and give it an HTTPS endpoint, optionally served from several regions. `WebFunction` deploys one, following the conventions of `aws-cdk-lib/aws-lambda` where the two services overlap.\n\n```ts fixture=bare\nimport * as lambda from 'aws-cdk-lib/aws-lambda';\nimport { WebFunction, WebFunctionAuthType, WebFunctionEndpointType } from '@ashishpandeyone/cdk-lambda-web-function';\n\nconst fn = new WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('dist'),\n authType: WebFunctionAuthType.AWS_IAM,\n endpoint: {\n endpointType: WebFunctionEndpointType.MULTI_REGION,\n regions: ['us-east-1', 'eu-west-1'],\n },\n});\n\nnew CfnOutput(this, 'Url', { value: fn.endpoint.url }); // https://<id>.lambda-web.global.on.aws\n```\n\nThe stack's region is the function's **home region**. Multi-region endpoints need a stack with an explicit `env.region`.\n\n## Installation\n\n```bash\nnpm install @ashishpandeyone/cdk-lambda-web-function\n```\n\nIt needs `aws-cdk-lib` 2.273.0 or later and `constructs` 10.5.1 or later (peer dependencies), and Node.js 22 or later. The package is published for TypeScript and JavaScript only.\n\n## Writing the server\n\n1. Listen on the host and port in **`AWS_LAMBDA_HTTP_ENDPOINT`** (`0.0.0.0:3000` today). `PORT` is not set.\n2. Start listening within **10 seconds**, or initialisation fails with `Application.TimeoutListenError`.\n3. Put the entry file at the root of your bundle as **`index.js`**, or set `entrypoint`.\n4. The runtime has **no AWS SDK**: bundle the clients you import.\n5. Code runs on **arm64**.\n\n```js\nconst express = require('express');\n\nconst app = express();\napp.get('/', (req, res) => res.json({ hello: 'world', region: process.env.AWS_REGION }));\n\nconst [host, port] = process.env.AWS_LAMBDA_HTTP_ENDPOINT.split(':');\napp.listen(Number(port), host);\n```\n\nRequests carry `lambda-web-request-id` and `lambda-web-endpoint-name` headers.\n\n## Regions and endpoints\n\nEach `WebFunction` has a default endpoint, `fn.endpoint`, configured with the `endpoint` property. [Add more](#more-endpoints) with `fn.addEndpoint()`.\n\n| `endpointType` | URL | Routing |\n|---|---|---|\n| `HOME_REGION` (default) | `https://<id>.<cell>.lambda-web.<home>.on.aws` | home region only |\n| `MULTI_REGION` | one global `https://<id>.lambda-web.global.on.aws` | nearest region |\n| `PER_REGION` | one URL per region, from `fn.endpoint.regionalUrl(region)` | the region in the hostname |\n\n```ts\nconst perRegion = new WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('dist'),\n authType: WebFunctionAuthType.AWS_IAM,\n endpoint: {\n endpointType: WebFunctionEndpointType.PER_REGION,\n regions: ['us-east-1', 'eu-west-1'],\n },\n});\n\nnew CfnOutput(this, 'UsEast1Url', { value: perRegion.endpoint.regionalUrl('us-east-1') });\n// perRegion.endpoint.regions is ['<home region>', 'eu-west-1', 'us-east-1']\n```\n\n- `MULTI_REGION` and `PER_REGION` need at least one region besides the home region; `HOME_REGION` takes none.\n- A MultiRegion endpoint takes about a minute to create.\n- Lambda routes a `MULTI_REGION` endpoint by latency, not by health: it doesn't fail over when a region has problems.\n\n### More endpoints\n\nA function can have up to 10 endpoints, each with its own URL, authentication, regions and limits. For example, a public endpoint next to an IAM-only global one:\n\n```ts\nconst api = new WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('dist'),\n authType: WebFunctionAuthType.NONE, // the default endpoint is public\n endpoint: { rateLimit: 1000 }, // requests per second\n});\n\nconst internal = api.addEndpoint('Internal', {\n authType: WebFunctionAuthType.AWS_IAM,\n endpointType: WebFunctionEndpointType.MULTI_REGION,\n regions: ['us-east-1', 'eu-west-1'],\n description: 'Service-to-service traffic',\n maxEnvironments: 50,\n});\ninternal.grantInvoke(consumerRole);\nnew CfnOutput(this, 'InternalUrl', { value: internal.url });\n```\n\n- `rateLimit` takes 0 (blocks all traffic), 100–1,000 in steps of 100, or 2,000–10,000 in steps of 1,000; excess requests get HTTP 429. `maxEnvironments` takes 2–10,000.\n- **Both limits apply separately in each region** an endpoint serves from: a 3-region endpoint with `rateLimit: 1000` accepts up to 1,000 requests per second in each region.\n- Endpoints can serve the same regions. The construct owns one `.local` log group per region, whichever endpoints serve it.\n\n### Changing regions or the endpoint type\n\nAn endpoint's type and regions can't change in place: a change creates a **new endpoint with a new URL**, and the old one is deleted once the new one is live. Two endpoints of one function can't share a name, so:\n\n| `endpointName` | Physical name | Changing `regions` or `endpointType` |\n|---|---|---|\n| omitted (recommended) | `default-<hash>` for `fn.endpoint`, `<id>-<hash>` for added endpoints; the hash covers the type and regions | works: new endpoint, new URL |\n| set, e.g. `'live'` | `live` | also change the name in the same deployment, or it fails with *The endpoint live already exists* (the stack rolls back and the old endpoint keeps serving) |\n\nThe construct warns at synth time when `endpointName` is set.\n\n## Authentication and invoking\n\n| `authType` | Meaning |\n|---|---|\n| `AWS_IAM` | Callers sign requests (SigV4 or SigV4a, signing name `lambda`) and need `lambda:InvokeWebFunctionEndpoint` |\n| `NONE` | **Public**: Lambda does no authentication; your application does (JWT, sessions). The `Authorization` header reaches your application untouched. The construct warns at synth time |\n\n```ts\nfn.grants.invoke(consumerRole); // or fn.grantInvoke(consumerRole), as on lambda.Function\n```\n\nThe grant is on the endpoint's home-region ARN, which IAM evaluates in every region the endpoint serves from, including the global URL. `fn.grants` covers the default endpoint only; grant other endpoints with their own `grantInvoke()` or `grants.invoke()`.\n\n| Endpoint | How to sign |\n|---|---|\n| `HOME_REGION` | SigV4 for the home region |\n| `PER_REGION` | SigV4 for the hostname's region, or SigV4a |\n| `MULTI_REGION` | **SigV4a with region set `*`**: you can't know which region will serve the request |\n\n```js\nimport { SignatureV4a } from '@smithy/signature-v4a';\nimport { Sha256 } from '@aws-crypto/sha256-js';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers';\n\nconst host = new URL(url).hostname; // url: the endpoint's URL\nconst signer = new SignatureV4a({ service: 'lambda', region: '*', sha256: Sha256, credentials: fromNodeProviderChain() });\nconst signed = await signer.sign(\n { method: 'GET', protocol: 'https:', hostname: host, path: '/', headers: { host } },\n { signingRegion: '*' },\n);\nconst response = await fetch(`https://${host}/`, { headers: signed.headers });\n```\n\n### Other accounts and AWS services\n\nA caller in another account needs permission twice: in its own IAM policy, and in the function's **resource policy**. `grantInvoke` handles the function's side: a role in the function's account only gets an IAM policy statement, while a principal in another account or an AWS service also gets a statement in the resource policy.\n\n```ts\nfn.grantInvoke(iam.Role.fromRoleArn(this, 'Partner', 'arn:aws:iam::444455556666:role/caller'));\n```\n\nFor principals you can't grant to (a whole account, an organization, an AWS service with conditions), use `addPermission`. The `id` becomes the statement's `Sid`:\n\n```ts\nfn.addPermission('PartnerAccount', { principal: new iam.AccountPrincipal('444455556666') });\nfn.addPermission('MyOrg', { principal: new iam.OrganizationPrincipal('o-a1b2c3d4e5'), endpoint: fn.endpoint });\nfn.addPermission('Cdn', {\n principal: new iam.ServicePrincipal('cloudfront.amazonaws.com'),\n sourceArn: `arn:aws:cloudfront::${this.account}:distribution/EDFDVBD6EXAMPLE`,\n});\n```\n\n`addPermission` allows calling every endpoint unless you pass `endpoint`. For other actions, such as letting another account create revisions, use `fn.addToResourcePolicy(statement)`. Statements use the endpoint ARN for invoking and the function ARN for actions on the function.\n\n- **Each stack writes only its own statements.** A Web Function has a single resource policy, and Web Functions have no `AddPermission`. So each stack that adds statements gets a custom resource (`Custom::LambdaWebResourcePolicyStatements`). It reads the policy, replaces the statements that stack wrote before, and writes the policy back, retrying if another writer changed it in the meantime. Statements from other stacks, and ones added outside CloudFormation, are kept. Writers include the function's stack, a stack with a CloudFront distribution, and a stack that imports the function in the same account.\n- **Sids are unique in the policy.** `addPermission`'s `id` becomes the statement's `Sid`, and other statements get a generated one (`Cdk<hash><n>`). If another stack or tool already uses that `Sid` for different content, the deployment fails with the `Sid`.\n- **Don't also attach an `AWS::Lambda::ResourcePolicy` yourself.** That resource replaces the whole document on every update, dropping every other writer's statements.\n- **Public policies are rejected.** Lambda refuses a policy that lets anyone call the function, and the construct fails synthesis first. A `*` principal is only accepted with a condition that pins the caller, such as `aws:PrincipalOrgID` (`iam.OrganizationPrincipal`) or `aws:SourceAccount`. For a public endpoint, use `authType: NONE`.\n- **Scope AWS services to your resource.** Lambda accepts a service principal with no condition, which would let that service call the endpoint on behalf of any account. The construct warns unless you give `sourceArn` or `sourceAccount` (or an `aws:SourceArn`, `aws:SourceAccount`, `aws:SourceOrgID` or `aws:SourceOrgPaths` condition).\n- Lambda copies the policy to every region the function's endpoints serve from. The copy is eventually consistent, and in tests changes applied in every region within seconds.\n\n### CloudFront\n\nPut a CloudFront distribution (`aws-cdk-lib/aws-cloudfront`) in front of an `AWS_IAM` endpoint to serve the public with a custom domain, caching and AWS WAF. Viewers don't sign anything, and only your distribution may call the endpoint:\n\n```ts\nnew cloudfront.Distribution(this, 'Cdn', {\n defaultBehavior: {\n origin: WebFunctionOrigin.withOriginAccessControl(fn.endpoint),\n viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,\n allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL,\n cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,\n originRequestPolicy: cloudfront.OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER,\n },\n});\n```\n\n`withOriginAccessControl` adds:\n- an origin access control (origin type `lambda`, signing behavior `always-amz-auth`, the only one CloudFront accepts for Web Function origins), one per stack and signing protocol: SigV4 for a regional domain, SigV4a for a `MULTI_REGION` endpoint's global domain;\n- a statement in the function's resource policy that allows `cloudfront.amazonaws.com` to call this endpoint on behalf of this distribution only (`aws:SourceArn`).\n\nSome things to know:\n- **Forward everything except `Host`.** The endpoint answers 404 when `Host` is the distribution's domain, so use `ALL_VIEWER_EXCEPT_HOST_HEADER` (not `ALL_VIEWER`), or a policy of your own without `Host`.\n- **Your application can still authenticate viewers.** CloudFront signs in its own headers and passes the viewer's `Authorization` header (a JWT, for example) through unchanged, but only when `Authorization` is in the cache policy. CloudFront drops it from `GET` and `HEAD` requests otherwise:\n\n ```ts\n const forwardAuthorization = new cloudfront.CachePolicy(this, 'ForwardAuthorization', {\n headerBehavior: cloudfront.CacheHeaderBehavior.allowList('Authorization'),\n minTtl: Duration.seconds(0),\n defaultTtl: Duration.seconds(0),\n maxTtl: Duration.seconds(1), // a cache key with headers needs caching enabled; 0/0/1 keeps it off in practice\n });\n ```\n- Request bodies work without clients sending `x-amz-content-sha256`: CloudFront signs `POST`, `PUT` and `PATCH` requests with an unsigned payload.\n- A `PER_REGION` endpoint's origin calls one region: the home region, or the one you pass as `region`. Use one origin per region, for example in an origin group.\n- A `MULTI_REGION` endpoint can't include opt-in regions (such as `me-central-1`), because CloudFront can't sign for them. The construct fails synthesis.\n- The distribution can be in another stack, in the function's account. Its stack writes the CloudFront statement into the function's resource policy, so the function's stack doesn't depend on it.\n- That stack can also be in another region, for example us-east-1 for an ACM certificate. CDK then passes the endpoint's domain and ARN with its cross-region references: SSM parameters plus custom resources of its own.\n- **Those references are strong by default.** A change that replaces the endpoint gives it a new domain and ARN. That includes a new endpoint type or region set, or a renamed function. The function's stack can't update a value while the distribution's stack still uses the old one, the same as with `Fn::ImportValue` in one region. Deploy such a change in two steps, or use weak references: CDK's synth warning `@aws-cdk/core:crossStackReferencesDefaultStrong` explains how.\n- Lambda@Edge origin-request and origin-response triggers aren't supported on behaviors with this origin.\n- The endpoint stays reachable at its own domain for signed requests your policies allow. Until a new distribution finishes deploying, requests through it can get a transient 403.\n- `new WebFunctionOrigin(endpoint)` is for a public (`NONE`) endpoint, for example behind AWS WAF. Lambda doesn't authenticate those requests, so the endpoint's own domain stays public too.\n\n### Functions defined elsewhere\n\nImport a Web Function defined in another stack or app to grant access to it, read its metrics, or reference its revisions:\n\n```ts\nconst orders = WebFunction.fromWebFunctionArn(this, 'Orders', 'arn:aws:lambda:us-east-1:111122223333:web-function/orders');\norders.grantInvoke(consumerRole); // every endpoint of the function\n\nconst live = WebFunction.fromWebFunctionAttributes(this, 'Live', {\n webFunctionName: 'orders', // in this stack's account and region\n endpointName: 'live', // grantInvoke allows this endpoint only\n});\nlive.metricConcurrentRequests().createAlarm(this, 'Busy', { threshold: 60, evaluationPeriods: 3 });\n```\n\nAn imported function's metrics default to its own region. Its endpoints, revisions and log groups stay with the stack that defines it.\n\nAn imported function works like a `WebFunction` here. `grantInvoke` and `addToResourcePolicy` write the importing stack's statements into the function's resource policy, in the function's region. This works only when the function is in the stack's account. For a function in another account, `grantInvoke` adds to the caller's IAM policy only, and `addToResourcePolicy` adds nothing and warns, so ask that account to allow the caller.\n\n## Configuration\n\n```ts\nconst api = new WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('build'),\n authType: WebFunctionAuthType.AWS_IAM,\n entrypoint: 'server.js', // default index.js\n webFunctionName: 'orders-api', // default: generated from the construct path\n description: 'Orders HTTP API',\n environment: { TABLE_NAME: table.tableName },\n timeout: Duration.seconds(60), // per request: 3 seconds to 15 minutes, default 30 seconds\n maxConcurrencyPerEnvironment: 32, // requests per environment at once: 1-128, default 64\n});\n\napi.addEnvironment('FEATURE_FLAG', 'on');\ntable.grantReadWriteData(api); // the default role trusts lambda.amazonaws.com\n```\n\n- **Each execution environment has 2 vCPUs and 2 GB of memory.** There's no memory setting as on Lambda functions; scale with `maxConcurrencyPerEnvironment` and more environments instead.\n- Requests handled by one environment share module-level state, so keep handlers concurrency-safe.\n- Environment variable names starting with `AWS_` are reserved.\n- **The default execution role can only write to the function's own log groups**: the home region's, and the `.local` copy in every region it serves from. That's the minimum AWS documents for Web Functions. It doesn't use `AWSLambdaBasicExecutionRole`, which can also create any log group. Pass `role` to use your own, and include those log permissions.\n- **Renaming the function replaces it and changes its URL.** A generated name depends on the construct path, so moving the construct renames it too.\n\n### Bundling TypeScript with `NodejsWebFunction`\n\n`NodejsWebFunction` is a `WebFunction` that bundles your server from a TypeScript or JavaScript entry file with esbuild, like `NodejsFunction` does for Lambda functions:\n\n```ts\nnew NodejsWebFunction(this, 'Api', {\n entry: 'src/server.ts',\n authType: WebFunctionAuthType.AWS_IAM,\n bundling: {\n minify: true, // default true\n sourceMap: true, // default true\n format: lambdaNodejs.OutputFormat.ESM, // default ESM (index.mjs); CJS gives index.js\n externalModules: [], // default: bundle everything you import\n },\n});\n```\n\n- **Defaults:** `runtime` is `NODEJS_24_X`, and the esbuild target follows the runtime (`node24`). The project root is the directory of the nearest lock file above `entry` (override it with `depsLockFilePath` or `projectRoot`).\n- **It also sets what a `lambda.Code` can't:** the entry point that matches the bundle, and `NODE_OPTIONS=--enable-source-maps` when source maps are on, appended to any `NODE_OPTIONS` you set, so stack traces point at your `.ts` files (e.g. `/var/task/src/server.ts:22:12`). Source map paths are relative to the project root, so no build-machine paths are deployed.\n- **ESM bundles include a `require` shim**, so CommonJS dependencies that load Node.js built-ins (Express, for example) work.\n- **The AWS SDK is bundled like any other dependency**, since the runtime has none. Only the clients you import are included.\n- **Bundling runs locally** when esbuild is installed in your project, and otherwise in Docker (an arm64 AWS SAM build image; set `forceDockerBundling` to always use Docker).\n- **Not yet supported:** installing native modules next to the bundle (`nodeModules`) and command hooks. For native dependencies, use `WebFunction` with `Code.fromAsset(..., { bundling: { image, command } })`.\n\n### Code\n\n`code` takes any `lambda.Code` that produces a zip in S3: `fromAsset`, `fromBucket`/`fromBucketV2`, `fromCustomCommand`, `fromDockerBuild`. Inline code and container images fail at synth time.\n\nLambda Web Functions download code as the `lambda.amazonaws.com` service principal, from a **versioned** bucket, and the CDK bootstrap bucket allows neither. So each stack gets a small code bucket, and the code is copied into it on deploy. The bucket is emptied and deleted with the stack.\n\nCopying code, managing the function's log groups in every region, looking up regional URLs, cleaning up old revisions, creating rollback alarms in other regions and emptying the code bucket all run in one custom resource Lambda per stack. Its logs go to a log group the stack owns, kept for a month and deleted with the stack.\n\n## Revisions\n\nAny change to code or configuration creates a new **revision** (`fn.currentRevision`), and endpoints switch to it once it's ready. A failed deployment rolls back to the previous revision. If nothing changed, nothing is deployed.\n\nEarlier revisions are kept, so you can roll back or route traffic to them. After each deployment, the construct deletes the oldest beyond `revisionRetention` (default 20, up to 50). It never deletes a revision an endpoint routes to, or one the previous deployment used, which a rollback returns to.\n\n```ts\nnew WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('dist'),\n authType: WebFunctionAuthType.AWS_IAM,\n revisionRetention: 5,\n});\n```\n\n### Routing to earlier revisions\n\nReference an earlier revision by its ID (for example from a `CfnOutput` of `fn.currentRevision.revisionId`, or `aws lambda-web list-web-function-revisions`). Then pin an endpoint to it, or split traffic between two revisions:\n\n```ts\nconst previous = WebFunctionRevision.fromRevisionAttributes(this, 'Previous', {\n webFunction: fn,\n revisionId: 'rev-a1b2c',\n});\n\n// Keep the default endpoint on the previous revision, and send 10% to the new one:\nfn.endpoint.routeTraffic(previous, [{ revision: fn.currentRevision, weight: 0.1 }]);\n\n// Or a second endpoint that stays on the previous revision while fn.endpoint moves on:\nfn.addEndpoint('Stable', { authType: WebFunctionAuthType.AWS_IAM, revision: previous });\n```\n\n- An endpoint routes to at most two revisions. The additional revision's `weight` is a whole percentage, from 0.01 to 0.99.\n- To promote, remove `routeTraffic` (or `revision`) and deploy: the endpoint serves the current revision again.\n- Lambda Web Function metrics have no revision dimension. To compare a split's revisions, log a version you control (for example an environment variable) from your application.\n\n### Canary and linear deployments\n\nBy default an endpoint moves all its traffic to a new revision at once. With `deployment`, it moves in steps instead, watching CloudWatch alarms: if one goes into ALARM, the endpoint goes back to the revision it served before and the deployment fails, so CloudFormation rolls the stack back.\n\n```ts\nconst api = new WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('dist'),\n authType: WebFunctionAuthType.AWS_IAM,\n endpoint: {\n // 10% of the traffic for 10 minutes, then all of it; back if more than 2% of requests get a 5XX.\n deployment: WebFunctionDeployment.canary({ percent: 10, bake: Duration.minutes(10), rollbackOn: { serverErrorRate: 2 } }),\n },\n});\n\n// 25% more every 5 minutes, watching an alarm of your own. Each endpoint has its own deployment.\n// errorRate: any cloudwatch.IAlarm, e.g. on a metric your application publishes.\napi.addEndpoint('Public', {\n authType: WebFunctionAuthType.NONE,\n deployment: WebFunctionDeployment.linear({ percent: 25, interval: Duration.minutes(5), alarms: [errorRate] }),\n});\n```\n\n| | Steps | Limits |\n|---|---|---|\n| `allAtOnce()` (default) | 100% | |\n| `canary({ percent, bake })` | `percent`, then 100% after `bake` | `percent` 1–99, `bake` 1–45 minutes |\n| `linear({ percent, interval })` | `percent` more every `interval` | `percent` 5–50, `interval` from 1 minute, at most 45 minutes in all |\n\nHow it works:\n\n- Each deployment that creates a revision (code or configuration) moves the traffic from the revision the endpoint serves at that moment, which is also what it goes back to. If someone switched the endpoint outside CloudFormation, the deployment starts from there.\n- Each step waits until every region of a `MULTI_REGION` or `PER_REGION` endpoint has applied it (usually about 15 seconds), and if a region fails to update, the endpoint goes back as for an alarm. The bake or interval counts from the start of the step.\n- Alarms are checked before the first step (an alarm already in ALARM stops the deployment before any traffic moves), throughout every step, and once the new revision has all the traffic. They can be in any region, and composite alarms work. `INSUFFICIENT_DATA` doesn't stop a deployment.\n- A rollback of the stack, for any reason, moves the traffic back at once, without waiting or checking alarms.\n- A stack's first deployment, and a new endpoint (including one renamed by a region change), serve the revision at once: there's nothing to move from.\n- A deployment can take up to an hour: CloudFormation waits for it before it updates the endpoint. Deployments of different endpoints run in parallel.\n- A canary or linear endpoint always moves to the current revision, so it can't also use `revision`, `additionalRevisions` or `routeTraffic()`. Use `allAtOnce()` to deploy a fix immediately, for example while an alarm is in ALARM.\n\n#### Rollback alarms\n\n`rollbackOn` makes the endpoint create alarms on its own error rates, and the deployment watches them alongside any `alarms` you pass:\n\n| `rollbackOn` | Default | |\n|---|---|---|\n| `serverErrorRate` | none | roll back when more than this % of requests get a 5XX |\n| `clientErrorRate` | none | the same for 4XX (including 429s from `rateLimit` and `maxEnvironments`) |\n| `minimumRequests` | 10 | periods with fewer requests don't count, so one failed request out of two doesn't roll back |\n| `period`, `evaluationPeriods` | 1 minute, 2 | consecutive periods over the threshold before rolling back |\n\n- **One alarm per threshold in every region the endpoint serves from.** Metrics are published in the region that served the request, and an alarm can only watch metrics in its own region. The home region's alarm is a normal CloudFormation alarm; the others are created and deleted with the endpoint by a custom resource, and named `LambdaWeb-<function>-<endpoint>-5xx-rate` (or `-4xx-rate`). `endpoint.rollbackAlarms` lists them all, e.g. to add notifications to the home region's.\n- **The alarms see the whole endpoint.** Lambda Web Function metrics have no revision dimension, so at 10% a new revision's errors are about a tenth of the endpoint's: set the threshold low enough to notice that, or alarm on metrics your application publishes with its version.\n- **5XX includes the platform's 503s** while the endpoint scales up for a sudden burst, not only your application's errors.\n- **A step should outlast the alarm.** CloudWatch needs `period` × `evaluationPeriods`, plus a couple of minutes of delay, to fire; the construct warns when a canary's bake or a linear interval is shorter.\n\nThe deployment runs in a few resources per stack, created on first use: two Lambda functions, a Step Functions state machine that calls them every 15 seconds, and a log group.\n\n## Metrics\n\nEndpoints and functions have helpers for their CloudWatch metrics (namespace `AWS/Lambda/Web`), like `lambda.Function`'s:\n\n```ts\nfn.endpoint.metricServerErrorRate().createAlarm(this, 'ErrorRate', { threshold: 1, evaluationPeriods: 3 });\nfn.endpoint.metricRequestThrottles().createAlarm(this, 'Throttled', { threshold: 10, evaluationPeriods: 3 });\nfn.metricConcurrentRequests().createAlarm(this, 'Saturated', { threshold: 60, evaluationPeriods: 3 });\n```\n\n| Endpoint | Metric |\n|---|---|\n| `metricRequests()` | `ExecutedRequests` (there's no separate 2XX count) |\n| `metricClientErrors()`, `metricServerErrors()` | `HTTPResponseStatusClass4XX`, `HTTPResponseStatusClass5XX` |\n| `metricClientErrorRate()`, `metricServerErrorRate()` | 4XX or 5XX as a % of requests (math expression) |\n| `metricActiveEnvironments()` | `EndpointActiveEnvironments`, to compare with `maxEnvironments` |\n| `metricRequestThrottles()`, `metricEnvironmentThrottles()` | 429s from `rateLimit` and from `maxEnvironments` |\n\n| Function | Metric |\n|---|---|\n| `metricConcurrentRequests()` | `EnvironmentConcurrentRequests` (maximum), to compare with `maxConcurrencyPerEnvironment` |\n| `metricMaxMemoryUsage()` | `EnvironmentMaxMemoryUsage` (maximum) |\n| `metricActiveTime()`, `metricCpuTime()`, `metricResponseBytes()` | `EnvironmentActiveTime`, `EnvironmentCPUTime`, `ResponseBytes` |\n\n- **Metrics stay in the region that served the request**; unlike logs, they aren't copied to the home region. Every helper takes `region`. Dashboards can show any region, but an alarm can only use metrics from its own stack's region.\n- 4XX, 5XX and the throttle metrics only exist once they're non-zero: alarm on them with `treatMissingData: NOT_BREACHING`. The rate helpers count missing errors as 0.\n- There's no latency metric. Publish one from your application (e.g. with the CloudWatch embedded metric format).\n\n## Logs in every region\n\nWeb Functions log in two tiers:\n\n```text\n every serving region home region\n ┌──────────────────┐ ┌──────────────────────────────────────────┐\n │ <group>.local │── copied ───►│ <group> every region's logs │\n │ (that region's │ (seconds) │ streams …[rev]<instance>-<acct>-<region> │\n │ environments) │ │ <group>.local (home-region traffic) │\n └──────────────────┘ └──────────────────────────────────────────┘\n```\n\n**Query `fn.logGroup`**, the home-region group that receives every region's logs. The service would create missing groups without retention and never delete them, so the construct creates and owns all of them: both home-region groups, and `<group>.local` in every other region any of its endpoints serves from.\n\n```ts\nnew WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('dist'),\n authType: WebFunctionAuthType.AWS_IAM,\n logRetention: logs.RetentionDays.THREE_MONTHS, // default ONE_MONTH, every group in every region\n logRemovalPolicy: RemovalPolicy.DESTROY, // default RETAIN\n applicationLogLevelV2: lambda.ApplicationLogLevel.WARN,\n systemLogLevelV2: lambda.SystemLogLevel.INFO, // DEBUG, INFO or WARN\n});\n```\n\n- The default group is `/aws/lambda/web/<function name>`. Log lines are JSON; application lines carry `requestId`, `endpointName` and `region`.\n- Every event is stored twice (`.local` plus the home-region copy), so expect about double log ingestion, plus cross-region transfer.\n- With `DESTROY`, deletion waits about a minute after the function is gone, because environments flush their last lines late.\n- Subscribe only to `fn.logGroup`: subscribing to the `.local` groups as well delivers every event twice.\n\n## cdk-nag\n\nThe library acknowledges the [cdk-nag](https://github.com/cdklabs/cdk-nag) AwsSolutions findings on the resources it creates, each with a reason, so they don't show up in your reports:\n\n| Finding | Resource | Reason |\n|---|---|---|\n| IAM5 (wildcards) | the default execution role | log streams of the function's own log groups, in every region it serves from |\n| IAM5 | the deployment handlers' role (canary and linear deployments) | their own log group, `cloudwatch:DescribeAlarms` (composite alarms need `*`), and the revisions and endpoints of the functions they deploy |\n| IAM4, IAM5, SF1, SF2 | the CDK Provider framework behind deployments | CDK's own functions and waiter state machine |\n| S1 (access logs) | the stack's code bucket | it only holds copies of the stack's code assets |\n\n- **This works with both cdk-nag versions**, without depending on cdk-nag. cdk-nag 3 reads CDK's `Validations.of(...).acknowledge()`, one ID per finding. cdk-nag 2 reads `cdk_nag` metadata in the template.\n- **Your own statements and resources are still checked.** That includes statements you add to the function's role (`addToRolePolicy`, grants) and your CloudFront distribution's settings.\n- Only the AwsSolutions pack is covered; findings from the HIPAA, NIST and PCI packs aren't acknowledged.\n\n## Upgrading\n\n### From 0.1.5 to 0.1.7, with a resource policy\n\nVersions 0.1.5 to 0.1.7 wrote the function's resource policy with an `AWS::Lambda::ResourcePolicy`. Later versions don't (0.1.7 has the same code as 0.1.6). When an update removes that resource, CloudFormation deletes the function's **whole** resource policy at the end of the update, including the statements the new version just wrote. Callers that rely on the policy then get 403: other accounts, AWS services, and CloudFront.\n\nIf your function has a resource policy (from `addPermission`, a grant to another account or an AWS service, or `WebFunctionOrigin`), first deploy once on the version you have, with the old resource retained:\n\n```ts\n(fn.node.findChild('ResourcePolicy') as CfnResource).applyRemovalPolicy(RemovalPolicy.RETAIN);\n```\n\nThen upgrade, without changing your statements in the same deployment. The new version takes over the statements it writes itself. A statement you removed in the same deployment would stay in the policy.\n\n## Limitations\n\n- Not yet supported: VPC access (network connectors), KMS encryption, and tracing.\n- **Hotswap skips Web Functions without a warning.** `cdk deploy --hotswap` and `cdk watch`, which hotswaps by default, report `(no changes)` for a code or configuration change and the endpoint keeps serving the old revision. Use `cdk watch --hotswap-fallback` (or `cdk deploy --hotswap-fallback`): it deploys Web Function changes through CloudFormation, in about 40 seconds for a home-region endpoint.\n- Fixed limits: 512 MB of code (unzipped) and 32 KB of environment variables per revision, 512 MB of `/tmp` per execution environment, and 128 KiB of headers per request.\n- Quotas: 10 endpoints and about 50 revisions per function (Lambda cleans up older revisions automatically), and 10,000 requests per second per endpoint. Per account and region: 100,000 requests per second and 2,000 Arm64 vCPUs (each execution environment uses 2). The account quotas are adjustable, and new accounts start lower. See [Lambda quotas](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html).\n\n## Development\n\nTooling is pinned in `mise.toml` (Node 24, AWS CDK CLI). Personal settings, such as the AWS profile for the live end-to-end tests, go in a git-ignored `mise.local.toml`.\n\n```bash\nmise install\nnpx projen build # compile, unit tests, lint, API docs\nnpx projen e2e # deploy, verify and destroy real stacks in three regions (needs AWS credentials)\n```\n"
|
|
9748
|
+
"markdown": "# CDK constructs for AWS Lambda Web Functions\n\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\n[AWS Lambda Web Functions](https://docs.aws.amazon.com/lambda/latest/dg/web-functions.html) run an ordinary Node.js HTTP server (Express, Fastify, Hono, `node:http`) on Lambda and give it an HTTPS endpoint, optionally served from several regions. `WebFunction` deploys one, following the conventions of `aws-cdk-lib/aws-lambda` where the two services overlap.\n\n```ts fixture=bare\nimport * as lambda from 'aws-cdk-lib/aws-lambda';\nimport { WebFunction, WebFunctionAuthType, WebFunctionEndpointType } from '@ashishpandeyone/cdk-lambda-web-function';\n\nconst fn = new WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('dist'),\n authType: WebFunctionAuthType.AWS_IAM,\n endpoint: {\n endpointType: WebFunctionEndpointType.MULTI_REGION,\n regions: ['us-east-1', 'eu-west-1'],\n },\n});\n\nnew CfnOutput(this, 'Url', { value: fn.endpoint.url }); // https://<id>.lambda-web.global.on.aws\n```\n\nThe stack's region is the function's **home region**. Multi-region endpoints need a stack with an explicit `env.region`.\n\n## Installation\n\n```bash\nnpm install @ashishpandeyone/cdk-lambda-web-function\n```\n\nIt needs `aws-cdk-lib` 2.273.0 or later and `constructs` 10.5.1 or later (peer dependencies), and Node.js 22 or later. The package is published for TypeScript and JavaScript only.\n\n## Writing the server\n\n1. Listen on the host and port in **`AWS_LAMBDA_HTTP_ENDPOINT`** (`0.0.0.0:3000` today). `PORT` is not set.\n2. Start listening within **10 seconds**, or initialisation fails with `Application.TimeoutListenError`.\n3. Put the entry file at the root of your bundle as **`index.js`**, or set `entrypoint`.\n4. The runtime has **no AWS SDK**: bundle the clients you import.\n5. Code runs on **arm64**.\n\n```js\nconst express = require('express');\n\nconst app = express();\napp.get('/', (req, res) => res.json({ hello: 'world', region: process.env.AWS_REGION }));\n\nconst [host, port] = process.env.AWS_LAMBDA_HTTP_ENDPOINT.split(':');\napp.listen(Number(port), host);\n```\n\nRequests carry `lambda-web-request-id` and `lambda-web-endpoint-name` headers.\n\n## Regions and endpoints\n\nEach `WebFunction` has a default endpoint, `fn.endpoint`, configured with the `endpoint` property. [Add more](#more-endpoints) with `fn.addEndpoint()`.\n\n| `endpointType` | URL | Routing |\n|---|---|---|\n| `HOME_REGION` (default) | `https://<id>.<cell>.lambda-web.<home>.on.aws` | home region only |\n| `MULTI_REGION` | one global `https://<id>.lambda-web.global.on.aws` | nearest region |\n| `PER_REGION` | one URL per region, from `fn.endpoint.regionalUrl(region)` | the region in the hostname |\n\n```ts\nconst perRegion = new WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('dist'),\n authType: WebFunctionAuthType.AWS_IAM,\n endpoint: {\n endpointType: WebFunctionEndpointType.PER_REGION,\n regions: ['us-east-1', 'eu-west-1'],\n },\n});\n\nnew CfnOutput(this, 'UsEast1Url', { value: perRegion.endpoint.regionalUrl('us-east-1') });\n// perRegion.endpoint.regions is ['<home region>', 'eu-west-1', 'us-east-1']\n```\n\n- `MULTI_REGION` and `PER_REGION` need at least one region besides the home region; `HOME_REGION` takes none.\n- A MultiRegion endpoint takes about a minute to create.\n- Lambda routes a `MULTI_REGION` endpoint by latency, not by health: it doesn't fail over when a region has problems.\n\n### More endpoints\n\nA function can have up to 10 endpoints, each with its own URL, authentication, regions and limits. For example, a public endpoint next to an IAM-only global one:\n\n```ts\nconst api = new WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('dist'),\n authType: WebFunctionAuthType.NONE, // the default endpoint is public\n endpoint: { rateLimit: 1000 }, // requests per second\n});\n\nconst internal = api.addEndpoint('Internal', {\n authType: WebFunctionAuthType.AWS_IAM,\n endpointType: WebFunctionEndpointType.MULTI_REGION,\n regions: ['us-east-1', 'eu-west-1'],\n description: 'Service-to-service traffic',\n maxEnvironments: 50,\n});\ninternal.grantInvoke(consumerRole);\nnew CfnOutput(this, 'InternalUrl', { value: internal.url });\n```\n\n- `rateLimit` takes 0 (blocks all traffic), 100–1,000 in steps of 100, or 2,000–10,000 in steps of 1,000; excess requests get HTTP 429. `maxEnvironments` takes 2–10,000.\n- **Both limits apply separately in each region** an endpoint serves from: a 3-region endpoint with `rateLimit: 1000` accepts up to 1,000 requests per second in each region.\n- Endpoints can serve the same regions. The construct owns one `.local` log group per region, whichever endpoints serve it.\n\n### Changing regions or the endpoint type\n\nAn endpoint's type and regions can't change in place: a change creates a **new endpoint with a new URL**, and the old one is deleted once the new one is live. Two endpoints of one function can't share a name, so:\n\n| `endpointName` | Physical name | Changing `regions` or `endpointType` |\n|---|---|---|\n| omitted (recommended) | `default-<hash>` for `fn.endpoint`, `<id>-<hash>` for added endpoints; the hash covers the type and regions | works: new endpoint, new URL |\n| set, e.g. `'live'` | `live` | also change the name in the same deployment, or it fails with *The endpoint live already exists* (the stack rolls back and the old endpoint keeps serving) |\n\nThe construct warns at synth time when `endpointName` is set.\n\n## Authentication and invoking\n\n| `authType` | Meaning |\n|---|---|\n| `AWS_IAM` | Callers sign requests (SigV4 or SigV4a, signing name `lambda`) and need `lambda:InvokeWebFunctionEndpoint` |\n| `NONE` | **Public**: Lambda does no authentication; your application does (JWT, sessions). The `Authorization` header reaches your application untouched. The construct warns at synth time |\n\n```ts\nfn.grants.invoke(consumerRole); // or fn.grantInvoke(consumerRole), as on lambda.Function\n```\n\nThe grant is on the endpoint's home-region ARN, which IAM evaluates in every region the endpoint serves from, including the global URL. `fn.grants` covers the default endpoint only; grant other endpoints with their own `grantInvoke()` or `grants.invoke()`.\n\n| Endpoint | How to sign |\n|---|---|\n| `HOME_REGION` | SigV4 for the home region |\n| `PER_REGION` | SigV4 for the hostname's region, or SigV4a |\n| `MULTI_REGION` | **SigV4a with region set `*`**: you can't know which region will serve the request |\n\n```js\nimport { SignatureV4a } from '@smithy/signature-v4a';\nimport { Sha256 } from '@aws-crypto/sha256-js';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers';\n\nconst host = new URL(url).hostname; // url: the endpoint's URL\nconst signer = new SignatureV4a({ service: 'lambda', region: '*', sha256: Sha256, credentials: fromNodeProviderChain() });\nconst signed = await signer.sign(\n { method: 'GET', protocol: 'https:', hostname: host, path: '/', headers: { host } },\n { signingRegion: '*' },\n);\nconst response = await fetch(`https://${host}/`, { headers: signed.headers });\n```\n\n### Other accounts and AWS services\n\nA caller in another account needs permission twice: in its own IAM policy, and in the function's **resource policy**. `grantInvoke` handles the function's side: a role in the function's account only gets an IAM policy statement, while a principal in another account or an AWS service also gets a statement in the resource policy.\n\n```ts\nfn.grantInvoke(iam.Role.fromRoleArn(this, 'Partner', 'arn:aws:iam::444455556666:role/caller'));\n```\n\nFor principals you can't grant to (a whole account, an organization, an AWS service with conditions), use `addPermission`. The `id` becomes the statement's `Sid`:\n\n```ts\nfn.addPermission('PartnerAccount', { principal: new iam.AccountPrincipal('444455556666') });\nfn.addPermission('MyOrg', { principal: new iam.OrganizationPrincipal('o-a1b2c3d4e5'), endpoint: fn.endpoint });\nfn.addPermission('Cdn', {\n principal: new iam.ServicePrincipal('cloudfront.amazonaws.com'),\n sourceArn: `arn:aws:cloudfront::${this.account}:distribution/EDFDVBD6EXAMPLE`,\n});\n```\n\n`addPermission` allows calling every endpoint unless you pass `endpoint`. For other actions, such as letting another account create revisions, use `fn.addToResourcePolicy(statement)`. Statements use the endpoint ARN for invoking and the function ARN for actions on the function.\n\n- **Each stack writes only its own statements.** A Web Function has a single resource policy, and Web Functions have no `AddPermission`. So each stack that adds statements gets a custom resource (`Custom::LambdaWebResourcePolicyStatements`). It reads the policy, replaces the statements that stack wrote before, and writes the policy back, retrying if another writer changed it in the meantime. Statements from other stacks, and ones added outside CloudFormation, are kept. Writers include the function's stack, a stack with a CloudFront distribution, and a stack that imports the function in the same account.\n- **Sids are unique in the policy.** `addPermission`'s `id` becomes the statement's `Sid`, and other statements get a generated one (`Cdk<hash><n>`). If another stack or tool already uses that `Sid` for different content, the deployment fails with the `Sid`.\n- **Don't also attach an `AWS::Lambda::ResourcePolicy` yourself.** That resource replaces the whole document on every update, dropping every other writer's statements.\n- **Public policies are rejected.** Lambda refuses a policy that lets anyone call the function, and the construct fails synthesis first. A `*` principal is only accepted with a condition that pins the caller, such as `aws:PrincipalOrgID` (`iam.OrganizationPrincipal`) or `aws:SourceAccount`. For a public endpoint, use `authType: NONE`.\n- **Scope AWS services to your resource.** Lambda accepts a service principal with no condition, which would let that service call the endpoint on behalf of any account. The construct warns unless you give `sourceArn` or `sourceAccount` (or an `aws:SourceArn`, `aws:SourceAccount`, `aws:SourceOrgID` or `aws:SourceOrgPaths` condition).\n- Lambda copies the policy to every region the function's endpoints serve from. The copy is eventually consistent, and in tests changes applied in every region within seconds.\n\n### CloudFront\n\nPut a CloudFront distribution (`aws-cdk-lib/aws-cloudfront`) in front of an `AWS_IAM` endpoint to serve the public with a custom domain, caching and AWS WAF. Viewers don't sign anything, and only your distribution may call the endpoint:\n\n```ts\nnew cloudfront.Distribution(this, 'Cdn', {\n defaultBehavior: {\n origin: WebFunctionOrigin.withOriginAccessControl(fn.endpoint),\n viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,\n allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL,\n cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,\n originRequestPolicy: cloudfront.OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER,\n },\n});\n```\n\n`withOriginAccessControl` adds:\n- an origin access control (origin type `lambda`, signing behavior `always-amz-auth`, the only one CloudFront accepts for Web Function origins), one per stack and signing protocol: SigV4 for a regional domain, SigV4a for a `MULTI_REGION` endpoint's global domain;\n- a statement in the function's resource policy that allows `cloudfront.amazonaws.com` to call this endpoint on behalf of this distribution only (`aws:SourceArn`).\n\nSome things to know:\n- **Forward everything except `Host`.** The endpoint answers 404 when `Host` is the distribution's domain, so use `ALL_VIEWER_EXCEPT_HOST_HEADER` (not `ALL_VIEWER`), or a policy of your own without `Host`.\n- **Your application can still authenticate viewers.** CloudFront signs in its own headers and passes the viewer's `Authorization` header (a JWT, for example) through unchanged, but only when `Authorization` is in the cache policy. CloudFront drops it from `GET` and `HEAD` requests otherwise:\n\n ```ts\n const forwardAuthorization = new cloudfront.CachePolicy(this, 'ForwardAuthorization', {\n headerBehavior: cloudfront.CacheHeaderBehavior.allowList('Authorization'),\n minTtl: Duration.seconds(0),\n defaultTtl: Duration.seconds(0),\n maxTtl: Duration.seconds(1), // a cache key with headers needs caching enabled; 0/0/1 keeps it off in practice\n });\n ```\n- Request bodies work without clients sending `x-amz-content-sha256`: CloudFront signs `POST`, `PUT` and `PATCH` requests with an unsigned payload.\n- A `PER_REGION` endpoint's origin calls one region: the home region, or the one you pass as `region`. Use one origin per region, for example in an origin group.\n- A `MULTI_REGION` endpoint can't include opt-in regions (such as `me-central-1`), because CloudFront can't sign for them. The construct fails synthesis.\n- The distribution can be in another stack, in the function's account. Its stack writes the CloudFront statement into the function's resource policy, so the function's stack doesn't depend on it.\n- That stack can also be in another region, for example us-east-1 for an ACM certificate. CDK then passes the endpoint's domain and ARN with its cross-region references: SSM parameters plus custom resources of its own.\n- **Those references are strong by default.** A change that replaces the endpoint gives it a new domain and ARN. That includes a new endpoint type or region set, or a renamed function. The function's stack can't update a value while the distribution's stack still uses the old one, the same as with `Fn::ImportValue` in one region. Deploy such a change in two steps, or use weak references: CDK's synth warning `@aws-cdk/core:crossStackReferencesDefaultStrong` explains how.\n- Lambda@Edge origin-request and origin-response triggers aren't supported on behaviors with this origin.\n- The endpoint stays reachable at its own domain for signed requests your policies allow. Until a new distribution finishes deploying, requests through it can get a transient 403.\n- `new WebFunctionOrigin(endpoint)` is for a public (`NONE`) endpoint, for example behind AWS WAF. Lambda doesn't authenticate those requests, so the endpoint's own domain stays public too.\n\n### Functions defined elsewhere\n\nImport a Web Function defined in another stack or app to grant access to it, read its metrics, or reference its revisions:\n\n```ts\nconst orders = WebFunction.fromWebFunctionArn(this, 'Orders', 'arn:aws:lambda:us-east-1:111122223333:web-function/orders');\norders.grantInvoke(consumerRole); // every endpoint of the function\n\nconst live = WebFunction.fromWebFunctionAttributes(this, 'Live', {\n webFunctionName: 'orders', // in this stack's account and region\n endpointName: 'live', // grantInvoke allows this endpoint only\n});\nlive.metricConcurrentRequests().createAlarm(this, 'Busy', { threshold: 60, evaluationPeriods: 3 });\n```\n\nAn imported function's metrics default to its own region. Its endpoints, revisions and log groups stay with the stack that defines it.\n\nAn imported function works like a `WebFunction` here. `grantInvoke` and `addToResourcePolicy` write the importing stack's statements into the function's resource policy, in the function's region. This works only when the function is in the stack's account. For a function in another account, `grantInvoke` adds to the caller's IAM policy only, and `addToResourcePolicy` adds nothing and warns, so ask that account to allow the caller.\n\n## Configuration\n\n```ts\nconst api = new WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('build'),\n authType: WebFunctionAuthType.AWS_IAM,\n entrypoint: 'server.js', // default index.js\n webFunctionName: 'orders-api', // default: generated from the construct path\n description: 'Orders HTTP API',\n environment: { TABLE_NAME: table.tableName },\n timeout: Duration.seconds(60), // per request: 3 seconds to 15 minutes, default 30 seconds\n maxConcurrencyPerEnvironment: 32, // requests per environment at once: 1-128, default 64\n});\n\napi.addEnvironment('FEATURE_FLAG', 'on');\ntable.grantReadWriteData(api); // the default role trusts lambda.amazonaws.com\n```\n\n- **Each execution environment has 2 vCPUs and 2 GB of memory.** There's no memory setting as on Lambda functions; scale with `maxConcurrencyPerEnvironment` and more environments instead.\n- Requests handled by one environment share module-level state, so keep handlers concurrency-safe.\n- Environment variable names starting with `AWS_` are reserved.\n- **The default execution role can only write to the function's own log groups**: the home region's, and the `.local` copy in every region it serves from. That's the minimum AWS documents for Web Functions. It doesn't use `AWSLambdaBasicExecutionRole`, which can also create any log group. Pass `role` to use your own, and include those log permissions.\n- **Renaming the function replaces it and changes its URL.** A generated name depends on the construct path, so moving the construct renames it too.\n\n### Defaults for every function (property injection)\n\nTo give every function under a scope the same defaults, register a property injector for `WebFunction.PROPERTY_INJECTION_ID`, as you would for aws-cdk-lib's constructs. For example, a team's log retention:\n\n```ts\nclass TeamDefaults implements IPropertyInjector {\n public readonly constructUniqueId = WebFunction.PROPERTY_INJECTION_ID;\n public inject(originalProps: WebFunctionProps): WebFunctionProps {\n // The team's defaults, with explicit props winning.\n return Object.assign({ logRetention: logs.RetentionDays.ONE_MONTH }, originalProps);\n }\n}\nPropertyInjectors.of(this).add(new TeamDefaults()); // or on the app, for every stack\n```\n\n- An injector applies to functions created under the scope it's added to. The nearest one wins.\n- `NodejsWebFunction` has its own ID (`NodejsWebFunction.PROPERTY_INJECTION_ID`). Its injector runs first, then `WebFunction`'s, as with aws-cdk-lib's `NodejsFunction` and `Function`.\n\n### Bundling TypeScript with `NodejsWebFunction`\n\n`NodejsWebFunction` is a `WebFunction` that bundles your server from a TypeScript or JavaScript entry file with esbuild, like `NodejsFunction` does for Lambda functions:\n\n```ts\nnew NodejsWebFunction(this, 'Api', {\n entry: 'src/server.ts',\n authType: WebFunctionAuthType.AWS_IAM,\n bundling: {\n minify: true, // default true\n sourceMap: true, // default true\n format: lambdaNodejs.OutputFormat.ESM, // default ESM (index.mjs); CJS gives index.js\n externalModules: [], // default: bundle everything you import\n },\n});\n```\n\n- **Defaults:** `runtime` is `NODEJS_24_X`, and the esbuild target follows the runtime (`node24`). The project root is the directory of the nearest lock file above `entry` (override it with `depsLockFilePath` or `projectRoot`).\n- **It also sets what a `lambda.Code` can't:** the entry point that matches the bundle, and `NODE_OPTIONS=--enable-source-maps` when source maps are on, appended to any `NODE_OPTIONS` you set, so stack traces point at your `.ts` files (e.g. `/var/task/src/server.ts:22:12`). Source map paths are relative to the project root, so no build-machine paths are deployed.\n- **ESM bundles include a `require` shim**, so CommonJS dependencies that load Node.js built-ins (Express, for example) work.\n- **The AWS SDK is bundled like any other dependency**, since the runtime has none. Only the clients you import are included.\n- **Bundling runs locally** when esbuild is installed in your project, and otherwise in Docker (an arm64 AWS SAM build image; set `forceDockerBundling` to always use Docker).\n- **Not yet supported:** installing native modules next to the bundle (`nodeModules`) and command hooks. For native dependencies, use `WebFunction` with `Code.fromAsset(..., { bundling: { image, command } })`.\n\n### Code\n\n`code` takes any `lambda.Code` that produces a zip in S3: `fromAsset`, `fromBucket`/`fromBucketV2`, `fromCustomCommand`, `fromDockerBuild`. Inline code and container images fail at synth time.\n\nLambda Web Functions download code as the `lambda.amazonaws.com` service principal, from a **versioned** bucket, and the CDK bootstrap bucket allows neither. So each stack gets a small code bucket, and the code is copied into it on deploy. The bucket is emptied and deleted with the stack.\n\nCopying code, managing the function's log groups in every region, looking up regional URLs, cleaning up old revisions, creating rollback alarms in other regions and emptying the code bucket all run in one custom resource Lambda per stack. Its logs go to a log group the stack owns, kept for a month and deleted with the stack.\n\n## Revisions\n\nAny change to code or configuration creates a new **revision** (`fn.currentRevision`), and endpoints switch to it once it's ready. A failed deployment rolls back to the previous revision. If nothing changed, nothing is deployed.\n\nEarlier revisions are kept, so you can roll back or route traffic to them. After each deployment, the construct deletes the oldest beyond `revisionRetention` (default 20, up to 50). It never deletes a revision an endpoint routes to, or one the previous deployment used, which a rollback returns to.\n\n```ts\nnew WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('dist'),\n authType: WebFunctionAuthType.AWS_IAM,\n revisionRetention: 5,\n});\n```\n\n### Routing to earlier revisions\n\nReference an earlier revision by its ID (for example from a `CfnOutput` of `fn.currentRevision.revisionId`, or `aws lambda-web list-web-function-revisions`). Then pin an endpoint to it, or split traffic between two revisions:\n\n```ts\nconst previous = WebFunctionRevision.fromRevisionAttributes(this, 'Previous', {\n webFunction: fn,\n revisionId: 'rev-a1b2c',\n});\n\n// Keep the default endpoint on the previous revision, and send 10% to the new one:\nfn.endpoint.routeTraffic(previous, [{ revision: fn.currentRevision, weight: 0.1 }]);\n\n// Or a second endpoint that stays on the previous revision while fn.endpoint moves on:\nfn.addEndpoint('Stable', { authType: WebFunctionAuthType.AWS_IAM, revision: previous });\n```\n\n- An endpoint routes to at most two revisions. The additional revision's `weight` is a whole percentage, from 0.01 to 0.99.\n- To promote, remove `routeTraffic` (or `revision`) and deploy: the endpoint serves the current revision again.\n- Lambda Web Function metrics have no revision dimension. To compare a split's revisions, log a version you control (for example an environment variable) from your application.\n\n### Canary and linear deployments\n\nBy default an endpoint moves all its traffic to a new revision at once. With `deployment`, it moves in steps instead, watching CloudWatch alarms: if one goes into ALARM, the endpoint goes back to the revision it served before and the deployment fails, so CloudFormation rolls the stack back.\n\n```ts\nconst api = new WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('dist'),\n authType: WebFunctionAuthType.AWS_IAM,\n endpoint: {\n // 10% of the traffic for 10 minutes, then all of it; back if more than 2% of requests get a 5XX.\n deployment: WebFunctionDeployment.canary({ percent: 10, bake: Duration.minutes(10), rollbackOn: { serverErrorRate: 2 } }),\n },\n});\n\n// 25% more every 5 minutes, watching an alarm of your own. Each endpoint has its own deployment.\n// errorRate: any cloudwatch.IAlarm, e.g. on a metric your application publishes.\napi.addEndpoint('Public', {\n authType: WebFunctionAuthType.NONE,\n deployment: WebFunctionDeployment.linear({ percent: 25, interval: Duration.minutes(5), alarms: [errorRate] }),\n});\n```\n\n| | Steps | Limits |\n|---|---|---|\n| `allAtOnce()` (default) | 100% | |\n| `canary({ percent, bake })` | `percent`, then 100% after `bake` | `percent` 1–99, `bake` 1–45 minutes |\n| `linear({ percent, interval })` | `percent` more every `interval` | `percent` 5–50, `interval` from 1 minute, at most 45 minutes in all |\n\nHow it works:\n\n- Each deployment that creates a revision (code or configuration) moves the traffic from the revision the endpoint serves at that moment, which is also what it goes back to. If someone switched the endpoint outside CloudFormation, the deployment starts from there.\n- Each step waits until every region of a `MULTI_REGION` or `PER_REGION` endpoint has applied it (usually about 15 seconds), and if a region fails to update, the endpoint goes back as for an alarm. The bake or interval counts from the start of the step.\n- Alarms are checked before the first step (an alarm already in ALARM stops the deployment before any traffic moves), throughout every step, and once the new revision has all the traffic. They can be in any region, and composite alarms work. `INSUFFICIENT_DATA` doesn't stop a deployment.\n- A rollback of the stack, for any reason, moves the traffic back at once, without waiting or checking alarms.\n- A stack's first deployment, and a new endpoint (including one renamed by a region change), serve the revision at once: there's nothing to move from.\n- A deployment can take up to an hour: CloudFormation waits for it before it updates the endpoint. Deployments of different endpoints run in parallel.\n- A canary or linear endpoint always moves to the current revision, so it can't also use `revision`, `additionalRevisions` or `routeTraffic()`. Use `allAtOnce()` to deploy a fix immediately, for example while an alarm is in ALARM.\n\n#### Rollback alarms\n\n`rollbackOn` makes the endpoint create alarms on its own error rates, and the deployment watches them alongside any `alarms` you pass:\n\n| `rollbackOn` | Default | |\n|---|---|---|\n| `serverErrorRate` | none | roll back when more than this % of requests get a 5XX |\n| `clientErrorRate` | none | the same for 4XX (including 429s from `rateLimit` and `maxEnvironments`) |\n| `minimumRequests` | 10 | periods with fewer requests don't count, so one failed request out of two doesn't roll back |\n| `period`, `evaluationPeriods` | 1 minute, 2 | consecutive periods over the threshold before rolling back |\n\n- **One alarm per threshold in every region the endpoint serves from.** Metrics are published in the region that served the request, and an alarm can only watch metrics in its own region. The home region's alarm is a normal CloudFormation alarm; the others are created and deleted with the endpoint by a custom resource, and named `LambdaWeb-<function>-<endpoint>-5xx-rate` (or `-4xx-rate`). `endpoint.rollbackAlarms` lists them all, e.g. to add notifications to the home region's.\n- **The alarms see the whole endpoint.** Lambda Web Function metrics have no revision dimension, so at 10% a new revision's errors are about a tenth of the endpoint's: set the threshold low enough to notice that, or alarm on metrics your application publishes with its version.\n- **5XX includes the platform's 503s** while the endpoint scales up for a sudden burst, not only your application's errors.\n- **A step should outlast the alarm.** CloudWatch needs `period` × `evaluationPeriods`, plus a couple of minutes of delay, to fire; the construct warns when a canary's bake or a linear interval is shorter.\n\nThe deployment runs in a few resources per stack, created on first use: two Lambda functions, a Step Functions state machine that calls them every 15 seconds, and a log group.\n\n## Metrics\n\nEndpoints and functions have helpers for their CloudWatch metrics (namespace `AWS/Lambda/Web`), like `lambda.Function`'s:\n\n```ts\nfn.endpoint.metricServerErrorRate().createAlarm(this, 'ErrorRate', { threshold: 1, evaluationPeriods: 3 });\nfn.endpoint.metricRequestThrottles().createAlarm(this, 'Throttled', { threshold: 10, evaluationPeriods: 3 });\nfn.metricConcurrentRequests().createAlarm(this, 'Saturated', { threshold: 60, evaluationPeriods: 3 });\n```\n\n| Endpoint | Metric |\n|---|---|\n| `metricRequests()` | `ExecutedRequests` (there's no separate 2XX count) |\n| `metricClientErrors()`, `metricServerErrors()` | `HTTPResponseStatusClass4XX`, `HTTPResponseStatusClass5XX` |\n| `metricClientErrorRate()`, `metricServerErrorRate()` | 4XX or 5XX as a % of requests (math expression) |\n| `metricActiveEnvironments()` | `EndpointActiveEnvironments`, to compare with `maxEnvironments` |\n| `metricRequestThrottles()`, `metricEnvironmentThrottles()` | 429s from `rateLimit` and from `maxEnvironments` |\n\n| Function | Metric |\n|---|---|\n| `metricConcurrentRequests()` | `EnvironmentConcurrentRequests` (maximum), to compare with `maxConcurrencyPerEnvironment` |\n| `metricMaxMemoryUsage()` | `EnvironmentMaxMemoryUsage` (maximum) |\n| `metricActiveTime()`, `metricCpuTime()`, `metricResponseBytes()` | `EnvironmentActiveTime`, `EnvironmentCPUTime`, `ResponseBytes` |\n\n- **Metrics stay in the region that served the request**; unlike logs, they aren't copied to the home region. Every helper takes `region`. Dashboards can show any region, but an alarm can only use metrics from its own stack's region.\n- 4XX, 5XX and the throttle metrics only exist once they're non-zero: alarm on them with `treatMissingData: NOT_BREACHING`. The rate helpers count missing errors as 0.\n- There's no latency metric. Publish one from your application (e.g. with the CloudWatch embedded metric format).\n\n## Logs in every region\n\nWeb Functions log in two tiers:\n\n```text\n every serving region home region\n ┌──────────────────┐ ┌──────────────────────────────────────────┐\n │ <group>.local │── copied ───►│ <group> every region's logs │\n │ (that region's │ (seconds) │ streams …[rev]<instance>-<acct>-<region> │\n │ environments) │ │ <group>.local (home-region traffic) │\n └──────────────────┘ └──────────────────────────────────────────┘\n```\n\n**Query `fn.logGroup`**, the home-region group that receives every region's logs. The service would create missing groups without retention and never delete them, so the construct creates and owns all of them: both home-region groups, and `<group>.local` in every other region any of its endpoints serves from.\n\n```ts\nnew WebFunction(this, 'Api', {\n runtime: lambda.Runtime.NODEJS_24_X,\n code: lambda.Code.fromAsset('dist'),\n authType: WebFunctionAuthType.AWS_IAM,\n logRetention: logs.RetentionDays.THREE_MONTHS, // default ONE_MONTH, every group in every region\n logRemovalPolicy: RemovalPolicy.DESTROY, // default RETAIN\n applicationLogLevelV2: lambda.ApplicationLogLevel.WARN,\n systemLogLevelV2: lambda.SystemLogLevel.INFO, // DEBUG, INFO or WARN\n});\n```\n\n- The default group is `/aws/lambda/web/<function name>`. Log lines are JSON; application lines carry `requestId`, `endpointName` and `region`.\n- Every event is stored twice (`.local` plus the home-region copy), so expect about double log ingestion, plus cross-region transfer.\n- With `DESTROY`, deletion waits about a minute after the function is gone, because environments flush their last lines late.\n- Subscribe only to `fn.logGroup`: subscribing to the `.local` groups as well delivers every event twice.\n\n## cdk-nag\n\nThe library acknowledges the [cdk-nag](https://github.com/cdklabs/cdk-nag) AwsSolutions findings on the resources it creates, each with a reason, so they don't show up in your reports:\n\n| Finding | Resource | Reason |\n|---|---|---|\n| IAM5 (wildcards) | the default execution role | log streams of the function's own log groups, in every region it serves from |\n| IAM5 | the deployment handlers' role (canary and linear deployments) | their own log group, `cloudwatch:DescribeAlarms` (composite alarms need `*`), and the revisions and endpoints of the functions they deploy |\n| IAM4, IAM5, SF1, SF2 | the CDK Provider framework behind deployments | CDK's own functions and waiter state machine |\n| S1 (access logs) | the stack's code bucket | it only holds copies of the stack's code assets |\n\n- **This works with both cdk-nag versions**, without depending on cdk-nag. cdk-nag 3 reads CDK's `Validations.of(...).acknowledge()`, one ID per finding. cdk-nag 2 reads `cdk_nag` metadata in the template.\n- **Your own statements and resources are still checked.** That includes statements you add to the function's role (`addToRolePolicy`, grants) and your CloudFront distribution's settings.\n- Only the AwsSolutions pack is covered; findings from the HIPAA, NIST and PCI packs aren't acknowledged.\n\n## Upgrading\n\n### From 0.1.5 to 0.1.7, with a resource policy\n\nVersions 0.1.5 to 0.1.7 wrote the function's resource policy with an `AWS::Lambda::ResourcePolicy`. Later versions don't (0.1.7 has the same code as 0.1.6). When an update removes that resource, CloudFormation deletes the function's **whole** resource policy at the end of the update, including the statements the new version just wrote. Callers that rely on the policy then get 403: other accounts, AWS services, and CloudFront.\n\nIf your function has a resource policy (from `addPermission`, a grant to another account or an AWS service, or `WebFunctionOrigin`), first deploy once on the version you have, with the old resource retained:\n\n```ts\n(fn.node.findChild('ResourcePolicy') as CfnResource).applyRemovalPolicy(RemovalPolicy.RETAIN);\n```\n\nThen upgrade, without changing your statements in the same deployment. The new version takes over the statements it writes itself. A statement you removed in the same deployment would stay in the policy.\n\n## Limitations\n\n- Not yet supported: VPC access (network connectors), KMS encryption, and tracing.\n- **Hotswap skips Web Functions without a warning.** `cdk deploy --hotswap` and `cdk watch`, which hotswaps by default, report `(no changes)` for a code or configuration change and the endpoint keeps serving the old revision. Use `cdk watch --hotswap-fallback` (or `cdk deploy --hotswap-fallback`): it deploys Web Function changes through CloudFormation, in about 40 seconds for a home-region endpoint.\n- Fixed limits: 512 MB of code (unzipped) and 32 KB of environment variables per revision, 512 MB of `/tmp` per execution environment, and 128 KiB of headers per request.\n- Quotas: 10 endpoints and about 50 revisions per function (Lambda cleans up older revisions automatically), and 10,000 requests per second per endpoint. Per account and region: 100,000 requests per second and 2,000 Arm64 vCPUs (each execution environment uses 2). The account quotas are adjustable, and new accounts start lower. See [Lambda quotas](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html).\n\n## Development\n\nTooling is pinned in `mise.toml` (Node 24, AWS CDK CLI). Personal settings, such as the AWS profile for the live end-to-end tests, go in a git-ignored `mise.local.toml`.\n\n```bash\nmise install\nnpx projen build # compile, unit tests, lint, API docs\nnpx projen e2e # deploy, verify and destroy real stacks in three regions (needs AWS credentials)\n```\n"
|
|
9749
9749
|
},
|
|
9750
9750
|
"repository": {
|
|
9751
9751
|
"type": "git",
|
|
@@ -9853,7 +9853,7 @@
|
|
|
9853
9853
|
"kind": "interface",
|
|
9854
9854
|
"locationInModule": {
|
|
9855
9855
|
"filename": "src/web-function.ts",
|
|
9856
|
-
"line":
|
|
9856
|
+
"line": 162
|
|
9857
9857
|
},
|
|
9858
9858
|
"methods": [
|
|
9859
9859
|
{
|
|
@@ -9865,7 +9865,7 @@
|
|
|
9865
9865
|
},
|
|
9866
9866
|
"locationInModule": {
|
|
9867
9867
|
"filename": "src/web-function.ts",
|
|
9868
|
-
"line":
|
|
9868
|
+
"line": 185
|
|
9869
9869
|
},
|
|
9870
9870
|
"name": "grantInvoke",
|
|
9871
9871
|
"parameters": [
|
|
@@ -9890,7 +9890,7 @@
|
|
|
9890
9890
|
},
|
|
9891
9891
|
"locationInModule": {
|
|
9892
9892
|
"filename": "src/web-function.ts",
|
|
9893
|
-
"line":
|
|
9893
|
+
"line": 190
|
|
9894
9894
|
},
|
|
9895
9895
|
"name": "metric",
|
|
9896
9896
|
"parameters": [
|
|
@@ -9922,7 +9922,7 @@
|
|
|
9922
9922
|
},
|
|
9923
9923
|
"locationInModule": {
|
|
9924
9924
|
"filename": "src/web-function.ts",
|
|
9925
|
-
"line":
|
|
9925
|
+
"line": 193
|
|
9926
9926
|
},
|
|
9927
9927
|
"name": "metricActiveTime",
|
|
9928
9928
|
"parameters": [
|
|
@@ -9948,7 +9948,7 @@
|
|
|
9948
9948
|
},
|
|
9949
9949
|
"locationInModule": {
|
|
9950
9950
|
"filename": "src/web-function.ts",
|
|
9951
|
-
"line":
|
|
9951
|
+
"line": 199
|
|
9952
9952
|
},
|
|
9953
9953
|
"name": "metricConcurrentRequests",
|
|
9954
9954
|
"parameters": [
|
|
@@ -9974,7 +9974,7 @@
|
|
|
9974
9974
|
},
|
|
9975
9975
|
"locationInModule": {
|
|
9976
9976
|
"filename": "src/web-function.ts",
|
|
9977
|
-
"line":
|
|
9977
|
+
"line": 196
|
|
9978
9978
|
},
|
|
9979
9979
|
"name": "metricCpuTime",
|
|
9980
9980
|
"parameters": [
|
|
@@ -10000,7 +10000,7 @@
|
|
|
10000
10000
|
},
|
|
10001
10001
|
"locationInModule": {
|
|
10002
10002
|
"filename": "src/web-function.ts",
|
|
10003
|
-
"line":
|
|
10003
|
+
"line": 202
|
|
10004
10004
|
},
|
|
10005
10005
|
"name": "metricMaxMemoryUsage",
|
|
10006
10006
|
"parameters": [
|
|
@@ -10026,7 +10026,7 @@
|
|
|
10026
10026
|
},
|
|
10027
10027
|
"locationInModule": {
|
|
10028
10028
|
"filename": "src/web-function.ts",
|
|
10029
|
-
"line":
|
|
10029
|
+
"line": 205
|
|
10030
10030
|
},
|
|
10031
10031
|
"name": "metricResponseBytes",
|
|
10032
10032
|
"parameters": [
|
|
@@ -10059,7 +10059,7 @@
|
|
|
10059
10059
|
"immutable": true,
|
|
10060
10060
|
"locationInModule": {
|
|
10061
10061
|
"filename": "src/web-function.ts",
|
|
10062
|
-
"line":
|
|
10062
|
+
"line": 175
|
|
10063
10063
|
},
|
|
10064
10064
|
"name": "webFunctionArn",
|
|
10065
10065
|
"type": {
|
|
@@ -10078,7 +10078,7 @@
|
|
|
10078
10078
|
"immutable": true,
|
|
10079
10079
|
"locationInModule": {
|
|
10080
10080
|
"filename": "src/web-function.ts",
|
|
10081
|
-
"line":
|
|
10081
|
+
"line": 168
|
|
10082
10082
|
},
|
|
10083
10083
|
"name": "webFunctionName",
|
|
10084
10084
|
"type": {
|
|
@@ -10171,7 +10171,7 @@
|
|
|
10171
10171
|
},
|
|
10172
10172
|
"locationInModule": {
|
|
10173
10173
|
"filename": "src/nodejs-web-function.ts",
|
|
10174
|
-
"line":
|
|
10174
|
+
"line": 174
|
|
10175
10175
|
},
|
|
10176
10176
|
"parameters": [
|
|
10177
10177
|
{
|
|
@@ -10197,9 +10197,29 @@
|
|
|
10197
10197
|
"kind": "class",
|
|
10198
10198
|
"locationInModule": {
|
|
10199
10199
|
"filename": "src/nodejs-web-function.ts",
|
|
10200
|
-
"line":
|
|
10200
|
+
"line": 167
|
|
10201
10201
|
},
|
|
10202
10202
|
"name": "NodejsWebFunction",
|
|
10203
|
+
"properties": [
|
|
10204
|
+
{
|
|
10205
|
+
"const": true,
|
|
10206
|
+
"docs": {
|
|
10207
|
+
"stability": "experimental",
|
|
10208
|
+
"summary": "Identifies this class to property injectors (`PropertyInjectors.of(scope).add(...)`). A `NodejsWebFunction` gets its own injector first, then `WebFunction`'s, as aws-cdk-lib's `NodejsFunction` does with `Function`'s."
|
|
10209
|
+
},
|
|
10210
|
+
"immutable": true,
|
|
10211
|
+
"locationInModule": {
|
|
10212
|
+
"filename": "src/nodejs-web-function.ts",
|
|
10213
|
+
"line": 172
|
|
10214
|
+
},
|
|
10215
|
+
"name": "PROPERTY_INJECTION_ID",
|
|
10216
|
+
"overrides": "@ashishpandeyone/cdk-lambda-web-function.WebFunction",
|
|
10217
|
+
"static": true,
|
|
10218
|
+
"type": {
|
|
10219
|
+
"primitive": "string"
|
|
10220
|
+
}
|
|
10221
|
+
}
|
|
10222
|
+
],
|
|
10203
10223
|
"symbolId": "src/nodejs-web-function:NodejsWebFunction"
|
|
10204
10224
|
},
|
|
10205
10225
|
"@ashishpandeyone/cdk-lambda-web-function.NodejsWebFunctionBundlingOptions": {
|
|
@@ -10213,7 +10233,7 @@
|
|
|
10213
10233
|
"kind": "interface",
|
|
10214
10234
|
"locationInModule": {
|
|
10215
10235
|
"filename": "src/nodejs-web-function.ts",
|
|
10216
|
-
"line":
|
|
10236
|
+
"line": 13
|
|
10217
10237
|
},
|
|
10218
10238
|
"name": "NodejsWebFunctionBundlingOptions",
|
|
10219
10239
|
"properties": [
|
|
@@ -10227,7 +10247,7 @@
|
|
|
10227
10247
|
"immutable": true,
|
|
10228
10248
|
"locationInModule": {
|
|
10229
10249
|
"filename": "src/nodejs-web-function.ts",
|
|
10230
|
-
"line":
|
|
10250
|
+
"line": 70
|
|
10231
10251
|
},
|
|
10232
10252
|
"name": "banner",
|
|
10233
10253
|
"optional": true,
|
|
@@ -10245,7 +10265,7 @@
|
|
|
10245
10265
|
"immutable": true,
|
|
10246
10266
|
"locationInModule": {
|
|
10247
10267
|
"filename": "src/nodejs-web-function.ts",
|
|
10248
|
-
"line":
|
|
10268
|
+
"line": 56
|
|
10249
10269
|
},
|
|
10250
10270
|
"name": "define",
|
|
10251
10271
|
"optional": true,
|
|
@@ -10268,7 +10288,7 @@
|
|
|
10268
10288
|
"immutable": true,
|
|
10269
10289
|
"locationInModule": {
|
|
10270
10290
|
"filename": "src/nodejs-web-function.ts",
|
|
10271
|
-
"line":
|
|
10291
|
+
"line": 119
|
|
10272
10292
|
},
|
|
10273
10293
|
"name": "dockerImage",
|
|
10274
10294
|
"optional": true,
|
|
@@ -10286,7 +10306,7 @@
|
|
|
10286
10306
|
"immutable": true,
|
|
10287
10307
|
"locationInModule": {
|
|
10288
10308
|
"filename": "src/nodejs-web-function.ts",
|
|
10289
|
-
"line":
|
|
10309
|
+
"line": 105
|
|
10290
10310
|
},
|
|
10291
10311
|
"name": "environment",
|
|
10292
10312
|
"optional": true,
|
|
@@ -10309,7 +10329,7 @@
|
|
|
10309
10329
|
"immutable": true,
|
|
10310
10330
|
"locationInModule": {
|
|
10311
10331
|
"filename": "src/nodejs-web-function.ts",
|
|
10312
|
-
"line":
|
|
10332
|
+
"line": 98
|
|
10313
10333
|
},
|
|
10314
10334
|
"name": "esbuildArgs",
|
|
10315
10335
|
"optional": true,
|
|
@@ -10342,7 +10362,7 @@
|
|
|
10342
10362
|
"immutable": true,
|
|
10343
10363
|
"locationInModule": {
|
|
10344
10364
|
"filename": "src/nodejs-web-function.ts",
|
|
10345
|
-
"line":
|
|
10365
|
+
"line": 49
|
|
10346
10366
|
},
|
|
10347
10367
|
"name": "externalModules",
|
|
10348
10368
|
"optional": true,
|
|
@@ -10365,7 +10385,7 @@
|
|
|
10365
10385
|
"immutable": true,
|
|
10366
10386
|
"locationInModule": {
|
|
10367
10387
|
"filename": "src/nodejs-web-function.ts",
|
|
10368
|
-
"line":
|
|
10388
|
+
"line": 77
|
|
10369
10389
|
},
|
|
10370
10390
|
"name": "footer",
|
|
10371
10391
|
"optional": true,
|
|
@@ -10383,7 +10403,7 @@
|
|
|
10383
10403
|
"immutable": true,
|
|
10384
10404
|
"locationInModule": {
|
|
10385
10405
|
"filename": "src/nodejs-web-function.ts",
|
|
10386
|
-
"line":
|
|
10406
|
+
"line": 112
|
|
10387
10407
|
},
|
|
10388
10408
|
"name": "forceDockerBundling",
|
|
10389
10409
|
"optional": true,
|
|
@@ -10402,7 +10422,7 @@
|
|
|
10402
10422
|
"immutable": true,
|
|
10403
10423
|
"locationInModule": {
|
|
10404
10424
|
"filename": "src/nodejs-web-function.ts",
|
|
10405
|
-
"line":
|
|
10425
|
+
"line": 34
|
|
10406
10426
|
},
|
|
10407
10427
|
"name": "format",
|
|
10408
10428
|
"optional": true,
|
|
@@ -10420,7 +10440,7 @@
|
|
|
10420
10440
|
"immutable": true,
|
|
10421
10441
|
"locationInModule": {
|
|
10422
10442
|
"filename": "src/nodejs-web-function.ts",
|
|
10423
|
-
"line":
|
|
10443
|
+
"line": 91
|
|
10424
10444
|
},
|
|
10425
10445
|
"name": "keepNames",
|
|
10426
10446
|
"optional": true,
|
|
@@ -10438,7 +10458,7 @@
|
|
|
10438
10458
|
"immutable": true,
|
|
10439
10459
|
"locationInModule": {
|
|
10440
10460
|
"filename": "src/nodejs-web-function.ts",
|
|
10441
|
-
"line":
|
|
10461
|
+
"line": 63
|
|
10442
10462
|
},
|
|
10443
10463
|
"name": "loader",
|
|
10444
10464
|
"optional": true,
|
|
@@ -10461,7 +10481,7 @@
|
|
|
10461
10481
|
"immutable": true,
|
|
10462
10482
|
"locationInModule": {
|
|
10463
10483
|
"filename": "src/nodejs-web-function.ts",
|
|
10464
|
-
"line":
|
|
10484
|
+
"line": 19
|
|
10465
10485
|
},
|
|
10466
10486
|
"name": "minify",
|
|
10467
10487
|
"optional": true,
|
|
@@ -10479,7 +10499,7 @@
|
|
|
10479
10499
|
"immutable": true,
|
|
10480
10500
|
"locationInModule": {
|
|
10481
10501
|
"filename": "src/nodejs-web-function.ts",
|
|
10482
|
-
"line":
|
|
10502
|
+
"line": 26
|
|
10483
10503
|
},
|
|
10484
10504
|
"name": "sourceMap",
|
|
10485
10505
|
"optional": true,
|
|
@@ -10497,7 +10517,7 @@
|
|
|
10497
10517
|
"immutable": true,
|
|
10498
10518
|
"locationInModule": {
|
|
10499
10519
|
"filename": "src/nodejs-web-function.ts",
|
|
10500
|
-
"line":
|
|
10520
|
+
"line": 41
|
|
10501
10521
|
},
|
|
10502
10522
|
"name": "target",
|
|
10503
10523
|
"optional": true,
|
|
@@ -10515,7 +10535,7 @@
|
|
|
10515
10535
|
"immutable": true,
|
|
10516
10536
|
"locationInModule": {
|
|
10517
10537
|
"filename": "src/nodejs-web-function.ts",
|
|
10518
|
-
"line":
|
|
10538
|
+
"line": 84
|
|
10519
10539
|
},
|
|
10520
10540
|
"name": "tsconfig",
|
|
10521
10541
|
"optional": true,
|
|
@@ -10540,7 +10560,7 @@
|
|
|
10540
10560
|
"kind": "interface",
|
|
10541
10561
|
"locationInModule": {
|
|
10542
10562
|
"filename": "src/nodejs-web-function.ts",
|
|
10543
|
-
"line":
|
|
10563
|
+
"line": 125
|
|
10544
10564
|
},
|
|
10545
10565
|
"name": "NodejsWebFunctionProps",
|
|
10546
10566
|
"properties": [
|
|
@@ -10554,7 +10574,7 @@
|
|
|
10554
10574
|
"immutable": true,
|
|
10555
10575
|
"locationInModule": {
|
|
10556
10576
|
"filename": "src/nodejs-web-function.ts",
|
|
10557
|
-
"line":
|
|
10577
|
+
"line": 129
|
|
10558
10578
|
},
|
|
10559
10579
|
"name": "entry",
|
|
10560
10580
|
"type": {
|
|
@@ -10571,7 +10591,7 @@
|
|
|
10571
10591
|
"immutable": true,
|
|
10572
10592
|
"locationInModule": {
|
|
10573
10593
|
"filename": "src/nodejs-web-function.ts",
|
|
10574
|
-
"line":
|
|
10594
|
+
"line": 157
|
|
10575
10595
|
},
|
|
10576
10596
|
"name": "bundling",
|
|
10577
10597
|
"optional": true,
|
|
@@ -10589,7 +10609,7 @@
|
|
|
10589
10609
|
"immutable": true,
|
|
10590
10610
|
"locationInModule": {
|
|
10591
10611
|
"filename": "src/nodejs-web-function.ts",
|
|
10592
|
-
"line":
|
|
10612
|
+
"line": 143
|
|
10593
10613
|
},
|
|
10594
10614
|
"name": "depsLockFilePath",
|
|
10595
10615
|
"optional": true,
|
|
@@ -10608,7 +10628,7 @@
|
|
|
10608
10628
|
"immutable": true,
|
|
10609
10629
|
"locationInModule": {
|
|
10610
10630
|
"filename": "src/nodejs-web-function.ts",
|
|
10611
|
-
"line":
|
|
10631
|
+
"line": 150
|
|
10612
10632
|
},
|
|
10613
10633
|
"name": "projectRoot",
|
|
10614
10634
|
"optional": true,
|
|
@@ -10626,7 +10646,7 @@
|
|
|
10626
10646
|
"immutable": true,
|
|
10627
10647
|
"locationInModule": {
|
|
10628
10648
|
"filename": "src/nodejs-web-function.ts",
|
|
10629
|
-
"line":
|
|
10649
|
+
"line": 136
|
|
10630
10650
|
},
|
|
10631
10651
|
"name": "runtime",
|
|
10632
10652
|
"optional": true,
|
|
@@ -10655,7 +10675,7 @@
|
|
|
10655
10675
|
},
|
|
10656
10676
|
"locationInModule": {
|
|
10657
10677
|
"filename": "src/web-function.ts",
|
|
10658
|
-
"line":
|
|
10678
|
+
"line": 452
|
|
10659
10679
|
},
|
|
10660
10680
|
"parameters": [
|
|
10661
10681
|
{
|
|
@@ -10684,7 +10704,7 @@
|
|
|
10684
10704
|
"kind": "class",
|
|
10685
10705
|
"locationInModule": {
|
|
10686
10706
|
"filename": "src/web-function.ts",
|
|
10687
|
-
"line":
|
|
10707
|
+
"line": 388
|
|
10688
10708
|
},
|
|
10689
10709
|
"methods": [
|
|
10690
10710
|
{
|
|
@@ -10694,7 +10714,7 @@
|
|
|
10694
10714
|
},
|
|
10695
10715
|
"locationInModule": {
|
|
10696
10716
|
"filename": "src/web-function.ts",
|
|
10697
|
-
"line":
|
|
10717
|
+
"line": 398
|
|
10698
10718
|
},
|
|
10699
10719
|
"name": "fromWebFunctionArn",
|
|
10700
10720
|
"parameters": [
|
|
@@ -10731,7 +10751,7 @@
|
|
|
10731
10751
|
},
|
|
10732
10752
|
"locationInModule": {
|
|
10733
10753
|
"filename": "src/web-function.ts",
|
|
10734
|
-
"line":
|
|
10754
|
+
"line": 412
|
|
10735
10755
|
},
|
|
10736
10756
|
"name": "fromWebFunctionAttributes",
|
|
10737
10757
|
"parameters": [
|
|
@@ -10768,7 +10788,7 @@
|
|
|
10768
10788
|
},
|
|
10769
10789
|
"locationInModule": {
|
|
10770
10790
|
"filename": "src/web-function.ts",
|
|
10771
|
-
"line":
|
|
10791
|
+
"line": 405
|
|
10772
10792
|
},
|
|
10773
10793
|
"name": "fromWebFunctionName",
|
|
10774
10794
|
"parameters": [
|
|
@@ -10805,7 +10825,7 @@
|
|
|
10805
10825
|
},
|
|
10806
10826
|
"locationInModule": {
|
|
10807
10827
|
"filename": "src/web-function.ts",
|
|
10808
|
-
"line":
|
|
10828
|
+
"line": 552
|
|
10809
10829
|
},
|
|
10810
10830
|
"name": "addEndpoint",
|
|
10811
10831
|
"parameters": [
|
|
@@ -10839,7 +10859,7 @@
|
|
|
10839
10859
|
},
|
|
10840
10860
|
"locationInModule": {
|
|
10841
10861
|
"filename": "src/web-function.ts",
|
|
10842
|
-
"line":
|
|
10862
|
+
"line": 560
|
|
10843
10863
|
},
|
|
10844
10864
|
"name": "addEnvironment",
|
|
10845
10865
|
"parameters": [
|
|
@@ -10870,7 +10890,7 @@
|
|
|
10870
10890
|
},
|
|
10871
10891
|
"locationInModule": {
|
|
10872
10892
|
"filename": "src/web-function.ts",
|
|
10873
|
-
"line":
|
|
10893
|
+
"line": 589
|
|
10874
10894
|
},
|
|
10875
10895
|
"name": "addPermission",
|
|
10876
10896
|
"parameters": [
|
|
@@ -10898,7 +10918,7 @@
|
|
|
10898
10918
|
},
|
|
10899
10919
|
"locationInModule": {
|
|
10900
10920
|
"filename": "src/web-function.ts",
|
|
10901
|
-
"line":
|
|
10921
|
+
"line": 571
|
|
10902
10922
|
},
|
|
10903
10923
|
"name": "addToRolePolicy",
|
|
10904
10924
|
"parameters": [
|
|
@@ -10918,7 +10938,7 @@
|
|
|
10918
10938
|
},
|
|
10919
10939
|
"locationInModule": {
|
|
10920
10940
|
"filename": "src/web-function.ts",
|
|
10921
|
-
"line":
|
|
10941
|
+
"line": 579
|
|
10922
10942
|
},
|
|
10923
10943
|
"name": "grantInvoke",
|
|
10924
10944
|
"overrides": "@ashishpandeyone/cdk-lambda-web-function.WebFunctionBase",
|
|
@@ -10939,6 +10959,23 @@
|
|
|
10939
10959
|
],
|
|
10940
10960
|
"name": "WebFunction",
|
|
10941
10961
|
"properties": [
|
|
10962
|
+
{
|
|
10963
|
+
"const": true,
|
|
10964
|
+
"docs": {
|
|
10965
|
+
"stability": "experimental",
|
|
10966
|
+
"summary": "Identifies this class to property injectors (`PropertyInjectors.of(scope).add(...)`), which can set default props for every `WebFunction` under a scope. Injectors for `WebFunction` also apply to `NodejsWebFunction`."
|
|
10967
|
+
},
|
|
10968
|
+
"immutable": true,
|
|
10969
|
+
"locationInModule": {
|
|
10970
|
+
"filename": "src/web-function.ts",
|
|
10971
|
+
"line": 393
|
|
10972
|
+
},
|
|
10973
|
+
"name": "PROPERTY_INJECTION_ID",
|
|
10974
|
+
"static": true,
|
|
10975
|
+
"type": {
|
|
10976
|
+
"primitive": "string"
|
|
10977
|
+
}
|
|
10978
|
+
},
|
|
10942
10979
|
{
|
|
10943
10980
|
"docs": {
|
|
10944
10981
|
"stability": "experimental",
|
|
@@ -10947,7 +10984,7 @@
|
|
|
10947
10984
|
"immutable": true,
|
|
10948
10985
|
"locationInModule": {
|
|
10949
10986
|
"filename": "src/web-function.ts",
|
|
10950
|
-
"line":
|
|
10987
|
+
"line": 423
|
|
10951
10988
|
},
|
|
10952
10989
|
"name": "currentRevision",
|
|
10953
10990
|
"type": {
|
|
@@ -10963,7 +11000,7 @@
|
|
|
10963
11000
|
"immutable": true,
|
|
10964
11001
|
"locationInModule": {
|
|
10965
11002
|
"filename": "src/web-function.ts",
|
|
10966
|
-
"line":
|
|
11003
|
+
"line": 426
|
|
10967
11004
|
},
|
|
10968
11005
|
"name": "endpoint",
|
|
10969
11006
|
"type": {
|
|
@@ -10978,7 +11015,7 @@
|
|
|
10978
11015
|
"immutable": true,
|
|
10979
11016
|
"locationInModule": {
|
|
10980
11017
|
"filename": "src/web-function.ts",
|
|
10981
|
-
"line":
|
|
11018
|
+
"line": 435
|
|
10982
11019
|
},
|
|
10983
11020
|
"name": "grantPrincipal",
|
|
10984
11021
|
"overrides": "aws-cdk-lib.aws_iam.IGrantable",
|
|
@@ -10994,7 +11031,7 @@
|
|
|
10994
11031
|
"immutable": true,
|
|
10995
11032
|
"locationInModule": {
|
|
10996
11033
|
"filename": "src/web-function.ts",
|
|
10997
|
-
"line":
|
|
11034
|
+
"line": 429
|
|
10998
11035
|
},
|
|
10999
11036
|
"name": "grants",
|
|
11000
11037
|
"type": {
|
|
@@ -11010,7 +11047,7 @@
|
|
|
11010
11047
|
"immutable": true,
|
|
11011
11048
|
"locationInModule": {
|
|
11012
11049
|
"filename": "src/web-function.ts",
|
|
11013
|
-
"line":
|
|
11050
|
+
"line": 441
|
|
11014
11051
|
},
|
|
11015
11052
|
"name": "logGroup",
|
|
11016
11053
|
"type": {
|
|
@@ -11026,7 +11063,7 @@
|
|
|
11026
11063
|
"immutable": true,
|
|
11027
11064
|
"locationInModule": {
|
|
11028
11065
|
"filename": "src/web-function.ts",
|
|
11029
|
-
"line":
|
|
11066
|
+
"line": 420
|
|
11030
11067
|
},
|
|
11031
11068
|
"name": "revisionId",
|
|
11032
11069
|
"type": {
|
|
@@ -11041,7 +11078,7 @@
|
|
|
11041
11078
|
"immutable": true,
|
|
11042
11079
|
"locationInModule": {
|
|
11043
11080
|
"filename": "src/web-function.ts",
|
|
11044
|
-
"line":
|
|
11081
|
+
"line": 432
|
|
11045
11082
|
},
|
|
11046
11083
|
"name": "role",
|
|
11047
11084
|
"type": {
|
|
@@ -11056,7 +11093,7 @@
|
|
|
11056
11093
|
"immutable": true,
|
|
11057
11094
|
"locationInModule": {
|
|
11058
11095
|
"filename": "src/web-function.ts",
|
|
11059
|
-
"line":
|
|
11096
|
+
"line": 417
|
|
11060
11097
|
},
|
|
11061
11098
|
"name": "webFunctionArn",
|
|
11062
11099
|
"overrides": "@ashishpandeyone/cdk-lambda-web-function.WebFunctionBase",
|
|
@@ -11072,7 +11109,7 @@
|
|
|
11072
11109
|
"immutable": true,
|
|
11073
11110
|
"locationInModule": {
|
|
11074
11111
|
"filename": "src/web-function.ts",
|
|
11075
|
-
"line":
|
|
11112
|
+
"line": 416
|
|
11076
11113
|
},
|
|
11077
11114
|
"name": "webFunctionName",
|
|
11078
11115
|
"overrides": "@ashishpandeyone/cdk-lambda-web-function.WebFunctionBase",
|
|
@@ -11095,7 +11132,7 @@
|
|
|
11095
11132
|
"kind": "interface",
|
|
11096
11133
|
"locationInModule": {
|
|
11097
11134
|
"filename": "src/web-function.ts",
|
|
11098
|
-
"line":
|
|
11135
|
+
"line": 211
|
|
11099
11136
|
},
|
|
11100
11137
|
"name": "WebFunctionAttributes",
|
|
11101
11138
|
"properties": [
|
|
@@ -11109,7 +11146,7 @@
|
|
|
11109
11146
|
"immutable": true,
|
|
11110
11147
|
"locationInModule": {
|
|
11111
11148
|
"filename": "src/web-function.ts",
|
|
11112
|
-
"line":
|
|
11149
|
+
"line": 233
|
|
11113
11150
|
},
|
|
11114
11151
|
"name": "endpointName",
|
|
11115
11152
|
"optional": true,
|
|
@@ -11127,7 +11164,7 @@
|
|
|
11127
11164
|
"immutable": true,
|
|
11128
11165
|
"locationInModule": {
|
|
11129
11166
|
"filename": "src/web-function.ts",
|
|
11130
|
-
"line":
|
|
11167
|
+
"line": 219
|
|
11131
11168
|
},
|
|
11132
11169
|
"name": "webFunctionArn",
|
|
11133
11170
|
"optional": true,
|
|
@@ -11145,7 +11182,7 @@
|
|
|
11145
11182
|
"immutable": true,
|
|
11146
11183
|
"locationInModule": {
|
|
11147
11184
|
"filename": "src/web-function.ts",
|
|
11148
|
-
"line":
|
|
11185
|
+
"line": 226
|
|
11149
11186
|
},
|
|
11150
11187
|
"name": "webFunctionName",
|
|
11151
11188
|
"optional": true,
|
|
@@ -11233,7 +11270,7 @@
|
|
|
11233
11270
|
"kind": "class",
|
|
11234
11271
|
"locationInModule": {
|
|
11235
11272
|
"filename": "src/web-function.ts",
|
|
11236
|
-
"line":
|
|
11273
|
+
"line": 274
|
|
11237
11274
|
},
|
|
11238
11275
|
"methods": [
|
|
11239
11276
|
{
|
|
@@ -11244,7 +11281,7 @@
|
|
|
11244
11281
|
},
|
|
11245
11282
|
"locationInModule": {
|
|
11246
11283
|
"filename": "src/web-function.ts",
|
|
11247
|
-
"line":
|
|
11284
|
+
"line": 297
|
|
11248
11285
|
},
|
|
11249
11286
|
"name": "addToResourcePolicy",
|
|
11250
11287
|
"overrides": "aws-cdk-lib.aws_iam.IResourceWithPolicyV2",
|
|
@@ -11271,7 +11308,7 @@
|
|
|
11271
11308
|
},
|
|
11272
11309
|
"locationInModule": {
|
|
11273
11310
|
"filename": "src/web-function.ts",
|
|
11274
|
-
"line":
|
|
11311
|
+
"line": 287
|
|
11275
11312
|
},
|
|
11276
11313
|
"name": "grantInvoke",
|
|
11277
11314
|
"overrides": "@ashishpandeyone/cdk-lambda-web-function.IWebFunction",
|
|
@@ -11298,7 +11335,7 @@
|
|
|
11298
11335
|
},
|
|
11299
11336
|
"locationInModule": {
|
|
11300
11337
|
"filename": "src/web-function.ts",
|
|
11301
|
-
"line":
|
|
11338
|
+
"line": 328
|
|
11302
11339
|
},
|
|
11303
11340
|
"name": "metric",
|
|
11304
11341
|
"overrides": "@ashishpandeyone/cdk-lambda-web-function.IWebFunction",
|
|
@@ -11330,7 +11367,7 @@
|
|
|
11330
11367
|
},
|
|
11331
11368
|
"locationInModule": {
|
|
11332
11369
|
"filename": "src/web-function.ts",
|
|
11333
|
-
"line":
|
|
11370
|
+
"line": 343
|
|
11334
11371
|
},
|
|
11335
11372
|
"name": "metricActiveTime",
|
|
11336
11373
|
"overrides": "@ashishpandeyone/cdk-lambda-web-function.IWebFunction",
|
|
@@ -11357,7 +11394,7 @@
|
|
|
11357
11394
|
},
|
|
11358
11395
|
"locationInModule": {
|
|
11359
11396
|
"filename": "src/web-function.ts",
|
|
11360
|
-
"line":
|
|
11397
|
+
"line": 358
|
|
11361
11398
|
},
|
|
11362
11399
|
"name": "metricConcurrentRequests",
|
|
11363
11400
|
"overrides": "@ashishpandeyone/cdk-lambda-web-function.IWebFunction",
|
|
@@ -11383,7 +11420,7 @@
|
|
|
11383
11420
|
},
|
|
11384
11421
|
"locationInModule": {
|
|
11385
11422
|
"filename": "src/web-function.ts",
|
|
11386
|
-
"line":
|
|
11423
|
+
"line": 348
|
|
11387
11424
|
},
|
|
11388
11425
|
"name": "metricCpuTime",
|
|
11389
11426
|
"overrides": "@ashishpandeyone/cdk-lambda-web-function.IWebFunction",
|
|
@@ -11411,7 +11448,7 @@
|
|
|
11411
11448
|
},
|
|
11412
11449
|
"locationInModule": {
|
|
11413
11450
|
"filename": "src/web-function.ts",
|
|
11414
|
-
"line":
|
|
11451
|
+
"line": 367
|
|
11415
11452
|
},
|
|
11416
11453
|
"name": "metricMaxMemoryUsage",
|
|
11417
11454
|
"overrides": "@ashishpandeyone/cdk-lambda-web-function.IWebFunction",
|
|
@@ -11437,7 +11474,7 @@
|
|
|
11437
11474
|
},
|
|
11438
11475
|
"locationInModule": {
|
|
11439
11476
|
"filename": "src/web-function.ts",
|
|
11440
|
-
"line":
|
|
11477
|
+
"line": 372
|
|
11441
11478
|
},
|
|
11442
11479
|
"name": "metricResponseBytes",
|
|
11443
11480
|
"overrides": "@ashishpandeyone/cdk-lambda-web-function.IWebFunction",
|
|
@@ -11468,7 +11505,7 @@
|
|
|
11468
11505
|
"immutable": true,
|
|
11469
11506
|
"locationInModule": {
|
|
11470
11507
|
"filename": "src/web-function.ts",
|
|
11471
|
-
"line":
|
|
11508
|
+
"line": 276
|
|
11472
11509
|
},
|
|
11473
11510
|
"name": "webFunctionArn",
|
|
11474
11511
|
"overrides": "@ashishpandeyone/cdk-lambda-web-function.IWebFunction",
|
|
@@ -11485,7 +11522,7 @@
|
|
|
11485
11522
|
"immutable": true,
|
|
11486
11523
|
"locationInModule": {
|
|
11487
11524
|
"filename": "src/web-function.ts",
|
|
11488
|
-
"line":
|
|
11525
|
+
"line": 275
|
|
11489
11526
|
},
|
|
11490
11527
|
"name": "webFunctionName",
|
|
11491
11528
|
"overrides": "@ashishpandeyone/cdk-lambda-web-function.IWebFunction",
|
|
@@ -11501,7 +11538,7 @@
|
|
|
11501
11538
|
"immutable": true,
|
|
11502
11539
|
"locationInModule": {
|
|
11503
11540
|
"filename": "src/web-function.ts",
|
|
11504
|
-
"line":
|
|
11541
|
+
"line": 279
|
|
11505
11542
|
},
|
|
11506
11543
|
"name": "webFunctionRef",
|
|
11507
11544
|
"overrides": "aws-cdk-lib.interfaces.aws_lambda.IWebFunctionRef",
|
|
@@ -12563,7 +12600,7 @@
|
|
|
12563
12600
|
"kind": "interface",
|
|
12564
12601
|
"locationInModule": {
|
|
12565
12602
|
"filename": "src/web-function.ts",
|
|
12566
|
-
"line":
|
|
12603
|
+
"line": 26
|
|
12567
12604
|
},
|
|
12568
12605
|
"name": "WebFunctionOptions",
|
|
12569
12606
|
"properties": [
|
|
@@ -12576,7 +12613,7 @@
|
|
|
12576
12613
|
"immutable": true,
|
|
12577
12614
|
"locationInModule": {
|
|
12578
12615
|
"filename": "src/web-function.ts",
|
|
12579
|
-
"line":
|
|
12616
|
+
"line": 30
|
|
12580
12617
|
},
|
|
12581
12618
|
"name": "authType",
|
|
12582
12619
|
"type": {
|
|
@@ -12593,7 +12630,7 @@
|
|
|
12593
12630
|
"immutable": true,
|
|
12594
12631
|
"locationInModule": {
|
|
12595
12632
|
"filename": "src/web-function.ts",
|
|
12596
|
-
"line":
|
|
12633
|
+
"line": 119
|
|
12597
12634
|
},
|
|
12598
12635
|
"name": "applicationLogLevelV2",
|
|
12599
12636
|
"optional": true,
|
|
@@ -12611,7 +12648,7 @@
|
|
|
12611
12648
|
"immutable": true,
|
|
12612
12649
|
"locationInModule": {
|
|
12613
12650
|
"filename": "src/web-function.ts",
|
|
12614
|
-
"line":
|
|
12651
|
+
"line": 65
|
|
12615
12652
|
},
|
|
12616
12653
|
"name": "description",
|
|
12617
12654
|
"optional": true,
|
|
@@ -12629,7 +12666,7 @@
|
|
|
12629
12666
|
"immutable": true,
|
|
12630
12667
|
"locationInModule": {
|
|
12631
12668
|
"filename": "src/web-function.ts",
|
|
12632
|
-
"line":
|
|
12669
|
+
"line": 39
|
|
12633
12670
|
},
|
|
12634
12671
|
"name": "endpoint",
|
|
12635
12672
|
"optional": true,
|
|
@@ -12648,7 +12685,7 @@
|
|
|
12648
12685
|
"immutable": true,
|
|
12649
12686
|
"locationInModule": {
|
|
12650
12687
|
"filename": "src/web-function.ts",
|
|
12651
|
-
"line":
|
|
12688
|
+
"line": 82
|
|
12652
12689
|
},
|
|
12653
12690
|
"name": "environment",
|
|
12654
12691
|
"optional": true,
|
|
@@ -12672,7 +12709,7 @@
|
|
|
12672
12709
|
"immutable": true,
|
|
12673
12710
|
"locationInModule": {
|
|
12674
12711
|
"filename": "src/web-function.ts",
|
|
12675
|
-
"line":
|
|
12712
|
+
"line": 112
|
|
12676
12713
|
},
|
|
12677
12714
|
"name": "logRemovalPolicy",
|
|
12678
12715
|
"optional": true,
|
|
@@ -12690,7 +12727,7 @@
|
|
|
12690
12727
|
"immutable": true,
|
|
12691
12728
|
"locationInModule": {
|
|
12692
12729
|
"filename": "src/web-function.ts",
|
|
12693
|
-
"line":
|
|
12730
|
+
"line": 104
|
|
12694
12731
|
},
|
|
12695
12732
|
"name": "logRetention",
|
|
12696
12733
|
"optional": true,
|
|
@@ -12709,7 +12746,7 @@
|
|
|
12709
12746
|
"immutable": true,
|
|
12710
12747
|
"locationInModule": {
|
|
12711
12748
|
"filename": "src/web-function.ts",
|
|
12712
|
-
"line":
|
|
12749
|
+
"line": 97
|
|
12713
12750
|
},
|
|
12714
12751
|
"name": "maxConcurrencyPerEnvironment",
|
|
12715
12752
|
"optional": true,
|
|
@@ -12728,7 +12765,7 @@
|
|
|
12728
12765
|
"immutable": true,
|
|
12729
12766
|
"locationInModule": {
|
|
12730
12767
|
"filename": "src/web-function.ts",
|
|
12731
|
-
"line":
|
|
12768
|
+
"line": 51
|
|
12732
12769
|
},
|
|
12733
12770
|
"name": "revisionRetention",
|
|
12734
12771
|
"optional": true,
|
|
@@ -12747,7 +12784,7 @@
|
|
|
12747
12784
|
"immutable": true,
|
|
12748
12785
|
"locationInModule": {
|
|
12749
12786
|
"filename": "src/web-function.ts",
|
|
12750
|
-
"line":
|
|
12787
|
+
"line": 75
|
|
12751
12788
|
},
|
|
12752
12789
|
"name": "role",
|
|
12753
12790
|
"optional": true,
|
|
@@ -12765,7 +12802,7 @@
|
|
|
12765
12802
|
"immutable": true,
|
|
12766
12803
|
"locationInModule": {
|
|
12767
12804
|
"filename": "src/web-function.ts",
|
|
12768
|
-
"line":
|
|
12805
|
+
"line": 126
|
|
12769
12806
|
},
|
|
12770
12807
|
"name": "systemLogLevelV2",
|
|
12771
12808
|
"optional": true,
|
|
@@ -12783,7 +12820,7 @@
|
|
|
12783
12820
|
"immutable": true,
|
|
12784
12821
|
"locationInModule": {
|
|
12785
12822
|
"filename": "src/web-function.ts",
|
|
12786
|
-
"line":
|
|
12823
|
+
"line": 89
|
|
12787
12824
|
},
|
|
12788
12825
|
"name": "timeout",
|
|
12789
12826
|
"optional": true,
|
|
@@ -12802,7 +12839,7 @@
|
|
|
12802
12839
|
"immutable": true,
|
|
12803
12840
|
"locationInModule": {
|
|
12804
12841
|
"filename": "src/web-function.ts",
|
|
12805
|
-
"line":
|
|
12842
|
+
"line": 58
|
|
12806
12843
|
},
|
|
12807
12844
|
"name": "webFunctionName",
|
|
12808
12845
|
"optional": true,
|
|
@@ -13053,7 +13090,7 @@
|
|
|
13053
13090
|
"kind": "interface",
|
|
13054
13091
|
"locationInModule": {
|
|
13055
13092
|
"filename": "src/web-function.ts",
|
|
13056
|
-
"line":
|
|
13093
|
+
"line": 239
|
|
13057
13094
|
},
|
|
13058
13095
|
"name": "WebFunctionPermission",
|
|
13059
13096
|
"properties": [
|
|
@@ -13067,7 +13104,7 @@
|
|
|
13067
13104
|
"immutable": true,
|
|
13068
13105
|
"locationInModule": {
|
|
13069
13106
|
"filename": "src/web-function.ts",
|
|
13070
|
-
"line":
|
|
13107
|
+
"line": 246
|
|
13071
13108
|
},
|
|
13072
13109
|
"name": "principal",
|
|
13073
13110
|
"type": {
|
|
@@ -13085,7 +13122,7 @@
|
|
|
13085
13122
|
"immutable": true,
|
|
13086
13123
|
"locationInModule": {
|
|
13087
13124
|
"filename": "src/web-function.ts",
|
|
13088
|
-
"line":
|
|
13125
|
+
"line": 253
|
|
13089
13126
|
},
|
|
13090
13127
|
"name": "endpoint",
|
|
13091
13128
|
"optional": true,
|
|
@@ -13103,7 +13140,7 @@
|
|
|
13103
13140
|
"immutable": true,
|
|
13104
13141
|
"locationInModule": {
|
|
13105
13142
|
"filename": "src/web-function.ts",
|
|
13106
|
-
"line":
|
|
13143
|
+
"line": 268
|
|
13107
13144
|
},
|
|
13108
13145
|
"name": "sourceAccount",
|
|
13109
13146
|
"optional": true,
|
|
@@ -13121,7 +13158,7 @@
|
|
|
13121
13158
|
"immutable": true,
|
|
13122
13159
|
"locationInModule": {
|
|
13123
13160
|
"filename": "src/web-function.ts",
|
|
13124
|
-
"line":
|
|
13161
|
+
"line": 261
|
|
13125
13162
|
},
|
|
13126
13163
|
"name": "sourceArn",
|
|
13127
13164
|
"optional": true,
|
|
@@ -13146,7 +13183,7 @@
|
|
|
13146
13183
|
"kind": "interface",
|
|
13147
13184
|
"locationInModule": {
|
|
13148
13185
|
"filename": "src/web-function.ts",
|
|
13149
|
-
"line":
|
|
13186
|
+
"line": 132
|
|
13150
13187
|
},
|
|
13151
13188
|
"name": "WebFunctionProps",
|
|
13152
13189
|
"properties": [
|
|
@@ -13160,7 +13197,7 @@
|
|
|
13160
13197
|
"immutable": true,
|
|
13161
13198
|
"locationInModule": {
|
|
13162
13199
|
"filename": "src/web-function.ts",
|
|
13163
|
-
"line":
|
|
13200
|
+
"line": 144
|
|
13164
13201
|
},
|
|
13165
13202
|
"name": "code",
|
|
13166
13203
|
"type": {
|
|
@@ -13176,7 +13213,7 @@
|
|
|
13176
13213
|
"immutable": true,
|
|
13177
13214
|
"locationInModule": {
|
|
13178
13215
|
"filename": "src/web-function.ts",
|
|
13179
|
-
"line":
|
|
13216
|
+
"line": 136
|
|
13180
13217
|
},
|
|
13181
13218
|
"name": "runtime",
|
|
13182
13219
|
"type": {
|
|
@@ -13193,7 +13230,7 @@
|
|
|
13193
13230
|
"immutable": true,
|
|
13194
13231
|
"locationInModule": {
|
|
13195
13232
|
"filename": "src/web-function.ts",
|
|
13196
|
-
"line":
|
|
13233
|
+
"line": 151
|
|
13197
13234
|
},
|
|
13198
13235
|
"name": "entrypoint",
|
|
13199
13236
|
"optional": true,
|
|
@@ -13525,6 +13562,6 @@
|
|
|
13525
13562
|
"symbolId": "src/web-function-deployment:WebFunctionRollbackOptions"
|
|
13526
13563
|
}
|
|
13527
13564
|
},
|
|
13528
|
-
"version": "0.1.
|
|
13529
|
-
"fingerprint": "
|
|
13565
|
+
"version": "0.1.10",
|
|
13566
|
+
"fingerprint": "jNpRieNrldxUoisjGaK6PE0jlDtSXgs8VYo6J+/40Ao="
|
|
13530
13567
|
}
|