Jets Init
To generate jets config files need to deploy the Rack project to Serverless AWS Lambda, run:
jets init
You’ll see something like this:
❯ jets init
Detected Rack framework.
This will initialize the project for Jets.
It will make changes to your project source code.
Please make sure you have backed up and committed your changes first.
Are you sure? (y/N) y
create config/jets/bootstrap.rb
create config/jets/deploy.rb
create config/jets/project.rb
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. |
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 = "zip"
end
Since this is a lightweight rack app, we’ll use the zip package type. 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.