# Pulumi

This walkthrough shows you how to pass CloudTruth parameters to Pulumi.

## Prerequisites

* You know basic [Pulumi](https://www.pulumi.com/docs/intro/concepts/).
* AWS CLI [configured](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html).
* You have created a [CloudTruth API Access token](https://docs.cloudtruth.com/org-management/access-control/access-tokens) and installed the [CLI](https://docs.cloudtruth.com/cli-and-api/cloudtruth-cli#installation).

## Pulumi deploy with CloudTruth

For this example we will deploy an EC2 instance defining variables with CloudTruth parameters. You can use any target for your deploys.

### Set CloudTruth Pulumi Variables

Create a CloudTruth Project called `Pulumi`.

```
cloudtruth project set Pulumi
```

Now you can create CloudTruth parameters in the Pulumi project that we will pass to Pulumi as [Configuration](https://www.pulumi.com/docs/intro/concepts/config/) values.

```
cloudtruth --project Pulumi parameter set ami -v ami-0c2b8ca1dad447f8a
cloudtruth --project Pulumi parameter set instance_type -v t2.micro
cloudtruth --project Pulumi parameter set availability_zones -v [\"us-east-1a\",\"us-east-1b\",\"us-east-1c\"]
```

### Create a CloudTruth Template

In order for Pulumi to accept run-time configuration parameters, they must be in a [certain format](https://www.pulumi.com/docs/reference/cli/pulumi_config_set/). We can leverage CloudTruth [Templates](https://docs.cloudtruth.com/configuration-management/using-basic-templates) to transform config data to output them in Pulumi's required format.

For this specific example, create a CloudTruth template named **`pulumi-aws-template`** directly from a [template file](https://github.com/cloudtruth-demo/pulumi-template/blob/main/pulumi-aws-template) we have created in GitHub for this demo:

```python
cloudtruth --project Pulumi template set pulumi-aws-template --body <(curl --silent https://raw.githubusercontent.com/cloudtruth-demo/pulumi-template/main/pulumi-aws-template)
```

{% hint style="success" %}
This [template](https://github.com/cloudtruth-demo/pulumi-template/blob/main/pulumi-aws-template) has the following Pulumi config that dynamically references CloudTruth parameters using mustache syntax:\
`--config ami={{ami}} --config instance_type={{instance_type}} --config availability_zones={{{availability_zones}}}`
{% endhint %}

## Deploying a Pulumi stack with CloudTruth

### Create a new Pulumi project

To work with Pulumi, we must start a new [project](https://www.pulumi.com/docs/get-started/aws/create-project/). For this example we will be using AWS cloud with the Python programming language. To get started run:

```python
mkdir pulumi-demo && cd pulumi-demo
pulumi new aws-python
```

**Note:** If you have never used Pulumi before you will be prompted to login after running `pulumi new`.

You will be prompted to provide a project name, description, stack name, and AWS region. The sensible defaults are fine for all of these.

{% hint style="info" %}
The AWS region you select for the Pulumi setup must match the availability zones that you enter as CloudTruth parameters. For this example, we are using **`us-east-1`**.
{% endhint %}

### Create a Pulumi configuration

Next, you must create your Pulumi configuration file. From the Pulumi project directory just created in the last step, update your `__main__.py` with the following configuration:

```python
import pulumi
import pulumi_aws as aws

config = pulumi.Config()
ami = config.require("ami")
instance_type = config.require("instance_type")
availability_zones = config.require_object("availability_zones")

cloudtruth = aws.ec2.Instance("cloudtruth",
    ami=ami,
    instance_type=instance_type,
    availability_zone=availability_zones[0])

pulumi.export("ami", cloudtruth.ami)
pulumi.export("instanceType", cloudtruth.instance_type)
pulumi.export("zone", cloudtruth.availability_zone)
```

This `__main__.py` will deploy an EC2 instance to us-east-1 and defines three variables that are centrally managed by CloudTruth.

{% hint style="info" %}
Pulumi requires [AWS CLI access](https://www.pulumi.com/docs/get-started/aws/begin/#configure-pulumi-to-access-your-aws-account) to deploy to AWS. If you already have the AWS CLI installed and configured, then Pulumi will respect those configuration settings.
{% endhint %}

### Using CloudTruth templates to deploy with Pulumi

The last step is to use `pulumi up` to deploy your Pulumi configuration. Pass in your CloudTruth template created earlier to fill the configuration parameters. This is assuming the project is named **Pulumi** and the template is named **pulumi-aws-template.**

```python
pulumi up $(cloudtruth --project Pulumi templates get pulumi-aws-template)
```

{% hint style="success" %}
Congrats! You have now deployed an instance in EC2 leveraging Pulumi and CloudTruth configuration! 🙌
{% endhint %}

### Cleanup

To tear down all resources, simply run `pulumi destroy` in the project directory.
