# 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](/org-management/access-control/access-tokens.md) and installed the [CLI](/configuration-management/cli-and-api/cloudtruth-cli.md#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](/configuration-management/using-basic-templates.md) 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.cloudtruth.com/configuration-management/integrations/pulumi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
