From 7fe2915031894b3397765155b11bd82da1559eee Mon Sep 17 00:00:00 2001 From: Thibault RICHARD Date: Sun, 17 Oct 2021 22:31:52 +0200 Subject: [PATCH 1/6] [DOCS] Revamp websites docs --- docs/README.md | 2 +- docs/environment/custom-domains.md | 30 +-- docs/frameworks/laravel.md | 52 ++++- docs/frameworks/symfony.md | 3 + docs/websites.md | 296 +++++------------------------ 5 files changed, 96 insertions(+), 287 deletions(-) diff --git a/docs/README.md b/docs/README.md index 28ec6b5c4..31e20fa59 100644 --- a/docs/README.md +++ b/docs/README.md @@ -175,7 +175,7 @@ This matrix will be updated as Bref and AWS services evolve over time. - **Website** - Websites can run on AWS Lambda. Assets can be served via AWS S3. That requires a bit of setup but this is documented in the ["Websites" documentation](/docs/websites.md). Performance is as good as any server. + Websites can run on AWS Lambda. Assets can be stored in S3 and served via Cloudfront. This is documented in the ["Websites" documentation](/docs/websites.md). Performance is as good as any server. - **Legacy application** diff --git a/docs/environment/custom-domains.md b/docs/environment/custom-domains.md index dbc206fee..221e81535 100644 --- a/docs/environment/custom-domains.md +++ b/docs/environment/custom-domains.md @@ -47,31 +47,9 @@ After waiting for the DNS change to propagate (sometimes up to several hours) yo ## Custom domains for static files on S3 -Some applications serve static files hosted on AWS S3. You can read the [Websites](/docs/websites.md#hosting-static-files-with-s3) documentation to learn more. +Some applications serve static files hosted on AWS S3. You can read the [Websites](/docs/websites.md) documentation to learn more. -The S3 bucket can be accessed at this URL: `https://.s3.amazonaws.com/` (supports both HTTP and HTTPS). +If you want to host a fully static website with HTML files or a Single Page Application (eg. built with Vue, React or Angular) +you may be interested in [the Static Website construct of the Lift plugin](https://github.com/getlift/lift/blob/master/docs/static-website.md). -To use a custom domain for a S3 static website the process lies in 2 steps: - -- name the S3 bucket like the wanted domain name - - For example for the http://www.example.com website, the S3 bucket has to be named `www.example.com` -- point the domain to the S3 URL via DNS - - In our example the DNS entry to create would be a CNAME for `www.example.com` pointing to `www.example.com.s3.amazonaws.com` - -### Static websites - -If you are hosting a full static website with HTML files ([per this documentation](https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html)), the URLs to use will be different: - -```bash -http://.s3-website-.amazonaws.com/ -# or -http://.s3-website..amazonaws.com/ -``` - -In that case you need to use the domains above for the CNAME. - -Note that the URL is **HTTP-only** and [depends on the region](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_website_region_endpoints). - -To add HTTPS to your website for free it is possible to use a CDN like [CloudFlare](https://cloudflare.com/) (simplest) or [AWS CloudFront](/docs/websites.md#serving-php-and-static-files-via-cloudfront). +This allows to configure custom domains, root domain to `www` redirects and more. Check out [the official documentation](https://github.com/getlift/lift/blob/master/docs/static-website.md) for more details. diff --git a/docs/frameworks/laravel.md b/docs/frameworks/laravel.md index 804f449d4..26657c5a9 100644 --- a/docs/frameworks/laravel.md +++ b/docs/frameworks/laravel.md @@ -88,21 +88,59 @@ For more details follow [the "Console" guide](/docs/runtimes/console.md). ## Assets -To deploy Laravel websites, we need assets to be served by AWS S3. Setting up the S3 bucket is already explained in the [websites documentation](../websites.md#hosting-static-files-with-s3). This section provides additional instructions specific to Laravel Mix. +To deploy Laravel websites, assets need to be served from AWS S3. The easiest solution to do this is to use the +[Server-side website construct of the Lift plugin](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). -First, you can compile assets for production in the `public` directory, then synchronize that directory to a S3 bucket: +This will deploy a Cloudfront distribution that will act as a proxy: it will serve +static files directly from S3 and will forward everything else to Lambda. This is very close +to how traditional web servers like Apache or Nginx work, which means your application doesn't need to change! +For more details, see [the offical documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md#how-it-works). + +First install the plugin ```bash -npm run prod -aws s3 sync public/ s3:/// --delete --exclude index.php +serverless plugin install -n serverless-lift ``` -Then, the assets need to be included from S3. In the production `.env` file you can now set that variable: +Then add this configuration to your `serverless.yml` file. -```dotenv -MIX_ASSET_URL=https://.s3..amazonaws.com +```yaml +... +service: laravel + +provider: + ... + +plugins: + - ./vendor/bref/bref + - serverless-lift + +functions: + ... + +constructs: + website: + type: server-side-website + assets: + '/js/*': public/js + '/css/*': public/css + '/favicon.ico': public/favicon.ico + '/robots.txt': public/robots.txt + # add here any file or directory that needs to be served from S3 ``` +Before deploying, compile your assets using Laravel Mix. + +```bash +npm run prod +``` + +Now deploy your website using `serverless deploy`. Lift will create all required resources and take care of +uploading your assets to S3 automatically. + +For more details, see the [Websites section](/docs/websites.md) of this documentation +and the official [Lift documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). + ### Assets in templates Assets referenced in templates should be via the `asset()` helper: diff --git a/docs/frameworks/symfony.md b/docs/frameworks/symfony.md index 638367b73..2e7407256 100644 --- a/docs/frameworks/symfony.md +++ b/docs/frameworks/symfony.md @@ -202,6 +202,9 @@ upload all specified files and directories to the bucket. > If you are not using Flex, update the `serverless.yml` file to exclude assets from the deployment ([see the recipe](https://github.com/symfony/recipes-contrib/blob/master/bref/symfony-bridge/0.1/serverless.yaml#L35)) +For more details, see the [Websites section](/docs/websites.md) of this documentation +and the official [Lift documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). + ### Assets in templates For the above configuration to work, assets must be referenced in templates via the `asset()` helper as [recommended by Symfony](https://symfony.com/doc/current/templates.html#linking-to-css-javascript-and-image-assets): diff --git a/docs/websites.md b/docs/websites.md index a63b2c80c..f132611b9 100644 --- a/docs/websites.md +++ b/docs/websites.md @@ -19,304 +19,94 @@ Websites usually contain 2 parts: - PHP code, running on [AWS Lambda + API Gateway with the HTTP runtime](/docs/runtimes/http.md) - static assets (CSS, JS…), [hosted on AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html) -You will find below different architectures for creating websites. - -### Separate domains - -![](websites/separate-domains.svg) - -This architecture is the simplest. Assets are hosted on a separate domain than the PHP code. - -However, by default **API Gateway only supports HTTPS**. That means there is no redirection from HTTP to HTTPS: `https://website.com` will work but not `http://website.com`. - -To solve that, we can switch from API Gateway's ["HTTP API" to "REST API"](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-vs-rest.html) (which provides a HTTP -> HTTPS redirection). -Despite the name, REST API work fine for websites. - -```diff -functions: - website: - # ... - events: -- - httpApi: '*' -+ - http: 'ANY /' -+ - http: 'ANY /{proxy+}' -``` - -Finally, when [setting up a custom domain](/docs/environment/custom-domains.md) make sure to select **Edge deployment**: - -![](/docs/web-apps/edge-deployment.png) - -### Same domain - ![](websites/same-domain.svg) -This architecture is more complex, as [CloudFront](https://aws.amazon.com/cloudfront/) (the AWS CDN) serves as a HTTP/HTTPS proxy. +[CloudFront](https://aws.amazon.com/cloudfront/) (the AWS CDN) serves as an HTTP/HTTPS proxy. This lets us host everything under the same domain and support both HTTP and HTTPS. -On top of that, CloudFront can act as a CDN and cache assets and web pages all over the world. This is however not documented in this page. - -## Hosting static files with S3 - -This section explains how to host assets on S3. - -### Creating a S3 bucket - -S3 stores files in "buckets". You will need to create one for your website. - -If you plan on using a custom domain for S3 URLs, the bucket must be named after the domain. For example `assets.website.com`. Learn more about this [in the official AWS documentation](https://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html). - -If you plan to use CloudFront, you can use any name for the bucket. - -In order to automate everything let's create and configure the bucket using `serverless.yml`: - -```yaml -... - -resources: - Resources: - # The S3 bucket that stores the assets - Assets: - Type: AWS::S3::Bucket - Properties: - BucketName: - # The policy that makes the bucket publicly readable - AssetsBucketPolicy: - Type: AWS::S3::BucketPolicy - Properties: - Bucket: !Ref Assets # References the bucket we defined above - PolicyDocument: - Statement: - - Effect: Allow - Principal: '*' # everyone - Action: 's3:GetObject' # to read - Resource: !Join ['/', [!GetAtt Assets.Arn, '*']] # things in the bucket - # alternatively you can write out Resource: 'arn:aws:s3:::/*' -``` - -Don't forget to replace `` with the bucket name of your choice. Note that the name must be universally unique within Amazon (so you can't use `assets`) otherwise you'll get this error when you deploy: `Assets - assets already exists.` - -After [deploying with `serverless deploy`](/docs/deploy.md), the static files will be served from `https://.s3..amazonaws.com/`. Read the next section to upload your files. +The easiest solution to do this is to use the +[Server-side website construct of the Lift plugin](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). +If you don't want to use it, see the [alternative solutions](#alternative-solutions). -You can either [setup a custom domain to point to this URL](environment/custom-domains.md#custom-domains-for-static-files-on-s3) or setup CloudFront as explained below. - -> In this section we explained how to host assets on S3. It is also possible to host static websites on S3 (i.e. HTML files). In that case you will need to enable this feature and use different S3 URLs. See [the AWS documentation](https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html) to learn more. - -If you need to enable CORS, for example if a CSS or JavaScript file needs to load additional resources like fonts from S3: - -```yaml -resources: - Resources: - Assets: - Type: AWS::S3::Bucket - Properties: - BucketName: - CorsConfiguration: - CorsRules: - - AllowedHeaders: ["*"] - AllowedMethods: [GET] - AllowedOrigins: ["*"] -``` - -More options can be set on the bucket, [read more here](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html). - -### Uploading files to S3 - -It is not possible to use `serverless deploy` to upload files to S3, you need to upload them separately. To do this, you can use the [`aws s3 sync` command](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/sync.html): +First install the plugin ```bash -aws s3 sync s3:/// --delete +serverless plugin install -n serverless-lift ``` -Please note that the assets would normally need to be inside a folder, and not in the root of your bucket. - -Be aware that the content of the bucket is public! - -## Serving PHP and static files via CloudFront - -This section assumes you have already deployed your static files on S3 as shown above. - -As explained at the beginning of this page, CloudFront will let us: - -- serve the PHP application and static files under the same domain -- support both HTTP and HTTPS - -This diagram helps understand how CloudFront works: - -![](cloudfront.png) - -CloudFront forwards HTTP requests to "Origins" (API Gateway/Lambda, S3, etc.) based on "Cache Behaviors". - -A cache behavior can match a specific URL pattern, and can have a specific caching configuration (e.g. cache the responses for 10 days). - -The `serverless.yml` example below: - -- forwards URLs that start with `/assets/` to S3 (static files) -- forwards all the other requests to Lambda +Then add this configuration to your `serverless.yml` file. ```yaml -service: app -provider: - name: aws - runtime: provided.al2 +service: my-app -functions: - website: - handler: public/index.php - layers: - - ${bref:layer.php-74-fpm} - events: - - httpApi: '*' +provider: + ... plugins: - - ./vendor/bref/bref - -resources: - Resources: - # The S3 bucket that stores the assets - Assets: - # [...] see the previous section for details - AssetsBucketPolicy: - # [...] see the previous section for details - - WebsiteCDN: - Type: AWS::CloudFront::Distribution - Properties: - DistributionConfig: - Enabled: true - # Cheapest option by default (https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_DistributionConfig.html) - PriceClass: PriceClass_100 - # Enable http2 transfer for better performances - HttpVersion: http2 - # Origins are where CloudFront fetches content - Origins: - # The website (AWS Lambda) - - Id: Website - DomainName: !Join ['.', [!Ref HttpApi, 'execute-api', !Ref AWS::Region, 'amazonaws.com']] - CustomOriginConfig: - OriginProtocolPolicy: 'https-only' # API Gateway only supports HTTPS - # CloudFront does not forward the original `Host` header. We use this - # to forward the website domain name to PHP via the `X-Forwarded-Host` header. - # Learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Host - #OriginCustomHeaders: - # - HeaderName: 'X-Forwarded-Host' - # HeaderValue: example.com # our custom domain - # The assets (S3) - - Id: Assets - DomainName: !GetAtt Assets.RegionalDomainName - S3OriginConfig: {} # this key is required to tell CloudFront that this is an S3 origin, even though nothing is configured - # If you host a static website, like a SPA, use s3-website URLs instead of the config above - # See https://stackoverflow.com/questions/15309113/amazon-cloudfront-doesnt-respect-my-s3-website-buckets-index-html-rules#15528757 - # DomainName: !Select [2, !Split ["/", !GetAtt Assets.WebsiteURL]] - # CustomOriginConfig: - # OriginProtocolPolicy: 'http-only' # S3 websites only support HTTP - # You'll also need to enable website hosting on your s3 bucket by configuring the WebsiteConfiguration property - # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-websiteconfiguration - # The default behavior is to send everything to AWS Lambda - DefaultCacheBehavior: - AllowedMethods: [GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE] - TargetOriginId: Website # the PHP application - # Disable caching for the PHP application https://aws.amazon.com/premiumsupport/knowledge-center/prevent-cloudfront-from-caching-files/ - DefaultTTL: 0 - MinTTL: 0 - MaxTTL: 0 - # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-forwardedvalues.html - ForwardedValues: - QueryString: true - Cookies: - Forward: all # Forward cookies to use them in PHP - # We must *not* forward the `Host` header else it messes up API Gateway - Headers: - - 'Accept' - - 'Accept-Encoding' - - 'Accept-Language' - - 'Authorization' - - 'Origin' - - 'Referer' - # CloudFront will force HTTPS on visitors (which is more secure) - ViewerProtocolPolicy: redirect-to-https - CacheBehaviors: - # Assets will be served under the `/assets/` prefix - - PathPattern: 'assets/*' - TargetOriginId: Assets # the static files on S3 - AllowedMethods: [GET, HEAD] - ForwardedValues: - # No need for all that with assets - QueryString: 'false' - Cookies: - Forward: none - ViewerProtocolPolicy: redirect-to-https - Compress: true # Serve files with gzip for browsers that support it (https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html) - CustomErrorResponses: - # Force CloudFront to not cache HTTP errors - - ErrorCode: 500 - ErrorCachingMinTTL: 0 - - ErrorCode: 504 - ErrorCachingMinTTL: 0 + - ./vendor/bref/bref + - serverless-lift + +functions: + ... + +constructs: + website: + type: server-side-website + assets: + '/js/*': assets/js + '/css/*': assets/css + '/favicon.ico': assets/favicon.ico + '/robots.txt': assets/robots.txt + # add here any file or directory that needs to be served from S3 ``` -Feel free to customize the `/asset/` path. If your application is a JS application backed by a PHP API, you will want to invert API Gateway and S3 (set S3 as the `DefaultCacheBehavior` and serve API Gateway under a `/api/` path). +Now deploy your website using `serverless deploy`. Lift will create all required resources and take care of +uploading your assets to S3 automatically. -> The first deployment takes a lot of time (5 to 10 minutes) because CloudFront is a distributed service. The next deployments that do not modify CloudFront's configuration will not suffer from this delay. You will know it is finished when the `Status` column changes from `In Progress` to `Deployed` in your [CloudFront dashboard](https://console.aws.amazon.com/cloudfront/home). -> -> You can also follow the deployment in real time using the [Bref Dashboard](https://dashboard.bref.sh/). +You can access your website using the URL that Lift outputs at the end the deployment. -The URL of the deployed CloudFront distribution can be found in [the CloudFront dashboard](https://console.aws.amazon.com/cloudfront/home) under `Domain Name`. +> The first deployment takes a lot of time (5 to 10 minutes) because CloudFront is a distributed service. The next deployments that do not modify CloudFront's configuration will not suffer from this delay. ### Setting up a domain name -Just like in the "[Custom domains](/docs/environment/custom-domains.md)" guide, you need to register your domain in **ACM** (AWS Certificate Manager) to get a HTTPS certificate. +Just like in the "[Custom domains](/docs/environment/custom-domains.md)" guide, you need to register your domain in **ACM** (AWS Certificate Manager) to get an HTTPS certificate. > If you have already set up this domain as a custom domain in API Gateway (by following the [Custom domain](/docs/environment/custom-domains.md) guide), you will need to remove it before continuing. - open [this link](https://console.aws.amazon.com/acm/home?region=us-east-1#/wizard/) or manually go in the ACM Console and click "Request a new certificate" **in the `us-east-1` region** (CloudFront requires certificates from `us-east-1`) - add your domain name and click "Next" - choose the domain validation of your choice - - domain validation will require you to add entries to your DNS configuration + - domain validation will require you to add entries to your DNS configuration (this is **recommended** because it will be renewed automatically if the DNS record is still configured) - email validation will require you to click a link you will receive in an email sent to `admin@your-domain.com` -After validating the domain and the certificate we can now configure it in `template.yaml`. - Copy the ARN of the ACM certificate. It should look like this: ``` arn:aws:acm:us-east-1:216536346254:certificate/322f12ee-1165-4bfa-a41f-08c932a2935d ``` -Add your domain name under `Aliases` and configure `ViewerCertificate` to use your custom HTTPS certificate: +Now add your domain name and certificate in your `serverless.yml` file ```yaml ... -resources: - Resources: - WebsiteCDN: - Type: AWS::CloudFront::Distribution - Properties: - DistributionConfig: - ... - # Custom domain name - Aliases: - - # e.g. example.com. (This is your application's domain, not your assets' domain) - ViewerCertificate: - # ARN of the certificate created in ACM - AcmCertificateArn: - # See https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ViewerCertificate.html - SslSupportMethod: 'sni-only' - MinimumProtocolVersion: TLSv1.1_2016 +constructs: + website: + # ... + domain: mywebsite.com + certificate: ``` -The last step will be to point your domain name to the CloudFront URL: +The last step will be to point your domain name DNS records to the CloudFront URL: -- open [the CloudFront dashboard](https://console.aws.amazon.com/cloudfront/home) and look for the URL under `Domain Name` +- copy the domain outputted by Lift during `serverless deploy` - create a CNAME to point your domain name to this URL - if you use Route53 you can read [the official guide](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-cloudfront-distribution.html) - if you use another registrar and you want to point your root domain (without `www.`) to CloudFront, you will need to use a registrar that supports this (for example [CloudFlare allows this with a technique called CNAME flattening](https://support.cloudflare.com/hc/en-us/articles/200169056-Understand-and-configure-CNAME-Flattening)) -## More examples - -Complete deployable examples for: +This plugin supports more advanced use cases like multiple domains, root domain to `www` redirects and more. Check out [the official documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md) for a complete reference of available configuration. -- server-side websites with assets -- single-page applications with a backend API +## Alternative solutions -are available in the [Serverless Visually Explained](https://serverless-visually-explained.com/) course. +If you don't want to use Lift or Cloudfront, you may want to read the [older version of this documentation](https://github.com/brefphp/bref/blob/d1dd690d020cd03f134010db456bb61a6d0ffafb/docs/websites.md#architectures) +which featured configuration using S3 only on a separate domain and Cloudfront configured through plain Cloudformation. From a1ceb3177484467767e46b6fd7d69f271e65f32b Mon Sep 17 00:00:00 2001 From: Thibault RICHARD Date: Sun, 17 Oct 2021 22:39:32 +0200 Subject: [PATCH 2/6] Remove useless images --- docs/cloudfront.png | Bin 34468 -> 0 bytes docs/websites/separate-domains.svg | 1 - 2 files changed, 1 deletion(-) delete mode 100644 docs/cloudfront.png delete mode 100644 docs/websites/separate-domains.svg diff --git a/docs/cloudfront.png b/docs/cloudfront.png deleted file mode 100644 index 7583fa9057d9a1fd48a390146e29f6a67ff9b1ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34468 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 diff --git a/docs/websites/separate-domains.svg b/docs/websites/separate-domains.svg deleted file mode 100644 index 11ebcfaaa..000000000 --- a/docs/websites/separate-domains.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From e2625a89b0efd9826729b9ad078fbadce0ad0a10 Mon Sep 17 00:00:00 2001 From: Thibault RICHARD Date: Sun, 17 Oct 2021 22:42:31 +0200 Subject: [PATCH 3/6] Remove yet another useless image --- docs/web-apps/edge-deployment.png | Bin 38340 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/web-apps/edge-deployment.png diff --git a/docs/web-apps/edge-deployment.png b/docs/web-apps/edge-deployment.png deleted file mode 100644 index 627299e458a580f0fb6fbd934dec9e9c3418afda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38340 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 From 4ebbef148a7c547781224c1640b6c80668a77b24 Mon Sep 17 00:00:00 2001 From: Thibault RICHARD Date: Mon, 18 Oct 2021 23:39:55 +0200 Subject: [PATCH 4/6] Address review comments --- docs/websites.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/websites.md b/docs/websites.md index f132611b9..73d625763 100644 --- a/docs/websites.md +++ b/docs/websites.md @@ -25,7 +25,7 @@ Websites usually contain 2 parts: This lets us host everything under the same domain and support both HTTP and HTTPS. -The easiest solution to do this is to use the +The easiest approach is to use the [Server-side website construct of the Lift plugin](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). If you don't want to use it, see the [alternative solutions](#alternative-solutions). @@ -77,7 +77,7 @@ Just like in the "[Custom domains](/docs/environment/custom-domains.md)" guide, - open [this link](https://console.aws.amazon.com/acm/home?region=us-east-1#/wizard/) or manually go in the ACM Console and click "Request a new certificate" **in the `us-east-1` region** (CloudFront requires certificates from `us-east-1`) - add your domain name and click "Next" - choose the domain validation of your choice - - domain validation will require you to add entries to your DNS configuration (this is **recommended** because it will be renewed automatically if the DNS record is still configured) + - domain validation will require you to create DNS entries (this is **recommended** because it renews the certificate automatically) - email validation will require you to click a link you will receive in an email sent to `admin@your-domain.com` Copy the ARN of the ACM certificate. It should look like this: @@ -99,12 +99,12 @@ constructs: The last step will be to point your domain name DNS records to the CloudFront URL: -- copy the domain outputted by Lift during `serverless deploy` +- copy the domain outputted by Lift during `serverless deploy` (or run `serverless info` to retrieve it) - create a CNAME to point your domain name to this URL - if you use Route53 you can read [the official guide](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-cloudfront-distribution.html) - if you use another registrar and you want to point your root domain (without `www.`) to CloudFront, you will need to use a registrar that supports this (for example [CloudFlare allows this with a technique called CNAME flattening](https://support.cloudflare.com/hc/en-us/articles/200169056-Understand-and-configure-CNAME-Flattening)) -This plugin supports more advanced use cases like multiple domains, root domain to `www` redirects and more. Check out [the official documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md) for a complete reference of available configuration. +Lift supports more advanced use cases like multiple domains, root domain to `www` redirects and more. Check out [the official documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md) for a complete reference of available configuration. ## Alternative solutions From 4fc8f77e4b014846496c4e57fc102d0708f96408 Mon Sep 17 00:00:00 2001 From: Thibault RICHARD Date: Tue, 19 Oct 2021 08:33:48 +0200 Subject: [PATCH 5/6] Some more fixes --- docs/frameworks/laravel.md | 2 +- docs/frameworks/symfony.md | 2 +- docs/websites.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/frameworks/laravel.md b/docs/frameworks/laravel.md index 26657c5a9..9b2ebb381 100644 --- a/docs/frameworks/laravel.md +++ b/docs/frameworks/laravel.md @@ -88,7 +88,7 @@ For more details follow [the "Console" guide](/docs/runtimes/console.md). ## Assets -To deploy Laravel websites, assets need to be served from AWS S3. The easiest solution to do this is to use the +To deploy Laravel websites, assets need to be served from AWS S3. The easiest approach is to use the [Server-side website construct of the Lift plugin](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). This will deploy a Cloudfront distribution that will act as a proxy: it will serve diff --git a/docs/frameworks/symfony.md b/docs/frameworks/symfony.md index 2e7407256..b88d7849b 100644 --- a/docs/frameworks/symfony.md +++ b/docs/frameworks/symfony.md @@ -138,7 +138,7 @@ in `trusted_proxies`. ## Assets -To deploy Symfony websites, assets need to be served from AWS S3. The easiest solution to do this is to use the +To deploy Symfony websites, assets need to be served from AWS S3. The easiest approach is to use the [Server-side website construct of the Lift plugin](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). This will deploy a Cloudfront distribution that will act as a proxy: it will serve diff --git a/docs/websites.md b/docs/websites.md index 73d625763..6a7ee7beb 100644 --- a/docs/websites.md +++ b/docs/websites.md @@ -104,7 +104,7 @@ The last step will be to point your domain name DNS records to the CloudFront UR - if you use Route53 you can read [the official guide](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-cloudfront-distribution.html) - if you use another registrar and you want to point your root domain (without `www.`) to CloudFront, you will need to use a registrar that supports this (for example [CloudFlare allows this with a technique called CNAME flattening](https://support.cloudflare.com/hc/en-us/articles/200169056-Understand-and-configure-CNAME-Flattening)) -Lift supports more advanced use cases like multiple domains, root domain to `www` redirects and more. Check out [the official documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md) for a complete reference of available configuration. +Lift supports more advanced use cases like multiple domains, root domain to `www` redirects, and more. Check out [the official documentation](https://github.com/getlift/lift/blob/master/docs/server-side-website.md). ## Alternative solutions From 94e9fd38a409abe9821d36c1ac4ac4157c707e56 Mon Sep 17 00:00:00 2001 From: Thibault RICHARD Date: Tue, 19 Oct 2021 22:21:12 +0200 Subject: [PATCH 6/6] Update cloudfront image --- docs/websites.md | 2 +- docs/websites/cloudfront.svg | 1 + docs/websites/same-domain.svg | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 docs/websites/cloudfront.svg delete mode 100644 docs/websites/same-domain.svg diff --git a/docs/websites.md b/docs/websites.md index 6a7ee7beb..c7da6b1a6 100644 --- a/docs/websites.md +++ b/docs/websites.md @@ -19,7 +19,7 @@ Websites usually contain 2 parts: - PHP code, running on [AWS Lambda + API Gateway with the HTTP runtime](/docs/runtimes/http.md) - static assets (CSS, JS…), [hosted on AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html) -![](websites/same-domain.svg) +![](websites/cloudfront.svg) [CloudFront](https://aws.amazon.com/cloudfront/) (the AWS CDN) serves as an HTTP/HTTPS proxy. diff --git a/docs/websites/cloudfront.svg b/docs/websites/cloudfront.svg new file mode 100644 index 000000000..5d111782e --- /dev/null +++ b/docs/websites/cloudfront.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/websites/same-domain.svg b/docs/websites/same-domain.svg deleted file mode 100644 index bb5896b20..000000000 --- a/docs/websites/same-domain.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file