Pulumi & Python
Pulumi supports writing your infrastructure as code in the Python language running on any supported version.
Install Python. To reduce potential issues with setting up your Python environment on Windows or macOS, you should install Python through the official Python installer.
Either pip
or poetry
is required to install dependencies. If you installed Python from source, with an installer from
python.org, or via Homebrew you should
already have pip
. If Python is installed using your OS package manager, you may have to install pip
separately, see
Installing pip/setuptools/wheel with Linux Package Managers. For example, on Debian/Ubuntu you must run sudo apt install python3-venv python3-pip
.
To install poetry
follow the installation instructions.
If you're having trouble setting up Python on your machine, see Python 3 Installation & Setup Guide for detailed installation instructions on various operating systems and distributions.
Pulumi Programming Model
The Pulumi programming model defines the core concepts you will use when creating infrastructure as code programs using Pulumi. Concepts describes these concepts with examples available in Python. These concepts are made available to you in the Pulumi SDK.
The Pulumi SDK is available to Python developers as a package distributed on PyPI. To learn more, refer to the Pulumi SDK Reference Guide.
Inputs and Outputs
The Pulumi programming model includes a core concept of Input
and Output
values, which are used to track how outputs of one resource flow in as inputs to another resource. This concept is important to understand when getting started with Python and Pulumi, and the Inputs and Outputs documentation is recommended to get a feel for how to work with this core part of Pulumi in common cases.
In Python, inputs that are objects, that is inputs that group multiple values together, can be represented either as classes or as dictionary literals. The types for the argument classes have the suffix Args
, whereas the types for the dictionaries have the suffix ArgsDict
. Both types take the same arguments, but the dictionary types are often more concise.
ArgsDict
for dictionary literals were introduced in July 2024. You can still use dictionary literals with providers that have not been updated yet with this change, but you will not benefit from the type checking that the new types provide.This example shows two ways to create an s3.Bucket
resource in Python, once using a dictionary literal and once using a class:
import pulumi_aws as aws
bucket1 = aws.s3.Bucket(
"my-bucket-with-dictionary-literals",
website={
"error_document": "error.html",
"index_document": "index.html",
},
)
bucket2 = aws.s3.Bucket(
"my-bucket-with-args",
website=aws.s3.BucketWebsiteArgs(
error_document="error.html",
index_document="index.html",
),
)
Blocking and Asynchronous Code
A Python Pulumi program is single threaded and the Pulumi runtime creates an event loop to enable the runtime to be asynchronous.
Given these constraints, Blocking and Async Python with Pulumi gives some recommendations on using blocking and asynchronous code within Python Pulumi programs.
Using Pulumi PyPI Packages
Virtual Environments
It is not required, but we recommend using a virtual environment to isolate the dependencies of your projects and ensure reproducibility between machines.
When creating a new Python project with pulumi new
, you are offered the choice between pip
(default) and poetry
to manage your dependencies. If you choose pip
, Pulumi will create a virtual environment in a venv
directory with required dependencies from requirements.txt
installed in it. If you choose poetry
, Pulumi will create a pyproject.toml
file and run Poetry to create a virtual environment in its default location. Pulumi requires Poetry version 1.8.0 or later. Pulumi will automatically use this virtual environment when running the program.
This behavior is controlled by the toolchain
and virtualenv
runtime
options in Pulumi.yaml
.
To use pip, set the toolchain
option to pip
, along with the virtualenv
option:
runtime:
name: python
options:
toolchain: pip
virtualenv: venv
virtualenv
is the path to a virtual environment to use.
To use Poetry, set the toolchain
option to poetry
:
runtime:
name: python
options:
toolchain: poetry
To further configure poetry
, you can provide a poetry.toml
configuration file in the project directory.
Existing Python projects that do not use a virtual environment can opt-in to using the built-in virtual environment support by setting the above options. After updating the options, run pulumi install
to create the virtual environment and install dependencies.
Self managed virtual environments
If you prefer to manage the virtual environment on your own (for example, using a tool like Pipenv), you can delete the local venv
directory and unset the virtualenv
option in Pulumi.yaml
:
runtime: python
When managing the virtual environment on your own, you’ll need to run any pulumi
commands (such as pulumi up
) from an activated virtual environment shell (or, if using a tool like Pipenv, prefix any pulumi
commands with pipenv run pulumi ...
).
Type Checking
Pulumi Python libraries ship with type hints. You can manually run a type checking system of your choice when developing with Pulumi to make use of these type hints. As of 3.113.0 Pulumi also has first class support for mypy
and pyright
when running your program.
This behavior is controlled by the following typechecker
runtime
option in Pulumi.yaml
:
runtime:
name: python
options:
typechecker: mypy
When set, Pulumi will invoke the type checker before running your program. This can be used to ensure your program is always type safe when running pulumi up
without you having to remember to run a separate checking command beforehand.
Adding a new dependency
There are many Pulumi Python packages available.
Pip
To install a new dependency in the virtual environment when using pip
, add an entry to requirements.txt
, and run the following in your project directory:
$ venv/bin/pip install -r requirements.txt
$ venv/bin/pip install -r requirements.txt
> venv\Scripts\pip install -r requirements.txt
Poetry
To add a new dependency when using poetry
, run the poetry add
command in your project directory:
$ poetry add ${PACKAGE_NAME}
$ poetry add ${PACKAGE_NAME}
> poetry add ${PACKAGE_NAME}
Dev Versions
Pulumi SDKs also publish pre-release versions that include all the latest changes from the main development branch. If you would like to install a pre-release version, you can use the --pre
flag with pip
or the --allow-prereleaases
flag with poetry
. For example:
pip install --pre -r requirements.txt
poetry add --allow-prereleases ${PACKAGE_NAME}
Package Documentation
In addition to the standard packages the Pulumi Registry houses 100+ Python packages.
Standard Packages
- Pulumi SDK
- pulumi
- Pulumi Policy
- pulumi_policy
- Pulumi Terraform
- pulumi_terraform
Thank you for your feedback!
If you have a question about how to use Pulumi, reach out in Community Slack.
Open an issue on GitHub to report a problem or suggest an improvement.