Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Draft
wants to merge 38 commits into
base: main
Choose a base branch
from

Conversation

WinterYukky
Copy link
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

I support this PR :)

(@WinterYukky You might consider a review request?)

@danielroe danielroe requested a review from pi0 June 11, 2022 08:08
@WinterYukky
Copy link
Contributor Author

@mirumirumi Thanks your comment!

Also, thank you @danielroe and @pi0 for reviewingπŸ₯°

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
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.

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
Contributor Author

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?

Copy link
Member

@pi0 pi0 Jun 27, 2022

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
Contributor Author

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-visser mentioned, it might be better to just include the serverDir and publicDir in nitro.json.
What do you think of that idea, @pi0?

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
Contributor Author

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
Copy link
Member

pi0 commented Jun 23, 2022

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).

@pi0 pi0 self-assigned this Jun 23, 2022
@WinterYukky
Copy link
Contributor Author

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

@ennioVisco
Copy link

Any news about this pr? This is quite important for AWS use cases, as stated here: #1106

@Hebilicious
Copy link
Member

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

Which one should get merged ?

@ennioVisco
Copy link

@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

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

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

@Hebilicious Hebilicious left a comment

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
Member

Choose a reason for hiding this comment

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

body should be normalized

Copy link
Contributor Author

Choose a reason for hiding this comment

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

]
}
const res: CloudFrontResultResponse = await handler(event)
// responsed CloudFrontHeaders are special, so modify them for testing.
Copy link
Member

Choose a reason for hiding this comment

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

typo


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

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
Contributor Author

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.

await writeFile(
resolve(cdkDir, "cdk.json"),
JSON.stringify({
app: "npx ts-node --prefer-ts-exts bin/nitro-lambda-edge.ts",
Copy link
Member

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
Contributor Author

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!!

this,
"EdgeFunction",
{
runtime: lambda.Runtime.NODEJS_16_X,
Copy link
Member

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
Contributor Author

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
Contributor Author

@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 added 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
Sign up for free to 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