feat: add aws-lambda-edge preset with CDK - #240

Closed
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset
Closed

feat: add aws-lambda-edge preset with CDK#240
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset

Conversation

@WinterYukky

Copy link
Copy Markdown
Contributor

🔗 Linked issue

❓ Type of change

  • 📖 Documentation (updates to the documentation or readme)
  • 🐞 Bug fix (a non-breaking change that fixes an issue)
  • 👌 Enhancement (improving an existing functionality like performance)
  • ✨ New feature (a non-breaking change that adds functionality)
  • ⚠️ Breaking change (fix or feature that would cause existing functionality to change)

📚 Description

Add AWS Lambda@Edge to the preset.

The current aws-lambda preset is not compatible with the Lambda@Edge format and requires users to create their own wrapper for Lambda@Edge. This PR is needed to resolve this issue.
It would also be very powerful if Lambda@Edge were available in Nitro. It will be quite important for projects that require SSR (e.g Nuxt3) as static assets (.output/public) can be retrieved from AWS S3 and the rest (.output/server) can be resolved by Lambda@Edge.

Resolves#79

📝 Checklist

  • I have linked an issue or discussion.
  • I have updated the documentation accordingly.

@mirumirumi

Copy link
Copy Markdown

I support this PR :)

(@WinterYukky You might consider a review request?)

@danielroe
danielroe requested a review from pi0June 11, 2022 08:08
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@mirumirumi Thanks your comment!

Also, thank you @danielroe and @pi0 for reviewing🥰

Comment threaddocs/deploy/providers/aws.md Outdated
The following code is an example of deploying a Nuxt3 project to CloudFront and Lambda@Edge with [AWS CDK](https://github.com/aws/aws-cdk). Using this stack, paths under `_nuxt/` (static assets) will get their data from the S3 origin, and all other paths will be resolved by Lambda@Edge.

```ts
import { spawnSync } from "child_process";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can auto generate this script to the .output. avoiding to hardcode things like public path to the example.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean the app build part? I'd like that. Maybe the output could be an object containing the key locations and configs that can be used for cloud specific deployments (for example configuring the S3 bucket and cloudfront caching):

{
"serverHandler": ".output/server",
"assets": ".output/assets""public": ".output/public"
}

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the review.
This script is not a simple script, it is IaC, so it may be difficult to put it in the .output from a DX perspective.
I think a developer wants more freedom to customize it.

Is the key here that the developer needs to be aware of the public and server paths?

@pi0pi0Jun 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Surely developers can always override to customize. We can export smaller utils even for better flexibility.

Is the key here that the developer needs to be aware of the public and server paths?

Yes. Such things shouldn't be hardcoded into the repository code or docs but auto-generated even considering customization needs.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been considering various use cases and interfaces for the past week, but I think I've been overthinking things a bit.
As @chris-vissermentioned, it might be better to just include the serverDir and publicDir in nitro.json.
What do you think of that idea, @pi0?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the other hand. These settings are easily extracted from the nuxt.config.ts since they are either Nuxt's defaults or set in that config. So maybe its not even needed.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I can agree your thinking @chris-visser. However to find configuration like nuxt.config.ts or nitro.config.ts and more... is a bit difficult for CDK apps.
Also maybe understood @pi0's thinking. His goal would be a Zero-Config Providers. Certainly that is one of the important features so I will try implemantation for auto generate this script to the .output.

@pi0

pi0 commented Jun 23, 2022

Copy link
Copy Markdown
Member

Hi @WinterYukky Thanks for your works on this pull request and sorry review took long.

I will have to try the deployment and probably pushing some improvements to automate as much as possible for sdk use. (Hense self assigned).

@pi0pi0 self-assigned this Jun 23, 2022
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Hi @pi0.
I updated to automatically generate CDK code to the .output. Can you please re-review it?

@ennioVisco

Copy link
Copy Markdown

@danielroe@pi0 I've noticed that there's 2 PR open for aws-lamba-edge

Which one should get merged ?

the other one is newer, although it seems very similar to this one, while this one also has CDK and github action setup, which is very interesting!

@jdevdevdev

Copy link
Copy Markdown

Users deploying through IaC (SST/Terraform/Pulumi/Cloudformation) other than CDK and would find Cloudfront wrapper useful. It would require decoupling it from the CDK deployment.

Possible solutions could be to:

  1. Alter this pr to make CDK deployment optional and keep the Cloudfront handler wrapper.
  2. Create two presets (possibly extend one off the other):
  • aws-lambda-edge
  • aws-lambda-edge-cdk

@HebiliciousHebilicious self-assigned this Jul 1, 2023
@Hebilicious
Hebilicious self-requested a review July 1, 2023 07:15
@HebiliciousHebilicious changed the title feat: add aws-lambda-edge presetfeat: add aws-lambda-edge preset with CDKJul 1, 2023
@HebiliciousHebilicious mentioned this pull request Jul 3, 2023

@HebiliciousHebilicious left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing work @WinterYukky
The documentation added here is incredible, and will be extremely useful for cdk support #1387

@pi0 I believe a good course of action here would be to merge
#1075 over this PR, and use this one as the base for CDK support both in lambda and lambda-edge

headers: normalizeIncomingHeaders(request.headers),
method: request.method,
query: request.querystring,
body: request.body,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

body should be normalized

@WinterYukkyWinterYukkyNov 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threadtest/presets/aws-lambda-edge.test.ts Outdated
]
}
const res: CloudFrontResultResponse = await handler(event)
// responsed CloudFrontHeaders are special, so modify them for testing.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

Comment threadsrc/presets/aws-lambda-edge.ts Outdated

export const awsLambdaEdge = defineNitroPreset({
entry: "#internal/nitro/entries/aws-lambda-edge",
externals: true,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can't be a boolean

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was unnecessary property so remove it.

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
await writeFile(
resolve(cdkDir, "cdk.json"),
JSON.stringify({
app: "npx ts-node --prefer-ts-exts bin/nitro-lambda-edge.ts",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could use jiti instead of ts-node here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't know jiti before I had recieve this comment! Thank you!!

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
this,
"EdgeFunction",
{
runtime: lambda.Runtime.NODEJS_16_X,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should use NODEJS_18_X

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Thanks for your reviewing @Hebilicious.
I'm busy this week, so I'll fix this PR next week in line with your comments 😉.

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@Hebilicious Thanks your reviewing!!
I fixed lined by your comment. However I'm not understand your strategy about to merge two PRs. Should I merge to this PR from #1075?

AlbertSabate pushed a commit to AlbertSabate/nitro that referenced this pull request Dec 23, 2023
@pi0
pi0 marked this pull request as draft February 27, 2024 17:14
@pi0pi0 mentioned this pull request Jan 7, 2025
@pi0
pi0 deleted the branch nitrojs:mainMarch 18, 2025 12:36
@pi0pi0 closed this Mar 18, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

aws lambda-edge

11 participants

@WinterYukky@mirumirumi@pi0@anjali89r@danielroe@galaxy79@ennioVisco@Hebilicious@jdevdevdev@chris-visser@cyrilcolinet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: add aws-lambda-edge preset with CDK - #240

Closed
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset
Closed

feat: add aws-lambda-edge preset with CDK#240
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset

Conversation

@WinterYukky

Copy link
Copy Markdown
Contributor

🔗 Linked issue

❓ Type of change

  • 📖 Documentation (updates to the documentation or readme)
  • 🐞 Bug fix (a non-breaking change that fixes an issue)
  • 👌 Enhancement (improving an existing functionality like performance)
  • ✨ New feature (a non-breaking change that adds functionality)
  • ⚠️ Breaking change (fix or feature that would cause existing functionality to change)

📚 Description

Add AWS Lambda@Edge to the preset.

The current aws-lambda preset is not compatible with the Lambda@Edge format and requires users to create their own wrapper for Lambda@Edge. This PR is needed to resolve this issue.
It would also be very powerful if Lambda@Edge were available in Nitro. It will be quite important for projects that require SSR (e.g Nuxt3) as static assets (.output/public) can be retrieved from AWS S3 and the rest (.output/server) can be resolved by Lambda@Edge.

Resolves#79

📝 Checklist

  • I have linked an issue or discussion.
  • I have updated the documentation accordingly.

@mirumirumi

Copy link
Copy Markdown

I support this PR :)

(@WinterYukky You might consider a review request?)

@danielroe
danielroe requested a review from pi0June 11, 2022 08:08
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@mirumirumi Thanks your comment!

Also, thank you @danielroe and @pi0 for reviewing🥰

Comment threaddocs/deploy/providers/aws.md Outdated
The following code is an example of deploying a Nuxt3 project to CloudFront and Lambda@Edge with [AWS CDK](https://github.com/aws/aws-cdk). Using this stack, paths under `_nuxt/` (static assets) will get their data from the S3 origin, and all other paths will be resolved by Lambda@Edge.

```ts
import { spawnSync } from "child_process";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can auto generate this script to the .output. avoiding to hardcode things like public path to the example.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean the app build part? I'd like that. Maybe the output could be an object containing the key locations and configs that can be used for cloud specific deployments (for example configuring the S3 bucket and cloudfront caching):

{
"serverHandler": ".output/server",
"assets": ".output/assets""public": ".output/public"
}

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the review.
This script is not a simple script, it is IaC, so it may be difficult to put it in the .output from a DX perspective.
I think a developer wants more freedom to customize it.

Is the key here that the developer needs to be aware of the public and server paths?

@pi0pi0Jun 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Surely developers can always override to customize. We can export smaller utils even for better flexibility.

Is the key here that the developer needs to be aware of the public and server paths?

Yes. Such things shouldn't be hardcoded into the repository code or docs but auto-generated even considering customization needs.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been considering various use cases and interfaces for the past week, but I think I've been overthinking things a bit.
As @chris-vissermentioned, it might be better to just include the serverDir and publicDir in nitro.json.
What do you think of that idea, @pi0?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the other hand. These settings are easily extracted from the nuxt.config.ts since they are either Nuxt's defaults or set in that config. So maybe its not even needed.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I can agree your thinking @chris-visser. However to find configuration like nuxt.config.ts or nitro.config.ts and more... is a bit difficult for CDK apps.
Also maybe understood @pi0's thinking. His goal would be a Zero-Config Providers. Certainly that is one of the important features so I will try implemantation for auto generate this script to the .output.

@pi0

pi0 commented Jun 23, 2022

Copy link
Copy Markdown
Member

Hi @WinterYukky Thanks for your works on this pull request and sorry review took long.

I will have to try the deployment and probably pushing some improvements to automate as much as possible for sdk use. (Hense self assigned).

@pi0pi0 self-assigned this Jun 23, 2022
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Hi @pi0.
I updated to automatically generate CDK code to the .output. Can you please re-review it?

@ennioVisco

Copy link
Copy Markdown

@danielroe@pi0 I've noticed that there's 2 PR open for aws-lamba-edge

Which one should get merged ?

the other one is newer, although it seems very similar to this one, while this one also has CDK and github action setup, which is very interesting!

@jdevdevdev

Copy link
Copy Markdown

Users deploying through IaC (SST/Terraform/Pulumi/Cloudformation) other than CDK and would find Cloudfront wrapper useful. It would require decoupling it from the CDK deployment.

Possible solutions could be to:

  1. Alter this pr to make CDK deployment optional and keep the Cloudfront handler wrapper.
  2. Create two presets (possibly extend one off the other):
  • aws-lambda-edge
  • aws-lambda-edge-cdk

@HebiliciousHebilicious self-assigned this Jul 1, 2023
@Hebilicious
Hebilicious self-requested a review July 1, 2023 07:15
@HebiliciousHebilicious changed the title feat: add aws-lambda-edge presetfeat: add aws-lambda-edge preset with CDKJul 1, 2023
@HebiliciousHebilicious mentioned this pull request Jul 3, 2023

@HebiliciousHebilicious left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing work @WinterYukky
The documentation added here is incredible, and will be extremely useful for cdk support #1387

@pi0 I believe a good course of action here would be to merge
#1075 over this PR, and use this one as the base for CDK support both in lambda and lambda-edge

headers: normalizeIncomingHeaders(request.headers),
method: request.method,
query: request.querystring,
body: request.body,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

body should be normalized

@WinterYukkyWinterYukkyNov 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threadtest/presets/aws-lambda-edge.test.ts Outdated
]
}
const res: CloudFrontResultResponse = await handler(event)
// responsed CloudFrontHeaders are special, so modify them for testing.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

