Skip to content
Software Engineering Stories
Go back

Serverless Laravel

AWS SAM GraphQL Design

Production Showcase · Source Code

The why, the how and the what

Use this repository when you want to automate creating a serverless Laravel environment.

It uses AWS SAM to create the AWS resources including:

It also makes use of GitHub actions for CI/CD automation.

Setup

Pre-requisites

To automate the creation of the subdomain & it’s certificate.

An existing base domain & wild card certificate.

.github/workflows/deploy.yml fromrdok/serverless-laravel atdaa833braw
BASE_DOMAIN_ROUTE_53_HOSTED_ZONE_ID: ${{ secrets.BASE_DOMAIN_ROUTE_53_HOSTED_ZONE_ID }}
BASE_DOMAIN_WILD_CARD_CERTIFICATE_ARN: ${{ secrets.BASE_DOMAIN_WILD_CARD_CERTIFICATE_ARN }}

Future additions

The following Laravel features will be supported in future posts:

Environment variables

Instruct Laravel how to load static assets & access storage bucket:

template.yaml fromrdok/serverless-laravel atdaa833braw
Variables:
  APP_KEY: !Ref AppKey
  APP_STORAGE: /tmp
  AWS_PUBLIC_BUCKET: !Ref Assets
  MIX_ASSET_URL: !Join [ '', [ 'https://', !Ref DomainName, '/assets' ] ]
  ASSET_URL: !Join [ '', [ 'https://', !Ref DomainName, '/assets' ] ]
  LOG_CHANNEL: stderr
  FILESYSTEM_DRIVER: s3
  AWS_BUCKET: !Ref Storage

Domain Certificate

CloudFront only supports ACM certificates in the US East (N. Virginia) Region. As such, a separate stack is created in the us-east-1 region.

template-certificate.yml fromrdok/serverless-laravel atdaa833braw
Certificate:
  Type: AWS::CertificateManager::Certificate
  Properties:
    ValidationMethod: DNS
    DomainValidationOptions:
      - DomainName: !Ref DomainName
        HostedZoneId: !Ref BaseDomainRoute53HostedZoneId
    DomainName: !Ref DomainName

Storage

Instruct Laravel to properly get AWS credentials by adding the AWS session token:

laravel/config/filesystems.php fromrdok/serverless-laravel ate53712fraw
'token' => env('AWS_SESSION_TOKEN'),

CI/CD

CI/CD uses AWS SAM to build & deploy AWS resources:

.github/workflows/deploy.yml fromrdok/serverless-laravel atdaa833braw
sam deploy \
  --region "eu-west-1" \
  --s3-bucket "${{ steps.env.outputs.cicd-bucket-laravel }}" \
  --s3-prefix "${NAME}" \
  --stack-name "${{ steps.env.outputs.stack-laravel-name }}" \
  --capabilities CAPABILITY_IAM \
  --no-fail-on-empty-changeset \
  --no-confirm-changeset \
  --parameter-overrides \
    CertificateARN="${CERTIFICATE_ARN}" \
    AppKey="${APP_KEY}" \
    DomainName="${{ steps.env.outputs.domain-name }}" \
    WildcardCertificateARN="${BASE_DOMAIN_WILD_CARD_CERTIFICATE_ARN}" \
    BaseDomainRoute53HostedZoneId="${BASE_DOMAIN_ROUTE_53_HOSTED_ZONE_ID}"

Share this post:

Previous Post
Cyberpunk 2077 R6 Config Editor
Next Post
Aurora for serverless Laravel