/besom

Besom - an experimental pulumi-scala implementation. Also, incidentally, a broom made of twigs tied round a stick. Brooms and besoms are used for protection, to ward off evil spirits, and cleansing of ritual spaces.

Primary LanguageScalaApache License 2.0Apache-2.0

Besom

Besom - a broom made of twigs tied around a stick. Brooms and besoms are used for protection, to ward off evil spirits, and cleansing of ritual spaces. Also, Besom is Scala SDK that allows you to write Pulumi programs in Scala, incidentally.

Besom logo

Besom Scala SDK for Pulumi lets you leverage the full power of Pulumi Infrastructure as Code Platform using the Scala programming language. Scala support is currently in Public Beta.

Pulumi is a registered trademark of Pulumi Corporation.

Welcome

  • Get Started with Besom: Deploy a simple application in AWS, Azure, Google Cloud or Kubernetes using Besom to describe the desired infrastructure using Scala.

  • Besom Docs: Learn about Besom concepts, follow user-guides, and consult the reference documentation.

  • Examples: Browse Scala examples across many clouds and scenarios including containers, serverless, and infrastructure.

Getting Started

  1. Install Pulumi CLI:

    To install the latest Pulumi release, run the following (see full installation instructions for additional installation options):

    curl -fsSL https://get.pulumi.com/ | sh
  2. Install Scala CLI:

    To install the latest Scala CLI release, run the following (see installation instructions for additional installation options):

    curl -sSLf https://scala-cli.virtuslab.org/get | sh
  3. Install Scala Language Plugin in Pulumi:

    To install the latest Scala Language Plugin release, run the following:

    pulumi plugin install language scala --server github://api.github.com/VirtusLab/besom
  4. Create a new project:

    You can start writing your Besom code at this point, but to help you set up Besom comes with Pulumi templates.

    You can get started with the pulumi new command:

    mkdir besom-demo && cd besom-demo
    pulumi new https://github.com/VirtusLab/besom/tree/develop/templates/aws
  5. Deploy to the Cloud:

    Run pulumi up to get your code to the cloud:

    pulumi up

    This makes all cloud resources declared in your code. Simply make edits to your project, and subsequent pulumi ups will compute the minimal diff to deploy your changes.

  6. Use Your Program:

    Now that your code is deployed, you can interact with it. In the above example, we can find the name of the newly provisioned S3 bucket:

    pulumi stack output bucketName
  7. Destroy your Resources:

    After you're done, you can remove all resources created by your program:

    pulumi destroy -y

To learn more, head over to virtuslab.github.io/besom for much more information, including tutorial, examples, and architecture and programming model concepts.

Explaining the project structure

Pulumi.yaml is your main Pulumi file, explained here.

project.scala is the file containing your dependencies for Scala-CLI.

Main.scala is the entry point for your Infrastructure as Code.

Resources created in Pulumi.run { ... } block will be created by Pulumi.

A simple example using Scala CLI:

//> using scala "3.3.1"
//> using plugin "org.virtuslab::besom-compiler-plugin:0.1.0"
//> using dep "org.virtuslab::besom-core:0.1.0"
//> using dep "org.virtuslab::besom-aws:6.2.1-core.0.1.0"

import besom.*
import besom.api.aws

@main def run = Pulumi.run {
   for
      bucket <- aws.s3.Bucket("my-bucket")
   yield exports(
      bucketUrl = bucket.websiteEndpoint
   )
}

Note

Please pay attention to your dependencies, only use org.virtuslab::besom-* and not com.pulumi:*. Besom does NOT depend on Pulumi Java SDK, it is a completely separate implementation.

Tips

  • Whenever you use Besom outside the Pulumi.run block, pass Context with (using besom.Context)
  • Resources are initialized lazily. To make them appear in your physical infrastructure make sure their evaluation is triggered directly or transitively from the main for-comprehension block of your Pulumi program.
  • Use whatever Scala concepts you are familiar with, infrastructure as code in Besom is still a Scala program, so you have the full potential of the language to work with.
  • Pay attention to the types. You will be instantiating case classes to pass parameters, note their package of origin.

Requirements

  • JDK 11 or higher is required
  • Scala 3.3.1 or higher is required

Scala CLI is the recommended build tool, other tools are also supported. Besom will recognize Scala CLI and SBT programs and automatically recompile them without any further configuration. The supported versions are:

  • Scala CLI 1.0.4 or higher
  • SBT 1.9.6 or higher

Other build tools are supported via the runtime.options.binary configuration option that can point to a pre-built jar in Pulumi.yaml, e.g.:

name: myproject
runtime:
  name: scala
  options:
    binary: target/myproject-1.0-SNAPSHOT-jar-with-dependencies.jar

Choice of build tool and IDE

Besom uses Scala-CLI for project compilation and execution.

To set up IDE support for an infrastructural project using Besom execute this command inside the directory in which Besom project files exist:

scala-cli setup-ide .

As a result of this command, a .bsp directory will be created inside the project directory.

When opened, both Intellij IDEA and Metals should automatically recognize the project and set up the IDE accordingly.

sbt is also supported out-of-the-box but is not recommended due to slower iteration speed. Use of sbt support is suggested for situations where managed infrastructure is being added to an already existing project that uses sbt as the main build tool.

IDE setup for sbt works automatically with both Intellij IDEA and Metals.

Mill is not yet supported.

Contributing

Visit CONTRIBUTING.md for information on building Besom from source or contributing improvements.