Comment threadsrc/presets/aws-lambda-edge.ts Outdated

export const awsLambdaEdge = defineNitroPreset({
entry: "#internal/nitro/entries/aws-lambda-edge",
externals: true,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can't be a boolean

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was unnecessary property so remove it.

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
await writeFile(
resolve(cdkDir, "cdk.json"),
JSON.stringify({
app: "npx ts-node --prefer-ts-exts bin/nitro-lambda-edge.ts",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could use jiti instead of ts-node here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't know jiti before I had recieve this comment! Thank you!!

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
this,
"EdgeFunction",
{
runtime: lambda.Runtime.NODEJS_16_X,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should use NODEJS_18_X

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Thanks for your reviewing @Hebilicious.
I'm busy this week, so I'll fix this PR next week in line with your comments 😉.

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@Hebilicious Thanks your reviewing!!
I fixed lined by your comment. However I'm not understand your strategy about to merge two PRs. Should I merge to this PR from #1075?

AlbertSabate pushed a commit to AlbertSabate/nitro that referenced this pull request Dec 23, 2023
@pi0
pi0 marked this pull request as draft February 27, 2024 17:14
@pi0pi0 mentioned this pull request Jan 7, 2025
@pi0
pi0 deleted the branch nitrojs:mainMarch 18, 2025 12:36
@pi0pi0 closed this Mar 18, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

aws lambda-edge

11 participants

@WinterYukky@mirumirumi@pi0@anjali89r@danielroe@galaxy79@ennioVisco@Hebilicious@jdevdevdev@chris-visser@cyrilcolinet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add aws-lambda-edge preset with CDK - #240

Closed
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset
Closed

feat: add aws-lambda-edge preset with CDK#240
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset

Conversation

@WinterYukky

Copy link
Copy Markdown
Contributor

🔗 Linked issue

❓ Type of change

  • 📖 Documentation (updates to the documentation or readme)
  • 🐞 Bug fix (a non-breaking change that fixes an issue)
  • 👌 Enhancement (improving an existing functionality like performance)
  • ✨ New feature (a non-breaking change that adds functionality)
  • ⚠️ Breaking change (fix or feature that would cause existing functionality to change)

📚 Description

Add AWS Lambda@Edge to the preset.

The current aws-lambda preset is not compatible with the Lambda@Edge format and requires users to create their own wrapper for Lambda@Edge. This PR is needed to resolve this issue.
It would also be very powerful if Lambda@Edge were available in Nitro. It will be quite important for projects that require SSR (e.g Nuxt3) as static assets (.output/public) can be retrieved from AWS S3 and the rest (.output/server) can be resolved by Lambda@Edge.

Resolves#79

📝 Checklist

  • I have linked an issue or discussion.
  • I have updated the documentation accordingly.

@mirumirumi

Copy link
Copy Markdown

I support this PR :)

(@WinterYukky You might consider a review request?)

@danielroe
danielroe requested a review from pi0June 11, 2022 08:08
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@mirumirumi Thanks your comment!

Also, thank you @danielroe and @pi0 for reviewing🥰

Comment threaddocs/deploy/providers/aws.md Outdated
The following code is an example of deploying a Nuxt3 project to CloudFront and Lambda@Edge with [AWS CDK](https://github.com/aws/aws-cdk). Using this stack, paths under `_nuxt/` (static assets) will get their data from the S3 origin, and all other paths will be resolved by Lambda@Edge.

```ts
import { spawnSync } from "child_process";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can auto generate this script to the .output. avoiding to hardcode things like public path to the example.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean the app build part? I'd like that. Maybe the output could be an object containing the key locations and configs that can be used for cloud specific deployments (for example configuring the S3 bucket and cloudfront caching):

{
"serverHandler": ".output/server",
"assets": ".output/assets""public": ".output/public"
}

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the review.
This script is not a simple script, it is IaC, so it may be difficult to put it in the .output from a DX perspective.
I think a developer wants more freedom to customize it.

Is the key here that the developer needs to be aware of the public and server paths?

@pi0pi0Jun 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Surely developers can always override to customize. We can export smaller utils even for better flexibility.

Is the key here that the developer needs to be aware of the public and server paths?

Yes. Such things shouldn't be hardcoded into the repository code or docs but auto-generated even considering customization needs.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been considering various use cases and interfaces for the past week, but I think I've been overthinking things a bit.
As @chris-vissermentioned, it might be better to just include the serverDir and publicDir in nitro.json.
What do you think of that idea, @pi0?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the other hand. These settings are easily extracted from the nuxt.config.ts since they are either Nuxt's defaults or set in that config. So maybe its not even needed.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I can agree your thinking @chris-visser. However to find configuration like nuxt.config.ts or nitro.config.ts and more... is a bit difficult for CDK apps.
Also maybe understood @pi0's thinking. His goal would be a Zero-Config Providers. Certainly that is one of the important features so I will try implemantation for auto generate this script to the .output.

@pi0

pi0 commented Jun 23, 2022

Copy link
Copy Markdown
Member

Hi @WinterYukky Thanks for your works on this pull request and sorry review took long.

I will have to try the deployment and probably pushing some improvements to automate as much as possible for sdk use. (Hense self assigned).

@pi0pi0 self-assigned this Jun 23, 2022
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Hi @pi0.
I updated to automatically generate CDK code to the .output. Can you please re-review it?

@ennioVisco

Copy link
Copy Markdown

@danielroe@pi0 I've noticed that there's 2 PR open for aws-lamba-edge

Which one should get merged ?

the other one is newer, although it seems very similar to this one, while this one also has CDK and github action setup, which is very interesting!

@jdevdevdev

Copy link
Copy Markdown

Users deploying through IaC (SST/Terraform/Pulumi/Cloudformation) other than CDK and would find Cloudfront wrapper useful. It would require decoupling it from the CDK deployment.

Possible solutions could be to:

  1. Alter this pr to make CDK deployment optional and keep the Cloudfront handler wrapper.
  2. Create two presets (possibly extend one off the other):
  • aws-lambda-edge
  • aws-lambda-edge-cdk

@HebiliciousHebilicious self-assigned this Jul 1, 2023
@Hebilicious
Hebilicious self-requested a review July 1, 2023 07:15
@HebiliciousHebilicious changed the title feat: add aws-lambda-edge presetfeat: add aws-lambda-edge preset with CDKJul 1, 2023
@HebiliciousHebilicious mentioned this pull request Jul 3, 2023

@HebiliciousHebilicious left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing work @WinterYukky
The documentation added here is incredible, and will be extremely useful for cdk support #1387

@pi0 I believe a good course of action here would be to merge
#1075 over this PR, and use this one as the base for CDK support both in lambda and lambda-edge

headers: normalizeIncomingHeaders(request.headers),
method: request.method,
query: request.querystring,
body: request.body,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

body should be normalized

@WinterYukkyWinterYukkyNov 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threadtest/presets/aws-lambda-edge.test.ts Outdated
]
}
const res: CloudFrontResultResponse = await handler(event)
// responsed CloudFrontHeaders are special, so modify them for testing.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

Comment threadsrc/presets/aws-lambda-edge.ts Outdated

export const awsLambdaEdge = defineNitroPreset({
entry: "#internal/nitro/entries/aws-lambda-edge",
externals: true,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can't be a boolean

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was unnecessary property so remove it.

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
await writeFile(
resolve(cdkDir, "cdk.json"),
JSON.stringify({
app: "npx ts-node --prefer-ts-exts bin/nitro-lambda-edge.ts",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could use jiti instead of ts-node here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't know jiti before I had recieve this comment! Thank you!!

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
this,
"EdgeFunction",
{
runtime: lambda.Runtime.NODEJS_16_X,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should use NODEJS_18_X

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Thanks for your reviewing @Hebilicious.
I'm busy this week, so I'll fix this PR next week in line with your comments 😉.

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@Hebilicious Thanks your reviewing!!
I fixed lined by your comment. However I'm not understand your strategy about to merge two PRs. Should I merge to this PR from #1075?

AlbertSabate pushed a commit to AlbertSabate/nitro that referenced this pull request Dec 23, 2023
@pi0
pi0 marked this pull request as draft February 27, 2024 17:14
@pi0pi0 mentioned this pull request Jan 7, 2025
@pi0
pi0 deleted the branch nitrojs:mainMarch 18, 2025 12:36
@pi0pi0 closed this Mar 18, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

aws lambda-edge

11 participants

@WinterYukky@mirumirumi@pi0@anjali89r@danielroe@galaxy79@ennioVisco@Hebilicious@jdevdevdev@chris-visser@cyrilcolinet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add aws-lambda-edge preset with CDK - #240

Closed
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset
Closed

feat: add aws-lambda-edge preset with CDK#240
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset

Conversation

@WinterYukky

Copy link
Copy Markdown
Contributor

🔗 Linked issue

❓ Type of change

  • 📖 Documentation (updates to the documentation or readme)
  • 🐞 Bug fix (a non-breaking change that fixes an issue)
  • 👌 Enhancement (improving an existing functionality like performance)
  • ✨ New feature (a non-breaking change that adds functionality)
  • ⚠️ Breaking change (fix or feature that would cause existing functionality to change)

📚 Description

Add AWS Lambda@Edge to the preset.

The current aws-lambda preset is not compatible with the Lambda@Edge format and requires users to create their own wrapper for Lambda@Edge. This PR is needed to resolve this issue.
It would also be very powerful if Lambda@Edge were available in Nitro. It will be quite important for projects that require SSR (e.g Nuxt3) as static assets (.output/public) can be retrieved from AWS S3 and the rest (.output/server) can be resolved by Lambda@Edge.

Resolves#79

📝 Checklist

  • I have linked an issue or discussion.
  • I have updated the documentation accordingly.

@mirumirumi

Copy link
Copy Markdown

I support this PR :)

(@WinterYukky You might consider a review request?)

@danielroe
danielroe requested a review from pi0June 11, 2022 08:08
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@mirumirumi Thanks your comment!

Also, thank you @danielroe and @pi0 for reviewing🥰

Comment threaddocs/deploy/providers/aws.md Outdated
The following code is an example of deploying a Nuxt3 project to CloudFront and Lambda@Edge with [AWS CDK](https://github.com/aws/aws-cdk). Using this stack, paths under `_nuxt/` (static assets) will get their data from the S3 origin, and all other paths will be resolved by Lambda@Edge.

```ts
import { spawnSync } from "child_process";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can auto generate this script to the .output. avoiding to hardcode things like public path to the example.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean the app build part? I'd like that. Maybe the output could be an object containing the key locations and configs that can be used for cloud specific deployments (for example configuring the S3 bucket and cloudfront caching):

{
"serverHandler": ".output/server",
"assets": ".output/assets""public": ".output/public"
}

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the review.
This script is not a simple script, it is IaC, so it may be difficult to put it in the .output from a DX perspective.
I think a developer wants more freedom to customize it.

Is the key here that the developer needs to be aware of the public and server paths?

@pi0pi0Jun 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Surely developers can always override to customize. We can export smaller utils even for better flexibility.

Is the key here that the developer needs to be aware of the public and server paths?

Yes. Such things shouldn't be hardcoded into the repository code or docs but auto-generated even considering customization needs.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been considering various use cases and interfaces for the past week, but I think I've been overthinking things a bit.
As @chris-vissermentioned, it might be better to just include the serverDir and publicDir in nitro.json.
What do you think of that idea, @pi0?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the other hand. These settings are easily extracted from the nuxt.config.ts since they are either Nuxt's defaults or set in that config. So maybe its not even needed.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I can agree your thinking @chris-visser. However to find configuration like nuxt.config.ts or nitro.config.ts and more... is a bit difficult for CDK apps.
Also maybe understood @pi0's thinking. His goal would be a Zero-Config Providers. Certainly that is one of the important features so I will try implemantation for auto generate this script to the .output.

@pi0

pi0 commented Jun 23, 2022

Copy link
Copy Markdown
Member

Hi @WinterYukky Thanks for your works on this pull request and sorry review took long.

I will have to try the deployment and probably pushing some improvements to automate as much as possible for sdk use. (Hense self assigned).

@pi0pi0 self-assigned this Jun 23, 2022
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Hi @pi0.
I updated to automatically generate CDK code to the .output. Can you please re-review it?

@ennioVisco

Copy link
Copy Markdown

@danielroe@pi0 I've noticed that there's 2 PR open for aws-lamba-edge

Which one should get merged ?

the other one is newer, although it seems very similar to this one, while this one also has CDK and github action setup, which is very interesting!

@jdevdevdev

Copy link
Copy Markdown

Users deploying through IaC (SST/Terraform/Pulumi/Cloudformation) other than CDK and would find Cloudfront wrapper useful. It would require decoupling it from the CDK deployment.

Possible solutions could be to:

  1. Alter this pr to make CDK deployment optional and keep the Cloudfront handler wrapper.
  2. Create two presets (possibly extend one off the other):
  • aws-lambda-edge
  • aws-lambda-edge-cdk

@HebiliciousHebilicious self-assigned this Jul 1, 2023
@Hebilicious
Hebilicious self-requested a review July 1, 2023 07:15
@HebiliciousHebilicious changed the title feat: add aws-lambda-edge presetfeat: add aws-lambda-edge preset with CDKJul 1, 2023
@HebiliciousHebilicious mentioned this pull request Jul 3, 2023

@HebiliciousHebilicious left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing work @WinterYukky
The documentation added here is incredible, and will be extremely useful for cdk support #1387

@pi0 I believe a good course of action here would be to merge
#1075 over this PR, and use this one as the base for CDK support both in lambda and lambda-edge

headers: normalizeIncomingHeaders(request.headers),
method: request.method,
query: request.querystring,
body: request.body,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

body should be normalized

@WinterYukkyWinterYukkyNov 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threadtest/presets/aws-lambda-edge.test.ts Outdated
]
}
const res: CloudFrontResultResponse = await handler(event)
// responsed CloudFrontHeaders are special, so modify them for testing.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

Comment threadsrc/presets/aws-lambda-edge.ts Outdated

export const awsLambdaEdge = defineNitroPreset({
entry: "#internal/nitro/entries/aws-lambda-edge",
externals: true,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can't be a boolean

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was unnecessary property so remove it.

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
await writeFile(
resolve(cdkDir, "cdk.json"),
JSON.stringify({
app: "npx ts-node --prefer-ts-exts bin/nitro-lambda-edge.ts",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could use jiti instead of ts-node here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't know jiti before I had recieve this comment! Thank you!!

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
this,
"EdgeFunction",
{
runtime: lambda.Runtime.NODEJS_16_X,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should use NODEJS_18_X

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Thanks for your reviewing @Hebilicious.
I'm busy this week, so I'll fix this PR next week in line with your comments 😉.

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@Hebilicious Thanks your reviewing!!
I fixed lined by your comment. However I'm not understand your strategy about to merge two PRs. Should I merge to this PR from #1075?

AlbertSabate pushed a commit to AlbertSabate/nitro that referenced this pull request Dec 23, 2023
@pi0
pi0 marked this pull request as draft February 27, 2024 17:14
@pi0pi0 mentioned this pull request Jan 7, 2025
@pi0
pi0 deleted the branch nitrojs:mainMarch 18, 2025 12:36
@pi0pi0 closed this Mar 18, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

aws lambda-edge

11 participants

@WinterYukky@mirumirumi@pi0@anjali89r@danielroe@galaxy79@ennioVisco@Hebilicious@jdevdevdev@chris-visser@cyrilcolinet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: add aws-lambda-edge preset with CDK - #240

Closed
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset
Closed

feat: add aws-lambda-edge preset with CDK#240
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset

Conversation

@WinterYukky

Copy link
Copy Markdown
Contributor

🔗 Linked issue

❓ Type of change

  • 📖 Documentation (updates to the documentation or readme)
  • 🐞 Bug fix (a non-breaking change that fixes an issue)
  • 👌 Enhancement (improving an existing functionality like performance)
  • ✨ New feature (a non-breaking change that adds functionality)
  • ⚠️ Breaking change (fix or feature that would cause existing functionality to change)

📚 Description

Add AWS Lambda@Edge to the preset.

The current aws-lambda preset is not compatible with the Lambda@Edge format and requires users to create their own wrapper for Lambda@Edge. This PR is needed to resolve this issue.
It would also be very powerful if Lambda@Edge were available in Nitro. It will be quite important for projects that require SSR (e.g Nuxt3) as static assets (.output/public) can be retrieved from AWS S3 and the rest (.output/server) can be resolved by Lambda@Edge.

Resolves#79

📝 Checklist

  • I have linked an issue or discussion.
  • I have updated the documentation accordingly.

@mirumirumi

Copy link
Copy Markdown

I support this PR :)

(@WinterYukky You might consider a review request?)

@danielroe
danielroe requested a review from pi0June 11, 2022 08:08
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@mirumirumi Thanks your comment!

Also, thank you @danielroe and @pi0 for reviewing🥰

Comment threaddocs/deploy/providers/aws.md Outdated
The following code is an example of deploying a Nuxt3 project to CloudFront and Lambda@Edge with [AWS CDK](https://github.com/aws/aws-cdk). Using this stack, paths under `_nuxt/` (static assets) will get their data from the S3 origin, and all other paths will be resolved by Lambda@Edge.

```ts
import { spawnSync } from "child_process";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can auto generate this script to the .output. avoiding to hardcode things like public path to the example.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean the app build part? I'd like that. Maybe the output could be an object containing the key locations and configs that can be used for cloud specific deployments (for example configuring the S3 bucket and cloudfront caching):

{
"serverHandler": ".output/server",
"assets": ".output/assets""public": ".output/public"
}

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the review.
This script is not a simple script, it is IaC, so it may be difficult to put it in the .output from a DX perspective.
I think a developer wants more freedom to customize it.

Is the key here that the developer needs to be aware of the public and server paths?

@pi0pi0Jun 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Surely developers can always override to customize. We can export smaller utils even for better flexibility.

Is the key here that the developer needs to be aware of the public and server paths?

Yes. Such things shouldn't be hardcoded into the repository code or docs but auto-generated even considering customization needs.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been considering various use cases and interfaces for the past week, but I think I've been overthinking things a bit.
As @chris-vissermentioned, it might be better to just include the serverDir and publicDir in nitro.json.
What do you think of that idea, @pi0?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the other hand. These settings are easily extracted from the nuxt.config.ts since they are either Nuxt's defaults or set in that config. So maybe its not even needed.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I can agree your thinking @chris-visser. However to find configuration like nuxt.config.ts or nitro.config.ts and more... is a bit difficult for CDK apps.
Also maybe understood @pi0's thinking. His goal would be a Zero-Config Providers. Certainly that is one of the important features so I will try implemantation for auto generate this script to the .output.

@pi0

pi0 commented Jun 23, 2022

Copy link
Copy Markdown
Member

Hi @WinterYukky Thanks for your works on this pull request and sorry review took long.

I will have to try the deployment and probably pushing some improvements to automate as much as possible for sdk use. (Hense self assigned).

@pi0pi0 self-assigned this Jun 23, 2022
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Hi @pi0.
I updated to automatically generate CDK code to the .output. Can you please re-review it?

@ennioVisco

Copy link
Copy Markdown

@danielroe@pi0 I've noticed that there's 2 PR open for aws-lamba-edge

Which one should get merged ?

the other one is newer, although it seems very similar to this one, while this one also has CDK and github action setup, which is very interesting!

@jdevdevdev

Copy link
Copy Markdown

Users deploying through IaC (SST/Terraform/Pulumi/Cloudformation) other than CDK and would find Cloudfront wrapper useful. It would require decoupling it from the CDK deployment.

Possible solutions could be to:

  1. Alter this pr to make CDK deployment optional and keep the Cloudfront handler wrapper.
  2. Create two presets (possibly extend one off the other):
  • aws-lambda-edge
  • aws-lambda-edge-cdk

@HebiliciousHebilicious self-assigned this Jul 1, 2023
@Hebilicious
Hebilicious self-requested a review July 1, 2023 07:15
@HebiliciousHebilicious changed the title feat: add aws-lambda-edge presetfeat: add aws-lambda-edge preset with CDKJul 1, 2023
@HebiliciousHebilicious mentioned this pull request Jul 3, 2023

@HebiliciousHebilicious left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing work @WinterYukky
The documentation added here is incredible, and will be extremely useful for cdk support #1387

@pi0 I believe a good course of action here would be to merge
#1075 over this PR, and use this one as the base for CDK support both in lambda and lambda-edge

headers: normalizeIncomingHeaders(request.headers),
method: request.method,
query: request.querystring,
body: request.body,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

body should be normalized

@WinterYukkyWinterYukkyNov 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threadtest/presets/aws-lambda-edge.test.ts Outdated
]
}
const res: CloudFrontResultResponse = await handler(event)
// responsed CloudFrontHeaders are special, so modify them for testing.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

Comment threadsrc/presets/aws-lambda-edge.ts Outdated

export const awsLambdaEdge = defineNitroPreset({
entry: "#internal/nitro/entries/aws-lambda-edge",
externals: true,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can't be a boolean

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was unnecessary property so remove it.

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
await writeFile(
resolve(cdkDir, "cdk.json"),
JSON.stringify({
app: "npx ts-node --prefer-ts-exts bin/nitro-lambda-edge.ts",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could use jiti instead of ts-node here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't know jiti before I had recieve this comment! Thank you!!

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
this,
"EdgeFunction",
{
runtime: lambda.Runtime.NODEJS_16_X,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should use NODEJS_18_X

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Thanks for your reviewing @Hebilicious.
I'm busy this week, so I'll fix this PR next week in line with your comments 😉.

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@Hebilicious Thanks your reviewing!!
I fixed lined by your comment. However I'm not understand your strategy about to merge two PRs. Should I merge to this PR from #1075?

AlbertSabate pushed a commit to AlbertSabate/nitro that referenced this pull request Dec 23, 2023
@pi0
pi0 marked this pull request as draft February 27, 2024 17:14
@pi0pi0 mentioned this pull request Jan 7, 2025
@pi0
pi0 deleted the branch nitrojs:mainMarch 18, 2025 12:36
@pi0pi0 closed this Mar 18, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

aws lambda-edge

11 participants

@WinterYukky@mirumirumi@pi0@anjali89r@danielroe@galaxy79@ennioVisco@Hebilicious@jdevdevdev@chris-visser@cyrilcolinet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add aws-lambda-edge preset with CDK - #240

Closed
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset
Closed

feat: add aws-lambda-edge preset with CDK#240
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset

Conversation

@WinterYukky

Copy link
Copy Markdown
Contributor

🔗 Linked issue

❓ Type of change

  • 📖 Documentation (updates to the documentation or readme)
  • 🐞 Bug fix (a non-breaking change that fixes an issue)
  • 👌 Enhancement (improving an existing functionality like performance)
  • ✨ New feature (a non-breaking change that adds functionality)
  • ⚠️ Breaking change (fix or feature that would cause existing functionality to change)

📚 Description

Add AWS Lambda@Edge to the preset.

The current aws-lambda preset is not compatible with the Lambda@Edge format and requires users to create their own wrapper for Lambda@Edge. This PR is needed to resolve this issue.
It would also be very powerful if Lambda@Edge were available in Nitro. It will be quite important for projects that require SSR (e.g Nuxt3) as static assets (.output/public) can be retrieved from AWS S3 and the rest (.output/server) can be resolved by Lambda@Edge.

Resolves#79

📝 Checklist

  • I have linked an issue or discussion.
  • I have updated the documentation accordingly.

@mirumirumi

Copy link
Copy Markdown

I support this PR :)

(@WinterYukky You might consider a review request?)

@danielroe
danielroe requested a review from pi0June 11, 2022 08:08
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@mirumirumi Thanks your comment!

Also, thank you @danielroe and @pi0 for reviewing🥰

Comment threaddocs/deploy/providers/aws.md Outdated
The following code is an example of deploying a Nuxt3 project to CloudFront and Lambda@Edge with [AWS CDK](https://github.com/aws/aws-cdk). Using this stack, paths under `_nuxt/` (static assets) will get their data from the S3 origin, and all other paths will be resolved by Lambda@Edge.

```ts
import { spawnSync } from "child_process";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can auto generate this script to the .output. avoiding to hardcode things like public path to the example.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean the app build part? I'd like that. Maybe the output could be an object containing the key locations and configs that can be used for cloud specific deployments (for example configuring the S3 bucket and cloudfront caching):

{
"serverHandler": ".output/server",
"assets": ".output/assets""public": ".output/public"
}

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the review.
This script is not a simple script, it is IaC, so it may be difficult to put it in the .output from a DX perspective.
I think a developer wants more freedom to customize it.

Is the key here that the developer needs to be aware of the public and server paths?

@pi0pi0Jun 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Surely developers can always override to customize. We can export smaller utils even for better flexibility.

Is the key here that the developer needs to be aware of the public and server paths?

Yes. Such things shouldn't be hardcoded into the repository code or docs but auto-generated even considering customization needs.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been considering various use cases and interfaces for the past week, but I think I've been overthinking things a bit.
As @chris-vissermentioned, it might be better to just include the serverDir and publicDir in nitro.json.
What do you think of that idea, @pi0?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the other hand. These settings are easily extracted from the nuxt.config.ts since they are either Nuxt's defaults or set in that config. So maybe its not even needed.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I can agree your thinking @chris-visser. However to find configuration like nuxt.config.ts or nitro.config.ts and more... is a bit difficult for CDK apps.
Also maybe understood @pi0's thinking. His goal would be a Zero-Config Providers. Certainly that is one of the important features so I will try implemantation for auto generate this script to the .output.

@pi0

pi0 commented Jun 23, 2022

Copy link
Copy Markdown
Member

Hi @WinterYukky Thanks for your works on this pull request and sorry review took long.

I will have to try the deployment and probably pushing some improvements to automate as much as possible for sdk use. (Hense self assigned).

@pi0pi0 self-assigned this Jun 23, 2022
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Hi @pi0.
I updated to automatically generate CDK code to the .output. Can you please re-review it?

@ennioVisco

Copy link
Copy Markdown

@danielroe@pi0 I've noticed that there's 2 PR open for aws-lamba-edge

Which one should get merged ?

the other one is newer, although it seems very similar to this one, while this one also has CDK and github action setup, which is very interesting!

@jdevdevdev

Copy link
Copy Markdown

Users deploying through IaC (SST/Terraform/Pulumi/Cloudformation) other than CDK and would find Cloudfront wrapper useful. It would require decoupling it from the CDK deployment.

Possible solutions could be to:

  1. Alter this pr to make CDK deployment optional and keep the Cloudfront handler wrapper.
  2. Create two presets (possibly extend one off the other):
  • aws-lambda-edge
  • aws-lambda-edge-cdk

@HebiliciousHebilicious self-assigned this Jul 1, 2023
@Hebilicious
Hebilicious self-requested a review July 1, 2023 07:15
@HebiliciousHebilicious changed the title feat: add aws-lambda-edge presetfeat: add aws-lambda-edge preset with CDKJul 1, 2023
@HebiliciousHebilicious mentioned this pull request Jul 3, 2023

@HebiliciousHebilicious left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing work @WinterYukky
The documentation added here is incredible, and will be extremely useful for cdk support #1387

@pi0 I believe a good course of action here would be to merge
#1075 over this PR, and use this one as the base for CDK support both in lambda and lambda-edge

headers: normalizeIncomingHeaders(request.headers),
method: request.method,
query: request.querystring,
body: request.body,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

body should be normalized

@WinterYukkyWinterYukkyNov 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threadtest/presets/aws-lambda-edge.test.ts Outdated
]
}
const res: CloudFrontResultResponse = await handler(event)
// responsed CloudFrontHeaders are special, so modify them for testing.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

Comment threadsrc/presets/aws-lambda-edge.ts Outdated

export const awsLambdaEdge = defineNitroPreset({
entry: "#internal/nitro/entries/aws-lambda-edge",
externals: true,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can't be a boolean

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was unnecessary property so remove it.

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
await writeFile(
resolve(cdkDir, "cdk.json"),
JSON.stringify({
app: "npx ts-node --prefer-ts-exts bin/nitro-lambda-edge.ts",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could use jiti instead of ts-node here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't know jiti before I had recieve this comment! Thank you!!

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
this,
"EdgeFunction",
{
runtime: lambda.Runtime.NODEJS_16_X,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should use NODEJS_18_X

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Thanks for your reviewing @Hebilicious.
I'm busy this week, so I'll fix this PR next week in line with your comments 😉.

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@Hebilicious Thanks your reviewing!!
I fixed lined by your comment. However I'm not understand your strategy about to merge two PRs. Should I merge to this PR from #1075?

AlbertSabate pushed a commit to AlbertSabate/nitro that referenced this pull request Dec 23, 2023
@pi0
pi0 marked this pull request as draft February 27, 2024 17:14
@pi0pi0 mentioned this pull request Jan 7, 2025
@pi0
pi0 deleted the branch nitrojs:mainMarch 18, 2025 12:36
@pi0pi0 closed this Mar 18, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

aws lambda-edge

11 participants

@WinterYukky@mirumirumi@pi0@anjali89r@danielroe@galaxy79@ennioVisco@Hebilicious@jdevdevdev@chris-visser@cyrilcolinet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add aws-lambda-edge preset with CDK - #240

Closed
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset
Closed

feat: add aws-lambda-edge preset with CDK#240
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset

Conversation

@WinterYukky

Copy link
Copy Markdown
Contributor

🔗 Linked issue

❓ Type of change

  • 📖 Documentation (updates to the documentation or readme)
  • 🐞 Bug fix (a non-breaking change that fixes an issue)
  • 👌 Enhancement (improving an existing functionality like performance)
  • ✨ New feature (a non-breaking change that adds functionality)
  • ⚠️ Breaking change (fix or feature that would cause existing functionality to change)

📚 Description

Add AWS Lambda@Edge to the preset.

The current aws-lambda preset is not compatible with the Lambda@Edge format and requires users to create their own wrapper for Lambda@Edge. This PR is needed to resolve this issue.
It would also be very powerful if Lambda@Edge were available in Nitro. It will be quite important for projects that require SSR (e.g Nuxt3) as static assets (.output/public) can be retrieved from AWS S3 and the rest (.output/server) can be resolved by Lambda@Edge.

Resolves#79

📝 Checklist

  • I have linked an issue or discussion.
  • I have updated the documentation accordingly.

@mirumirumi

Copy link
Copy Markdown

I support this PR :)

(@WinterYukky You might consider a review request?)

@danielroe
danielroe requested a review from pi0June 11, 2022 08:08
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@mirumirumi Thanks your comment!

Also, thank you @danielroe and @pi0 for reviewing🥰

Comment threaddocs/deploy/providers/aws.md Outdated
The following code is an example of deploying a Nuxt3 project to CloudFront and Lambda@Edge with [AWS CDK](https://github.com/aws/aws-cdk). Using this stack, paths under `_nuxt/` (static assets) will get their data from the S3 origin, and all other paths will be resolved by Lambda@Edge.

```ts
import { spawnSync } from "child_process";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can auto generate this script to the .output. avoiding to hardcode things like public path to the example.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean the app build part? I'd like that. Maybe the output could be an object containing the key locations and configs that can be used for cloud specific deployments (for example configuring the S3 bucket and cloudfront caching):

{
"serverHandler": ".output/server",
"assets": ".output/assets""public": ".output/public"
}

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the review.
This script is not a simple script, it is IaC, so it may be difficult to put it in the .output from a DX perspective.
I think a developer wants more freedom to customize it.

Is the key here that the developer needs to be aware of the public and server paths?

@pi0pi0Jun 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Surely developers can always override to customize. We can export smaller utils even for better flexibility.

Is the key here that the developer needs to be aware of the public and server paths?

Yes. Such things shouldn't be hardcoded into the repository code or docs but auto-generated even considering customization needs.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been considering various use cases and interfaces for the past week, but I think I've been overthinking things a bit.
As @chris-vissermentioned, it might be better to just include the serverDir and publicDir in nitro.json.
What do you think of that idea, @pi0?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the other hand. These settings are easily extracted from the nuxt.config.ts since they are either Nuxt's defaults or set in that config. So maybe its not even needed.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I can agree your thinking @chris-visser. However to find configuration like nuxt.config.ts or nitro.config.ts and more... is a bit difficult for CDK apps.
Also maybe understood @pi0's thinking. His goal would be a Zero-Config Providers. Certainly that is one of the important features so I will try implemantation for auto generate this script to the .output.

@pi0

pi0 commented Jun 23, 2022

Copy link
Copy Markdown
Member

Hi @WinterYukky Thanks for your works on this pull request and sorry review took long.

I will have to try the deployment and probably pushing some improvements to automate as much as possible for sdk use. (Hense self assigned).

@pi0pi0 self-assigned this Jun 23, 2022
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Hi @pi0.
I updated to automatically generate CDK code to the .output. Can you please re-review it?

@ennioVisco

Copy link
Copy Markdown

@danielroe@pi0 I've noticed that there's 2 PR open for aws-lamba-edge

Which one should get merged ?

the other one is newer, although it seems very similar to this one, while this one also has CDK and github action setup, which is very interesting!

@jdevdevdev

Copy link
Copy Markdown

Users deploying through IaC (SST/Terraform/Pulumi/Cloudformation) other than CDK and would find Cloudfront wrapper useful. It would require decoupling it from the CDK deployment.

Possible solutions could be to:

  1. Alter this pr to make CDK deployment optional and keep the Cloudfront handler wrapper.
  2. Create two presets (possibly extend one off the other):
  • aws-lambda-edge
  • aws-lambda-edge-cdk

@HebiliciousHebilicious self-assigned this Jul 1, 2023
@Hebilicious
Hebilicious self-requested a review July 1, 2023 07:15
@HebiliciousHebilicious changed the title feat: add aws-lambda-edge presetfeat: add aws-lambda-edge preset with CDKJul 1, 2023
@HebiliciousHebilicious mentioned this pull request Jul 3, 2023

@HebiliciousHebilicious left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing work @WinterYukky
The documentation added here is incredible, and will be extremely useful for cdk support #1387

@pi0 I believe a good course of action here would be to merge
#1075 over this PR, and use this one as the base for CDK support both in lambda and lambda-edge

headers: normalizeIncomingHeaders(request.headers),
method: request.method,
query: request.querystring,
body: request.body,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

body should be normalized

@WinterYukkyWinterYukkyNov 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threadtest/presets/aws-lambda-edge.test.ts Outdated
]
}
const res: CloudFrontResultResponse = await handler(event)
// responsed CloudFrontHeaders are special, so modify them for testing.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

Comment threadsrc/presets/aws-lambda-edge.ts Outdated

export const awsLambdaEdge = defineNitroPreset({
entry: "#internal/nitro/entries/aws-lambda-edge",
externals: true,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can't be a boolean

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was unnecessary property so remove it.

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
await writeFile(
resolve(cdkDir, "cdk.json"),
JSON.stringify({
app: "npx ts-node --prefer-ts-exts bin/nitro-lambda-edge.ts",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could use jiti instead of ts-node here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't know jiti before I had recieve this comment! Thank you!!

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
this,
"EdgeFunction",
{
runtime: lambda.Runtime.NODEJS_16_X,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should use NODEJS_18_X

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Thanks for your reviewing @Hebilicious.
I'm busy this week, so I'll fix this PR next week in line with your comments 😉.

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@Hebilicious Thanks your reviewing!!
I fixed lined by your comment. However I'm not understand your strategy about to merge two PRs. Should I merge to this PR from #1075?

AlbertSabate pushed a commit to AlbertSabate/nitro that referenced this pull request Dec 23, 2023
@pi0
pi0 marked this pull request as draft February 27, 2024 17:14
@pi0pi0 mentioned this pull request Jan 7, 2025
@pi0
pi0 deleted the branch nitrojs:mainMarch 18, 2025 12:36
@pi0pi0 closed this Mar 18, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

aws lambda-edge

11 participants

@WinterYukky@mirumirumi@pi0@anjali89r@danielroe@galaxy79@ennioVisco@Hebilicious@jdevdevdev@chris-visser@cyrilcolinet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: add aws-lambda-edge preset with CDK - #240

Closed
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset
Closed

feat: add aws-lambda-edge preset with CDK#240
WinterYukky wants to merge 38 commits into
nitrojs:mainfrom
WinterYukky:feat/add-aws-lambda-edge-preset

Conversation

@WinterYukky

Copy link
Copy Markdown
Contributor

🔗 Linked issue

❓ Type of change

  • 📖 Documentation (updates to the documentation or readme)
  • 🐞 Bug fix (a non-breaking change that fixes an issue)
  • 👌 Enhancement (improving an existing functionality like performance)
  • ✨ New feature (a non-breaking change that adds functionality)
  • ⚠️ Breaking change (fix or feature that would cause existing functionality to change)

📚 Description

Add AWS Lambda@Edge to the preset.

The current aws-lambda preset is not compatible with the Lambda@Edge format and requires users to create their own wrapper for Lambda@Edge. This PR is needed to resolve this issue.
It would also be very powerful if Lambda@Edge were available in Nitro. It will be quite important for projects that require SSR (e.g Nuxt3) as static assets (.output/public) can be retrieved from AWS S3 and the rest (.output/server) can be resolved by Lambda@Edge.

Resolves#79

📝 Checklist

  • I have linked an issue or discussion.
  • I have updated the documentation accordingly.

@mirumirumi

Copy link
Copy Markdown

I support this PR :)

(@WinterYukky You might consider a review request?)

@danielroe
danielroe requested a review from pi0June 11, 2022 08:08
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@mirumirumi Thanks your comment!

Also, thank you @danielroe and @pi0 for reviewing🥰

Comment threaddocs/deploy/providers/aws.md Outdated
The following code is an example of deploying a Nuxt3 project to CloudFront and Lambda@Edge with [AWS CDK](https://github.com/aws/aws-cdk). Using this stack, paths under `_nuxt/` (static assets) will get their data from the S3 origin, and all other paths will be resolved by Lambda@Edge.

```ts
import { spawnSync } from "child_process";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can auto generate this script to the .output. avoiding to hardcode things like public path to the example.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean the app build part? I'd like that. Maybe the output could be an object containing the key locations and configs that can be used for cloud specific deployments (for example configuring the S3 bucket and cloudfront caching):

{
"serverHandler": ".output/server",
"assets": ".output/assets""public": ".output/public"
}

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the review.
This script is not a simple script, it is IaC, so it may be difficult to put it in the .output from a DX perspective.
I think a developer wants more freedom to customize it.

Is the key here that the developer needs to be aware of the public and server paths?

@pi0pi0Jun 27, 2022

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Surely developers can always override to customize. We can export smaller utils even for better flexibility.

Is the key here that the developer needs to be aware of the public and server paths?

Yes. Such things shouldn't be hardcoded into the repository code or docs but auto-generated even considering customization needs.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've been considering various use cases and interfaces for the past week, but I think I've been overthinking things a bit.
As @chris-vissermentioned, it might be better to just include the serverDir and publicDir in nitro.json.
What do you think of that idea, @pi0?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the other hand. These settings are easily extracted from the nuxt.config.ts since they are either Nuxt's defaults or set in that config. So maybe its not even needed.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I can agree your thinking @chris-visser. However to find configuration like nuxt.config.ts or nitro.config.ts and more... is a bit difficult for CDK apps.
Also maybe understood @pi0's thinking. His goal would be a Zero-Config Providers. Certainly that is one of the important features so I will try implemantation for auto generate this script to the .output.

@pi0

pi0 commented Jun 23, 2022

Copy link
Copy Markdown
Member

Hi @WinterYukky Thanks for your works on this pull request and sorry review took long.

I will have to try the deployment and probably pushing some improvements to automate as much as possible for sdk use. (Hense self assigned).

@pi0pi0 self-assigned this Jun 23, 2022
@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Hi @pi0.
I updated to automatically generate CDK code to the .output. Can you please re-review it?

@ennioVisco

Copy link
Copy Markdown

@danielroe@pi0 I've noticed that there's 2 PR open for aws-lamba-edge

Which one should get merged ?

the other one is newer, although it seems very similar to this one, while this one also has CDK and github action setup, which is very interesting!

@jdevdevdev

Copy link
Copy Markdown

Users deploying through IaC (SST/Terraform/Pulumi/Cloudformation) other than CDK and would find Cloudfront wrapper useful. It would require decoupling it from the CDK deployment.

Possible solutions could be to:

  1. Alter this pr to make CDK deployment optional and keep the Cloudfront handler wrapper.
  2. Create two presets (possibly extend one off the other):
  • aws-lambda-edge
  • aws-lambda-edge-cdk

@HebiliciousHebilicious self-assigned this Jul 1, 2023
@Hebilicious
Hebilicious self-requested a review July 1, 2023 07:15
@HebiliciousHebilicious changed the title feat: add aws-lambda-edge presetfeat: add aws-lambda-edge preset with CDKJul 1, 2023
@HebiliciousHebilicious mentioned this pull request Jul 3, 2023

@HebiliciousHebilicious left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing work @WinterYukky
The documentation added here is incredible, and will be extremely useful for cdk support #1387

@pi0 I believe a good course of action here would be to merge
#1075 over this PR, and use this one as the base for CDK support both in lambda and lambda-edge

headers: normalizeIncomingHeaders(request.headers),
method: request.method,
query: request.querystring,
body: request.body,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

body should be normalized

@WinterYukkyWinterYukkyNov 4, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threadtest/presets/aws-lambda-edge.test.ts Outdated
]
}
const res: CloudFrontResultResponse = await handler(event)
// responsed CloudFrontHeaders are special, so modify them for testing.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

Comment threadsrc/presets/aws-lambda-edge.ts Outdated

export const awsLambdaEdge = defineNitroPreset({
entry: "#internal/nitro/entries/aws-lambda-edge",
externals: true,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can't be a boolean

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was unnecessary property so remove it.

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
await writeFile(
resolve(cdkDir, "cdk.json"),
JSON.stringify({
app: "npx ts-node --prefer-ts-exts bin/nitro-lambda-edge.ts",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could use jiti instead of ts-node here

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't know jiti before I had recieve this comment! Thank you!!

Comment threadsrc/presets/aws-lambda-edge.ts Outdated
this,
"EdgeFunction",
{
runtime: lambda.Runtime.NODEJS_16_X,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should use NODEJS_18_X

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

Thanks for your reviewing @Hebilicious.
I'm busy this week, so I'll fix this PR next week in line with your comments 😉.

@WinterYukky

Copy link
Copy Markdown
ContributorAuthor

@Hebilicious Thanks your reviewing!!
I fixed lined by your comment. However I'm not understand your strategy about to merge two PRs. Should I merge to this PR from #1075?

AlbertSabate pushed a commit to AlbertSabate/nitro that referenced this pull request Dec 23, 2023
@pi0
pi0 marked this pull request as draft February 27, 2024 17:14
@pi0pi0 mentioned this pull request Jan 7, 2025
@pi0
pi0 deleted the branch nitrojs:mainMarch 18, 2025 12:36
@pi0pi0 closed this Mar 18, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

aws lambda-edge

11 participants

@WinterYukky@mirumirumi@pi0@anjali89r@danielroe@galaxy79@ennioVisco@Hebilicious@jdevdevdev@chris-visser@cyrilcolinet