Jets Init
Jets Install
To install jets for Rails add these to gems to your Gemfile
Gemfile
gem "jets-rails", ">= 1.1"
gem "jets", ">= 6.0"
And run
bundle install
Jets Init
To generate jets config files that help deploy the Rails project to AWS Lambda, run:
jets init
Starter config/jets files are generated.
Init Files
Here’s a review of the files jets init
generates.
File | Description |
---|---|
config/jets/project.rb | Project settings like project name. The project name is a part of the stack name to deploy. IE: project=demo => stack=demo-dev gets to deploy to AWS. |
config/jets/bootstrap.rb | Bootstrap settings are used for the jets deploy initial bootstrap deployment. This phase creates the s3 bucket and codebuild remote runner which will be used to deploy your project. The remote runner provides a consistent build environment, CPU architecture, raw horsepower, and internet speed. See: Remote Runner. |
config/jets/deploy.rb | This is where the main deploy settings live. It tells the jets remote runner how it should deploy. These are the settings you’ll probably update the most. |
config/jets/env | Jets dotenv files. Jets provides additional dotenv support; notably dotenv SSM support. So you can store sensitive env variables centrally on your AWS account. |
Review Config
Let’s take a look some of the config files. We’ll review them in an introductory manner. For more details, see: Jets Config: project, bootstrap, deploy
project
The project.rb
is always loaded earliest. It has simple configurations are loaded super early in the Jets boot process.
config/jets/project.rb
Jets.project.configure do
config.name = "rails"
end
The project.rb
has the project name. The jets init
command infers the name from the parent folder. Change it to rails
if it’s not already.
The project name will be part of the stack name to deploy. IE: project=rails
=> stack=rails-dev
gets to deploy to AWS.
bootstrap
The bootstrap.rb
has configurations that loaded next for the Jets bootstrap process. The bootstrap phase is the first phase of the Jets deploy process.
config/jets/bootstrap.rb
Jets.bootstrap.configure do
config.codebuild.project.env.vars = {
BUNDLE_GITHUB__COM: "SSM:/#{ssm_env}/BUNDLE_GITHUB__COM",
DOCKER_PASS: "SSM:/#{ssm_env}/DOCKER_PASS",
DOCKER_USER: "SSM:/#{ssm_env}/DOCKER_USER",
# Use your own docker host
# DOCKER_HOST: "SSM:/#{ssm_env}/DOCKER_HOST",
# JETS_SSH_KEY: "SSM:/#{ssm_env}/JETS_SSH_KEY",
# JETS_SSH_KNOWN: "SSM:/#{ssm_env}/JETS_SSH_KNOWN"
}
end
The ssm_env
helper returns dev
for JETS_ENV=dev
and prod
for JETS_ENV=prod
. You should create these SSM values:
/dev/BUNDLE_GITHUB__COM
/dev/DOCKER_PASS
/dev/DOCKER_USER
Environment variable BUNDLE_GITHUB__COM
allow the jets remote process to git clone and install private gems in your Gemfile. See: Remote Runner Private Repos
The DOCKER_PASS
and DOCKER_USER
env vars can be use to log into docker. You should set them to log into DockerHub, so it allows DockerHub docker pull
without running into the rate limit. For more info see: CodeBuild Remote Docker.
It is recommended to use your own remote Docker Host with the env var DOCKER_HOST
to speed up builds. See: Remote Docker Host
After jets init
, you’ll adjust boostrap.rb
. It’s not updated much afterward.
Related: SSM CLI Cheatsheet
deploy
The deploy.rb
contains the most options and will be the config you’ll likely adjust most. It controls how the remote runner builds and deploys your project to Serverless AWS Lambda. The jets init
provides a starter deploy.rb
with helpful comments.
config/jets/deploy.rb
Jets.deploy.configure do
# CloudFront Lambda URL https://docs.rubyonjets.com/docs/routing/lambda/cloudfront/distribution/
# config.lambda.url.cloudfront.enable = true
# config.lambda.url.cloudfront.cert.arn = acm_cert_arn(domain: "domain.com", region: "us-east-1")
# config.lambda.url.cloudfront.route53.enable = true
# CloudFront Assets
# config.assets.cloudfront.enable = true
# config.assets.cloudfront.cert.arn = acm_cert_arn(domain: "domain.com", region: "us-east-1")
# config.assets.cloudfront.route53.enable = true
# Release phase https://docs.rubyonjets.com/docs/hooks/remote/release/
# config.release.phase.command = "bundle exec rails db:migrate"
# Scaling https://docs.rubyonjets.com/docs/config/concurrency/
# config.lambda.controller.provisioned_concurrency = 1 # costs money, always running lambda
# config.lambda.controller.reserved_concurrency = 25 # free and limits scaling
# IAM https://docs.rubyonjets.com/docs/iam/app/iam-policies/
# config.lambda.iam.policy = ["sns"]
# config.lambda.iam.managed_policy = ["AmazonS3FullAccess"]
# Docker https://docs.rubyonjets.com/docs/docker/dockerfile/managed/
# config.dockerfile.packages.apt.build_stage = ["default-libmysqlclient-dev"]
# config.dockerfile.packages.apt.deployment_stage = ["default-mysql-client"]
# https://docs.rubyonjets.com/docs/config/package-type/
# config.package_type = "image"
end
The default package type is image
. Jets will deploy a Docker image as a AWS Lambda function. For more info see: Package Types
Next, we’ll make sure the AWS config is set up and working properly. Then you’ll be ready to deploy to AWS Lambda.