From dfcf5f78a8dd00cd43c656694360bfb8ea1fc5d5 Mon Sep 17 00:00:00 2001 From: spara Date: Tue, 24 Nov 2020 11:28:11 -0700 Subject: [PATCH] wip --- .../docs/intro/concepts/deploy-resources.png | Bin 0 -> 211711 bytes .../docs/intro/concepts/programming-model.md | 4527 +---------------- .../docs/intro/concepts/programming-model.png | Bin 0 -> 26625 bytes 3 files changed, 49 insertions(+), 4478 deletions(-) create mode 100644 content/docs/intro/concepts/deploy-resources.png create mode 100644 content/docs/intro/concepts/programming-model.png diff --git a/content/docs/intro/concepts/deploy-resources.png b/content/docs/intro/concepts/deploy-resources.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa36ae4d55fcde0b49439a12c9ad80de32f120b GIT binary patch literal 211711 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 BWb*(3 literal 0 HcmV?d00001 diff --git a/content/docs/intro/concepts/programming-model.md b/content/docs/intro/concepts/programming-model.md index bf8beee4bed1..5a4712a01996 100644 --- a/content/docs/intro/concepts/programming-model.md +++ b/content/docs/intro/concepts/programming-model.md @@ -1,5 +1,5 @@ --- -title: "Programming Model" +title: "The Pulumi Programming Model and Environment" meta_desc: An in depth overview of the the Pulumi Programming Model and common terms associated with the platform. menu: intro: @@ -9,4529 +9,100 @@ menu: aliases: ["/docs/reference/programming-model/"] --- -This page describes the Pulumi programming model. These are the core concepts used when authoring an infrastructure as code program. Each program describes a set of desired infrastructure resources; the Pulumi CLI knows how to run, preview, and deploy those resources, both for the initial provisioning, as well as subsequent updating. - -## Introduction {#introduction} +## Concepts {#concepts} In this section, we will see the most basic concepts required to start declaring your infrastructure with Pulumi. Throughout the remainder of this page, we'll examine the ins and outs of Pulumi's programming model concepts. -## Programs {#programs} - -Pulumi programs are written in general-purpose programming languages, including [JavaScript]({{< relref "/docs/intro/languages/javascript" >}}), [TypeScript]({{< relref "/docs/intro/languages/javascript" >}}), [Python]({{< relref "/docs/intro/languages/python" >}}), [Go]({{< relref "/docs/intro/languages/go" >}}) or [any .NET language]({{< relref "/docs/intro/languages/dotnet" >}}) such as C#, F#, or VB. You use the language's native tools and libraries, including [Pulumi's own packages]({{< relref "/docs/reference/pkg" >}}) containing infrastructure resource types. - -Although you use general-purpose languages, Pulumi is still a declarative infrastructure as code tool. After writing a program, you run the Pulumi CLI command `pulumi up`, which executes the program and determines the desired infrastructure state for all resources declared. The CLI will show you a preview of changes to be made, including all new resources to be created and existing resources to update or destroy. After confirming, Pulumi will carry out the changes. - -### Program Structure - -Pulumi programs are structured as projects and stacks. The distinction between them is: - -* [Program](#programs): a collection of files written in your chosen programming language -* [Project]({{< relref "project" >}}): a directory containing a program, with metadata, so Pulumi knows how to run it -* [Stack]({{< relref "stack" >}}): an instance of your project, each often corresponding to a different cloud environment - -Infrastructure and application artifacts can be managed together or separately. For instance, Pulumi can build and publish Docker container images containing application code when you do a `pulumi up`, alongside the private registry and container service infrastructure that consumes it. Equally as well, however, your infrastructure can reference independently deployed artifacts. - -A program becomes a project by virtue of a `Pulumi.yaml` manifest that describes it in the root directory. Each project can be instantiated multiple times. For instance, you can have distinct development, staging, and production stacks. Learn more about [projects]({{< relref "project" >}}) and [stacks]({{< relref "stack" >}}). - -### Declaring Infrastructure - -To declare new infrastructure in your program, allocate a [resource](#resources) _object_ whose _properties_ correspond to the desired state of your infrastructure. Because Pulumi uses existing general-purpose languages, this is done using standard [object-oriented programming](https://en.wikipedia.org/wiki/Object-oriented_programming) techniques. - -For example, this complete program creates a new AWS EC2 security group and an instance that uses it: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let aws = require("@pulumi/aws"); - -let group = new aws.ec2.SecurityGroup("web-sg", { - description: "Enable HTTP access", - ingress: [{ protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] }], -}); - -let server = new aws.ec2.Instance("web-server", { - ami: "ami-6869aa05", - instanceType: "t2.micro", - securityGroups: [ group.name ], // reference the security group resource above -}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -import * as aws from "@pulumi/aws"; - -let group = new aws.ec2.SecurityGroup("web-sg", { - description: "Enable HTTP access", - ingress: [{ protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] }], -}); - -let server = new aws.ec2.Instance("web-server", { - ami: "ami-6869aa05", - instanceType: "t2.micro", - securityGroups: [ group.name ], // reference the security group resource above -}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -import pulumi_aws as aws - -group = aws.ec2.SecurityGroup('web-sg', - description='Enable HTTP access', - ingress=[ - { 'protocol': 'tcp', 'from_port': 80, 'to_port': 80, 'cidr_blocks': ['0.0.0.0/0'] } - ]) - -server = aws.ec2.Instance('web-server', - ami='ami-6869aa05', - instance_type='t2.micro', - security_groups=[group.name]) # reference the security group resource above -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -package main - -import ( - "github.com/pulumi/pulumi-aws/sdk/v3/go/aws/ec2" - "github.com/pulumi/pulumi/sdk/go/pulumi" -) - -func main() { - pulumi.Run(func(ctx *pulumi.Context) error { - group, err := ec2.NewSecurityGroup(ctx, "web-sg", &ec2.SecurityGroupArgs{ - Description: pulumi.String("Enable HTTP access"), - Ingress: ec2.SecurityGroupIngressArray{ - ec2.SecurityGroupIngressArgs{ - Protocol: pulumi.String("tcp"), - FromPort: pulumi.Int(80), - ToPort: pulumi.Int(80), - CidrBlocks: pulumi.StringArray{pulumi.String("0.0.0.0/0")}, - }, - }, - }) - if err != nil { - return err - } - server, err := ec2.NewInstance(ctx, "web-server", &ec2.InstanceArgs{ - Ami: pulumi.String("ami-6869aa05"), - InstanceType: pulumi.String("t2.micro"), - SecurityGroups: pulumi.StringArray{group.Name}, - }) - if err != nil { - return err - } - return nil - }) -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -using System.Threading.Tasks; -using Pulumi; -using Pulumi.Aws.Ec2; -using Pulumi.Aws.Ec2.Inputs; - -class Program -{ - static Task Main() => Deployment.RunAsync(); -} - - -class MyStack : Stack -{ - public MyStack() - { - var group = new SecurityGroup("web-sg", new SecurityGroupArgs { - Description = "Enable HTTP access", - Ingress = { - new SecurityGroupIngressArgs { - Protocol = "tcp", - FromPort = 80, - ToPort = 80, - CidrBlocks = { "0.0.0.0/0" } - } - } - }); - var server = new Instance("web-server", new InstanceArgs { - Ami = "ami-6869aa05", - InstanceType = "t2.micro", - SecurityGroups = { group.Name } - }); - } -} -``` - -{{% /choosable %}} - -{{< /chooser >}} - -In this example, the two resource objects, plus their names and properties, tells Pulumi everything it needs to create, update, or delete your infrastructure. For example, Pulumi now knows you'd like an EC2 security group named `web-sg`, with a single ingress rule, and a `t2.micro`-sized EC2 instance running AMI `ami-8689aa05` using that security group. Pulumi understands the dependencies between resources---thanks to [output properties](#outputs)---which maximizes parallelism and ensures correct ordering. When you run the `pulumi up` command, Pulumi will compute this desired state, compare it to the current infrastructure you already have (if any), show you the delta, and let you confirm and carry out the changes. - -You can export resulting infrastructure values that you wish to access outside your application. For example, adding this code to the example above exports the server's resulting IP address and DNS name: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -// ... -module.exports = { - publicIp: server.publicIp, - publicDns: server.publicDns, -}; -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -// ... -export let publicIp = server.publicIp; -export let publicDns = server.publicDns; -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -# ... -pulumi.export('public_ip', server.public_ip) -pulumi.export('public_dns', server.public_dns) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -// ... - ctx.Export("publicIp", server.PublicIp) - ctx.Export("publicHostName", server.PublicDns) - return nil - }) -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -// ... - this.PublicIp = server.PublicIp; - this.PublicDns = server.PublicDns; - } - - [Output] Output PublicIp { get; set; } - [Output] Output PublicDns { get; set; } -} -``` - -{{% /choosable %}} - -{{< /chooser >}} - -The exported values are printed after you do a `pulumi up` and they are easy to access from the CLI's `pulumi stack output` command. To learn more, see [stack outputs](#stack-outputs) below. - -## Pulumi SDK {#pulumipulumi} - -The Pulumi SDK library defines Pulumi's most fundamental types and functions: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let pulumi = require("@pulumi/pulumi"); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -import * as aws from "@pulumi/pulumi"; -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -import pulumi -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -import "github.com/pulumi/pulumi/sdk/go/pulumi" -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -using Pulumi; -``` - -{{% /choosable %}} - -{{< /chooser >}} - -These are the most essential concepts defined by the Pulumi SDK: - -* [Resources](#resources): how infrastructure is represented in Pulumi -* [Components](#components): create abstractions and aggregate other resources -* [Inputs and Outputs](#outputs): how resource properties and dependencies are represented -* [Secrets](#secrets): a type for encoding and using secrets inside your program -* [Config](#config): using configuration in your program -* [Providers](#providers): classes to control resource provider configuration -* [Stack Outputs](#stack-outputs): functions to export values from a stack -* [Stack References](#stack-references): reference one stack's outputs from another -* [Assets and Archives](#assets-and-archives): use files and folders as inputs to resources -* [Runtime Functions](#runtime-functions): access important metadata and capabilities at runtime - -### Resources {#resources} - -All infrastructure resources are described by subclasses of the {{< pulumi-resource >}} class. There are two families of resources that branch from this base class: - -* {{< pulumi-customresource >}}: external resources managed by a resource provider (most common) -* {{< pulumi-componentresource >}}: an aggregation of many resources to form a larger abstraction - -#### Custom Resources - -A resource's desired state is declared by constructing an instance: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let res = new Resource(name, args, options); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let res = new Resource(name, args, options); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -res = Resource(name, args, options) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -res, err := NewResource(ctx, name, args, opt1, opt2) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var res = new Resource(name, args, options); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -All resources have a required [`name`](#names) argument, which must be unique across resources of the same kind in a [stack]({{< relref "stack" >}}). This _logical name_ influences the _physical name_ assigned by your infrastructure's cloud provider, although [Pulumi auto-names resources](#autonaming) by default, so they may differ. - -The `args` argument is an object with a set of named property input values that are used to initialize the resource. These can be normal raw values---such as strings, integers, lists, and maps---or [outputs from other resources](#outputs). - -The `options` argument is optional, but [lets you control certain aspects of the resource](#resourceoptions), like custom provider configuration, explicit dependencies, or importing existing infrastructure. - -##### Resource Names {#names} - -Every resource managed by Pulumi has a logical name that you specify as an argument to its constructor. For instance, the logical name of this IAM role is `my-role`: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let role = new aws.iam.Role("my-role"); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let role = new aws.iam.Role("my-role"); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -role = iam.Role("my-role") -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -role, err := iam.NewRole(ctx, "my-role", &iam.RoleArgs{}) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var role = new Aws.Iam.Role("my-role"); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -This logical name is used by Pulumi to track the identity of a resource across multiple deployments of the same program and is how Pulumi knows to choose between creating new resources and updating existing ones. - -The name specified during resource creation is used in two key ways: - -1. As a default prefix for the resource's physical name, assigned by the cloud provider. -2. To construct the [Universal Resource Name (URN)](#urns) used to track the resource across updates. - -> Note that the variable names you use for resource objects aren't used in any way for either logical or physical resource naming. The variable simply lets you refer to that resource elsewhere in your program. - -##### Physical Names and Auto-Naming {#autonaming} - -A resource's logical and physical names may not match. In fact, most physical resource names in Pulumi are "auto-named." As a result, even if your IAM role has a logical name of `my-role`, as shown above, the physical name will typically look something like `my-role-d7c2fa0`. - -This random suffix is added for two reasons: - -* It ensures that two stacks for the same project can be deployed without risk of collision. This helps you to multi-instance your project more easily, whether that's for many development or testing stacks, or even scaling to new regions. Without auto-naming, you would need to manually distinguish these resources with different physical names. - -* It allows Pulumi to do zero-downtime resource updates. Certain updates require replacing resources, rather than updating them in place, due to the way cloud providers work. By default, Pulumi creates replacements first, then updates existing references to them, and finally deletes the old resources. If it weren't for auto-naming, Pulumi would need to do things in a very different order: namely, it would need to delete resources first, and create new instances afterwards, which is far more impactful and leads to downtime. - -Auto-naming can be overridden by manually specifying a physical name on your resource for use cases that require precise names. Most resources offer this option by way of a `name` property that may be specified in the argument object to the constructor: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let role = new aws.iam.Role("my-role", { - name: "my-role-001", -}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let role = new aws.iam.Role("my-role", { - name: "my-role-001", -}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -role = iam.Role('my-role', { - name='my-role-001' -}) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -role, err := iam.NewRole(ctx, "my-role", &iam.RoleArgs{ - Name: pulumi.String("my-role-001"), -}) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var role = new Aws.Iam.Role("my-role", new Aws.Iam.RoleArgs -{ - Name = "my-role-001", -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -> If `name` doesn't work, consult the documentation for the specific resource you are creating. Some resources use a different property to override the auto-naming. For instance, the `aws.s3.Bucket` type uses the property `bucket` instead of `name`. Other resources, like `aws.kms.Key`, don't even have physical names and instead use other auto-generated IDs to uniquely identify them. - -Overriding auto-naming opens your project up to naming collisions. As a result, for resources that may need to be replaced, you should specify [`deleteBeforeReplace: true` in the resources's options](#deletebeforereplace). This ensures old resources are deleted before new ones are recreated. - -The physical and logical names don't need to match. You may even elect to construct the name using your project and stack names. This protects you from naming collisions similar to auto-naming while still having nice names, although `deleteBeforeReplace` is still necessary: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let role = new aws.iam.Role("my-role", { - name: "my-role-" + pulumi.getProject() + "-" + pulumi.getStack(), -}, { deleteBeforeReplace: true }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let role = new aws.iam.Role("my-role", { - name: `my-role-${pulumi.getProject()}-${pulumi.getStack()}`, -}, { deleteBeforeReplace: true }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -role = iam.Role('my-role', { - name='my-role-{}-{}'.format(pulumi.get_project(), pulumi.get_stack()) -}, opts=ResourceOptions(delete_before_replace=True)) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -role, _ := iam.NewRole(ctx, "my-role", &iam.RoleArgs{ - Name: fmt.Sprintf("my-role-%s-%s", ctx.Project(), ctx.Stack()), -}, pulumi.DeleteBeforeReplace(true)) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var role = new Aws.Iam.Role("my-role", new Aws.Iam.RoleArgs - { - Name = string.Format($"my-role-{Deployment.Instance.ProjectName}-{Deployment.Instance.StackName}"), - }, - new CustomResourceOptions { DeleteBeforeReplace = true } -); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -##### Resource URNs {#urns} - -Each resource is assigned a [Uniform Resource Name (URN)](https://en.wikipedia.org/wiki/Uniform_Resource_Name) which globally uniquely identifies that resource. You will seldom need to interact with an URN directly, unless you are writing a tool, but it is fundamental to how Pulumi works, so it's good to have a general awareness of it. - -The URN is automatically constructed from the project name, stack name, resource name, resource type, and the types of all the parent resources (in the case of component resources). For example: - -``` -urn:pulumi:production::acmecorp-website::custom:resources:Resource$aws:s3/bucket:Bucket::my-bucket - ^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ - -``` - -The URN must be globally unique. This means all of the components that go into a URN must be unique within your program. If you create two resources of the same name, type, and parent path, for instance, you will see an error: - -``` -error: Duplicate resource URN 'urn:pulumi:production::acmecorp-website::custom:resources:Resource$aws:s3/bucket:Bucket::my-bucket'; try giving it a unique name -``` - -Any change to the URN of a resource will cause the old and new resources to be treated as unrelated---the new one will be created (since it was not in the prior state) and the old one will be deleted (since it is not in the new desired state). This happens when you change the `name` used to construct the resource or the structure of a resource's parent hierarchy. Both of these operations will lead to a different URN, and thus `create` and `delete` operations instead of an `update` or `replace` operation on the existing resource. As a result, changes to names must be made with care. - -> If you'd like to rename a resource without destroying the old one, refer to the [`aliases`](#aliases) capability. - -Resources constructed as children of a [component](#components) should make sure that their names will be unique across multiple instances of the component. In general, the name of the component instance itself (the `name` parameter passed in to the component constructor) shoud be used as part of the name of the child resources. - -##### Resource Arguments - -A resource's expected argument parameter will differ by resource type. Each resource specifies a number of named input properties that control all of the behavior of the resulting infrastructure. To determine what arguments a resource supports, refer to that resource's [API documentation]({{< relref "/docs/reference/pkg" >}}). - -##### Resource Options {#resourceoptions} - -All resource constructors also accept an `options` argument which can provide the following additional resource options controlling how the resource will be managed by Pulumi: - -* [`additionalSecretOutputs`](#additionalsecretoutputs): specify properties that must be encrypted as secrets -* [`aliases`](#aliases): specify aliases for this resource, so that renaming or refactoring doesn't replace it -* [`customTimeouts`](#customtimeouts): override the default retry/timeout behavior for resource provisioning -* [`deleteBeforeReplace`](#deletebeforereplace): override the default create-before-delete behavior when replacing -* [`dependsOn`](#dependson): specify additional explicit dependencies in addition to the automatic ones -* [`ignoreChanges`](#ignorechanges): declare that changes to certain properties should be ignored during diffing -* [`import`](#import): adopt an existing resource from your cloud account under the control of Pulumi -* [`parent`](#parent): establish a parent/child relationship between resources -* [`protect`](#protect): prevent accidental deletion of a resource by marking it protected -* [`provider`](#provider): pass an [explicitly configured provider](#explicit-provider-configuration), instead of using the default global provider -* [`transformations`](#transformations): dynamically transform a resource's properties on the fly -* [`version`](#version): pass a provider plugin version that should be used when operating on a resource. - -###### `additionalSecretOutputs` - -This option specifies a list of named output properties which should be treated as [secrets](#secrets), ensuring that they are encrypted. This augments the list of values that Pulumi detects itself based on secret inputs to the resource. - -This example ensures the password generated for a database resource is an encrypted secret: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let db = new Database("new-name-for-db", { /*...*/ }, - { additionalSecretOutputs: ["password"] }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let db = new Database("new-name-for-db", { /*...*/ }, - { additionalSecretOutputs: ["password"] }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -db = Database('db', - opts=ResourceOptions(additional_secret_outputs=['password'])) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -db, err := NewDatabase(ctx, "db", &DatabaseArgs{ /*...*/ }, - pulumi.AdditionalSecretOutputs([]string{"password"})) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var db = new Database("new-name-for-db", new DatabaseArgs(), - new CustomResourceOptions { AdditionalSecretOutputs = { "password" } }); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -Only entire top-level resource properties can be marked secret, so if there is sensitive data nested inside of a property, the entire top-level output property must be marked as secret. - -###### `aliases` - -This option provides a list of aliases for a resource or component. If you're changing the name, type, or parent path of a resource or component, you can add the old name to the list of `aliases` for a resource to ensure that existing resources will be migrated to the new name instead of being deleted and replaced with the new named resource. - -For example, imagine we changed our database resource's name from `"old-name-for-db"` to `"new-name-for-db"`. By default, when we run `pulumi up`, we will see that the old resource will be deleted, and the new one created. If we annotate that resource with the `aliases` option, however, it will be updated in-place instead: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let db = new Database("new-name-for-db", {/*...*/}, - { aliases: [{ name: "old-name-for-db" }] }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let db = new Database("new-name-for-db", {/*...*/}, - { aliases: [{ name: "old-name-for-db" }] }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -db = Database('db', - opts=ResourceOptions(aliases=[Alias(name='old-name-for-db')])) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -db, err := NewDatabase(ctx, "db", &DatabaseArgs{ /*...*/ }, - pulumi.Aliases(pulumi.Alias{Name: pulumi.String("old-name-for-db")})) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var db = new Database("new-name-for-db", new DatabaseArgs(), - new CustomResourceOptions { Aliases = { new Alias { Name = "old-name-for-db"} } }); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -The `aliases` option accepts a list of old identifiers. If a resource has been renamed multiple times, it may contain many. This list may contain old `Alias` objects and/or old [resource URNs](#urns). - -The above example used `Alias` objects with the old resource names. These values may specify any combination of the old name, type, parent, stack, and/or project values. Alternatively, you can just specify the URN directly: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let db = new Database("new-name-for-db", {/*...*/}, - { aliases: [ "urn:pulumi:stackname::projectname::aws:rds/database:Database::old-name-for-db" ] }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let db = new Database("new-name-for-db", {/*...*/}, - { aliases: [ "urn:pulumi:stackname::projectname::aws:rds/database:Database::old-name-for-db" ] }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -db = Database('db', - opts=ResourceOptions(aliases=['urn:pulumi:stackname::projectname::aws:rds/database:Database::old-name-for-db'])) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -db, err := NewDatabase(ctx, "db", &DatabaseArgs{ /*...*/ }, - pulumi.Aliases([]pulumi.Alias{pulumi.Alias{ - URN: pulumi.URN("urn:pulumi:stackname::projectname::aws:rds/database:Database::old-name-for-db"), - }}) -) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var db = new Database("new-name-for-db", new DatabaseArgs(), - new CustomResourceOptions { Aliases = { new Alias { - Urn = "urn:pulumi:stackname::projectname::aws:rds/database:Database::old-name-for-db" } } }); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -###### `customTimeouts` - -This option provides a set of custom timeouts for `create`, `update`, and `delete` operations on a resource. These timeouts are specified using a duration string like `"5m"` (5 minutes), `"40s"` (40 seconds), or `"1d"` (1 day). Supported duration units are `"ns"`, `"us"` (or `"µs"`), `"ms"`, `"s"`, `"m"`, and `"h"` (nanoseconds, microseconds, milliseconds, seconds, minutes, and hours, respectively). - -> For the most part, Pulumi automatically waits for operations to complete, and times out appropriately. In some circumstances, however, including working around bugs in the infrastructure provider, custom timeouts may be necessary. - -This example specifies that the create operation should wait up to 30 minutes to complete, before timing out: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let db = new Database("db", {/*...*/}, - { customTimeouts: { create: "30m" } }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let db = new Database("db", {/*...*/}, - { customTimeouts: { create: "30m" } }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -db = Database('db', - opts=ResourceOptions(custom_timeouts=CustomTimeouts(create='30m'))) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -db, err := NewDatabase(ctx, "db", &DatabaseArgs{ /*...*/ }, - pulumi.Timeouts(&pulumi.CustomTimeouts{Create: "30m"})) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var db = new Database("db", new DatabaseArgs(), - new CustomResourceOptions { - CustomTimeouts = new CustomTimeouts { Create = TimeSpan.FromMinutes(30) } - }); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -###### `deleteBeforeReplace` - -A resource may need to be replaced if an immutable property is changed. In these cases, the cloud provider does not support updating an existing resource, and so a new instance will be created, and the old one deleted. By default, Pulumi will create new instances of resources, before deleting old ones, during a replacement operation. This minimizes downtime. - -Setting the `deleteBeforeReplace` option to `true` specifies that replacements of the resource should _first_ delete the existing resource _before_ creating its replacement. This has a cascading impact on dependencies and may result in replacement of many more resources than the default behavior, often leading to downtime. However, this may be necessary for some resources that manage scarce resources behind the scenes, and/or resources that cannot exist side-by-side. - -This example requests that our database is deleted entirely before its replacement is created: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let db = new Database("db", {/*...*/}, - { deleteBeforeReplace: true}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let db = new Database("db", {/*...*/}, - { deleteBeforeReplace: true}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -db = Database("db", - opts=ResourceOptions(delete_before_replace=True)) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -db, err := NewDatabase(ctx, "db", &DatabaseArgs{ /*...*/ }, - pulumi.DeleteBeforeReplace(true)) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -// The resource will be deleted before it's replacement is created -var db = new Database("db", new DatabaseArgs(), - new CustomResourceOptions { DeleteBeforeReplace = true }); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -###### `dependsOn` - -The `dependsOn` option provides a list of explicit resource dependency resources. - -Pulumi automatically tracks dependencies between resources when you supply an input argument that came from another resource's [output properties](#outputs). In some cases, however, you may need to explicitly specify additional dependencies that Pulumi doesn't know about, but must respect. This might happen if a dependency is external to the infrastructure itself---such as an application dependency---or is implied due to an ordering or eventual consistency requirement. These dependencies ensure that resource creation, update, and deletion is done in the correct order. - -This example demonstrates making `res2` dependent on `res1`, even if there is no property-level dependency: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let res1 = new MyResource("res1", {/*...*/}); -let res2 = new MyResource("res2", {/*...*/}, { dependsOn: [res1] }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let res1 = new MyResource("res1", {/*...*/}); -let res2 = new MyResource("res2", {/*...*/}, { dependsOn: [res1] }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -res1 = MyResource("res1"); -res2 = MyResource("res2", opts=ResourceOptions(depends_on=[res1])); -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -res1, _ := NewMyResource(ctx, "res1", &MyResourceArgs{/*...*/}) -res2, _ := NewMyResource(ctx, "res2", &MyResourceArgs{/*...*/}, pulumi.DependsOn([]Resource{res1})) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var res1 = new MyResource("res1", new MyResourceArgs()); -var res2 = new MyResource("res2", new MyResourceArgs(), - new CustomResourceOptions { DependsOn = { res1 } }); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -###### `ignoreChanges` - -This option specifies a list of properties which will be ignored when updating existing resources. Any properties specified in this list, that are also specified in the resource's arguments, will only be used when creating the resource---and ignored entirely while updating it. - -For instance, in this example, the resource's `prop` property will have its value of `"new-value"` set when initially creating resource, but from then on, any and all changes will be ignored: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let res = new MyResource("res", - { prop: "new-value" }, { ignoreChanges: ["prop"] }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let res = new MyResource("res", - { prop: "new-value" }, { ignoreChanges: ["prop"] }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -res = MyResource("res", - prop="new-value", - opts=ResourceOptions(ignore_changes=["prop"])) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -res, _ := NewMyResource(ctx, "res", - &MyResourceArgs{Prop: "new-value"}, - pulumi.IgnoreChanges([]string{"prop"})) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var res = new MyResource("res", - new MyResourceArgs { Prop = "new-value" }, - new CustomResourceOptions { IgnoreChanges = { "prop" } }); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -You would use the `ignoreChanges` option to avoid changes in properties leading to diffs or to change defaults for a property without forcing all existing deployed stacks to update or replace the affected resource. This is common after you've imported existing infrastructure provisioned by another method into Pulumi, where there may be historical drift that you'd prefer to retain than have to replace and reconstruct some critical parts of your infrastructure. - -> **Note:** The property names passed to `ignoreChanges` should always be the "camelCase" version of -> the property name as used in the core Pulumi resource model. - -###### `import` - -This option lets you import an existing cloud resource, such that Pulumi takes over management of it. Imported resources may have been provisioned by any method, including manually in the cloud console or cloud CLI, with a different infrastructure as code tool, and so on. - -To import a resource, first specify the `import` option with the resource's ID. This ID is the same that would be returned by the `id` property for any resource created by Pulumi; this is resource-specific. Pulumi reads the current state of the resource with the given ID from the backing provider, such as AWS, Azure, GCP, or Kubernetes. - -Next, you must also specify all required arguments to the resource constructor, such that it exactly matches the state to import. In this manner, the final program you end up with is capable of accurately generating matching desired state. - -This example imports an existing EC2 security group with ID `sg-04aeda9a214730248` and instance with ID `i-06a1073de86f4adef`: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let aws = require("@pulumi/aws"); - -let group = new aws.ec2.SecurityGroup("web-sg", { - name: "web-sg-62a569b", - ingress: [{ protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] }], -}, { import: "sg-04aeda9a214730248" }); - -let server = new aws.ec2.Instance("web-server", { - ami: "ami-6869aa05", - instanceType: "t2.micro", - securityGroups: [ group.name ], -}, { import: "i-06a1073de86f4adef" }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -import * as aws from "@pulumi/aws"; - -let group = new aws.ec2.SecurityGroup("web-sg", { - name: "web-sg-62a569b", - ingress: [{ protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] }], -}, { import: "sg-04aeda9a214730248" }); - -let server = new aws.ec2.Instance("web-server", { - ami: "ami-6869aa05", - instanceType: "t2.micro", - securityGroups: [ group.name ], -}, { import: "i-06a1073de86f4adef" }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -# IMPORTANT: Python appends an underscore (`import_`) to avoid conflicting with the keyword. - -import pulumi_aws as aws - -group = aws.ec2.SecurityGroup('web-sg', - name='web-sg-62a569b', - description='Enable HTTP access', - ingress=[ - { 'protocol': 'tcp', 'from_port': 80, 'to_port': 80, 'cidr_blocks': ['0.0.0.0/0'] } - ], - opts=ResourceOptions(import_='sg-04aeda9a214730248')) - -server = aws.ec2.Instance('web-server', - ami='ami-6869aa05', - instance_type='t2.micro', - security_groups=[group.name], - opts=ResourceOptions(import_='i-06a1073de86f4adef')) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -group, err := ec2.NewSecurityGroup(ctx, "web-sg", - &ec2.SecurityGroupArgs{ - Name: pulumi.String("web-sg-62a569b"), - Description: pulumi.String("Enable HTTP access"), - Ingress: ec2.SecurityGroupIngressArray{ - ec2.SecurityGroupIngressArgs{ - Protocol: pulumi.String("tcp"), - FromPort: pulumi.Int(80), - ToPort: pulumi.Int(80), - CidrBlocks: pulumi.StringArray{pulumi.String("0.0.0.0/0")}, - }, - }, - }, - pulumi.Import(pulumi.ID("sg-04aeda9a214730248")), -) -if err != nil { - return err -} -server, err := ec2.NewInstance(ctx, "web-server", - &ec2.InstanceArgs{ - Ami: pulumi.String("ami-6869aa05"), - InstanceType: pulumi.String("t2.micro"), - SecurityGroups: pulumi.StringArray{group.Name}, - }, - pulumi.Import(pulumi.ID("i-06a1073de86f4adef")), -) -if err != nil { - return err -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var group = new SecurityGroup("web-sg", - new SecurityGroupArgs { - Name = "web-sg-62a569b", - Description = "Enable HTTP access", - Ingress = { - new SecurityGroupIngressArgs { - Protocol = "tcp", - FromPort = 80, - ToPort = 80, - CidrBlocks = { "0.0.0.0/0" } - } - } - }, - new CustomResourceOptions { - ImportId = "sg-04aeda9a214730248" - } -); -var server = new Instance("web-server", - new InstanceArgs { - Ami = "ami-6869aa05", - InstanceType = "t2.micro", - SecurityGroups = { group.Name } - }, - new CustomResourceOptions { - ImportId = "i-06a1073de86f4adef" - } -); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -For this to work, your Pulumi stack must be configured correctly---e.g., in this case, the correct AWS region. - -If the resource's arguments differ from the imported state, the import will fail. This will result in a message, `warning: inputs to import do not match the existing resource; importing this resource will fail`; selecting "details" in the `pulumi up` preview will show you exactly what differs. Attempting to proceed will fail with a message, `error: inputs to import do not match the existing resource`. To fix these errors, ensure that your program computes state that matches the resource to be imported fully. - -> Because of auto-naming, it is common to run into this when importing a resource's name property. Unless you explicitly specify a name, Pulumi will auto-generate one, which is guaranteed not to match, because it will have a random hex suffix. To fix this problem, [explicitly specify the resource's name](#autonaming). Notice that has been done in the above example for the EC2 security group, by passing `"web-sg-62a569b"` as its name property in its arguments. - -Once a resource has been successfully imported, remove the `import` option, and Pulumi will have adopted the resource fully. - -###### `parent` - -This option specifies a parent for the resource. This is used to associate children to the parents that encapsulate or are responsible for them, as with [component resources](#components). The default behavior is to parent each resource to the implicitly-created `pulumi:pulumi:Stack` component resource that is a root resource for all Pulumi stacks. - -For example, this code creates two resources, a `parent` and `child`, the latter of which is parented to the former: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let parent = new MyResource("parent", {/*...*/}); -let child = new MyResource("child", {/*...*/}, { parent: parent }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let parent = new MyResource("parent", {/*...*/}); -let child = new MyResource("child", {/*...*/}, { parent: parent }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -parent = MyResource("parent"); -child = MyResource("child", opts=ResourceOptions(parent=parent)); -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -parent, _ := NewMyResource(ctx, "parent", &MyResourceArgs{/*...*/}) -child, _ := NewMyResource(ctx, "child", &MyResourceArgs{/*...*/}, pulumi.Parent(parent)) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var parent = new MyResource("parent", new MyResourceArgs()); -var child = new MyResource("child", new MyResourceArgs(), - new CustomResourceOptions { Parent = parent }); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -Using parents can help to understand causality; that is, why a given resource was created in the first place. For example, this `pulumi up` output shows that we have an AWS Virtual Private Cloud (VPC) with two subnets attached to it, and that this VPC directly belongs to the implicit `pulumi:pulumi:Stack` resource: - -``` -Previewing update (dev): - - Type Name Plan - pulumi:pulumi:Stack parent-demo-dev - + ├─ awsx:x:ec2:Vpc default-vpc-866580ff create - + │ ├─ awsx:x:ec2:Subnet default-vpc-866580ff-public-1 create - + │ └─ awsx:x:ec2:Subnet default-vpc-866580ff-public-0 create -``` - -###### `protect` - -Marks a resource as protected. A protected resource cannot be deleted directly: First, you must set `protect: false` and run `pulumi up`. Then, you can delete the resource by removing the line of code or by running `pulumi destroy`. The default is to inherit this value from the parent resource, and `false` for resources without a parent. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let db = new Database("db", {}, { protect: true}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let db = new Database("db", {}, { protect: true}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -db = Database("db", opts=ResourceOptions(protect=True)) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -db, _ := NewDatabase(ctx, "db", &DatabaseArgs{}, pulumi.Protect(true)); -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var db = new Database("db", new DatabaseArgs(), - new CustomResourceOptions { Protect = true }); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -###### `provider` - -A provider for the resource. See [Providers](#providers). The default is to inherit this value from the parent resource, and to use the ambient provider specified by Pulumi configuration for resources without a parent. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let provider = new aws.Provider("provider", { region: "us-west-2" }); -let vpc = new aws.ec2.Vpc("vpc", {}, { provider: provider }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let provider = new aws.Provider("provider", { region: "us-west-2" }); -let vpc = new aws.ec2.Vpc("vpc", {}, { provider: provider }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -provider = Provider("provider", region="us-west-2") -vpc = ec2.Vpc("vpc", opts=ResourceOptions(provider=provider)) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -provider, _ := aws.NewProvider(ctx, "provider", &aws.ProviderArgs{Region: pulumi.StringPtr("us-west-2")}) -vpc, _ := ec2.NewVpc(ctx, "vpc", &ec2.VpcArgs{}, pulumi.Provider(provider)) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var provider = new Aws.Provider("provider", new Aws.ProviderArgs { Region = "us-west-2" }); -var vpc = new Aws.Ec2.Vpc("vpc", new Aws.Ec2.VpcArgs(), - new CustomResourceOptions { Provider = provider }); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -###### `transformations` - -The `transformations` option provides a list of transformations to apply to the resource and all of its children. This can be used to override or modify the inputs to child resources of a component, for example to add other resource options (like `ignoreChanges` or `protect`) or to modify an input property (like adding to `tags` or changing a property which is not configurable via the component directly). - -Each transformation is a callback that gets invoked by the Pulumi runtime, and receives the resource type, name, input properties, resource options, and the resource instance object itself. The callback can return a new set of resource input properties and resource options which will replace and be used to construct the resource instead of the original values. - -This example looks for all VPC and Subnet resources inside of a component's child hierarchy, and adds an option to ignore any changes for `tags` properties on them (perhaps because we manage all VPC and Subnet tags outside of Pulumi): - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -const vpc = new MyVpcComponent("vpc", {}, { - transformations: [args => { - if (args.type === "aws:ec2/vpc:Vpc" || args.type === "aws:ec2/subnet:Subnet") { - return { - props: args.props, - opts: pulumi.mergeOptions(args.opts, { ignoreChanges: ["tags"] }) - } - } - return undefined; - }], -}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -const vpc = new MyVpcComponent("vpc", {}, { - transformations: [args => { - if (args.type === "aws:ec2/vpc:Vpc" || args.type === "aws:ec2/subnet:Subnet") { - return { - props: args.props, - opts: pulumi.mergeOptions(args.opts, { ignoreChanges: ["tags"] }) - } - } - return undefined; - }], -}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -def transformation(args: ResourceTransformationArgs): - if args.type_ == "aws:ec2/vpc:Vpc" or args.type_ == "aws:ec2/subnet:Subnet": - return ResourceTransformationResult( - props=args.props, - opts=ResourceOptions.merge(args.opts, ResourceOptions( - ignore_changes=["tags"], - ))) - -vpc = MyVpcComponent("vpc", opts=ResourceOptions(transformations=[transformation])) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -transformation := func(args *pulumi.ResourceTransformationArgs) *pulumi.ResourceTransformationResult { - if args.Type == "aws:ec2/vpc:Vpc" || args.Type == "aws:ec2/subnet:Subnet" { - return &pulumi.ResourceTransformationResult{ - Props: args.Props, - Opts: append(args.Opts, pulumi.IgnoreChanges([]string{"tags"})) - } - } - return nil -} - -vpc := MyVpcComponent("vpc", pulumi.Transformations([]pulumi.ResourceTransformation{transformation})) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var vpc = new MyVpcComponent("vpc", new ComponentResourceOptions -{ - ResourceTransformations = - { - args => - { - if (args.Resource.GetResourceType() == "aws:ec2/vpc:Vpc" || - args.Resource.GetResourceType() == "aws:ec2/subnet:Subnet") - { - var options = CustomResourceOptions.Merge( - (CustomResourceOptions) args.Options, - new CustomResourceOptions { IgnoreChanges = {"tags"} }); - return new ResourceTransformationResult(args.Args, options); - } - - return null; - } - } -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -{{% choosable language "typescript,javascript,python,go" %}} -Transformations can also be applied in bulk to many resources in a stack by using the `registerStackTransformation` function. -{{% /choosable %}} - -{{% choosable language "csharp" %}} -Transformations can also be applied in bulk to many resources in a stack by using the `Stack` constructor's `StackOptions.ResourceTransformations` property: - -```csharp -public class MyStack : Stack -{ - public MyStack() : base(new StackOptions { ResourceTransformations = ... }) - { - ... - } -} -``` - -{{% /choosable %}} - -###### `version` - -An optional provider version to use when operating on the the resource. This version overrides the version information inferred from the current package and should rarely be used. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let vpc = new aws.ec2.Vpc("vpc", {}, { version: "2.10.0" }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let vpc = new aws.ec2.Vpc("vpc", {}, { version: "2.10.0" }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -vpc = ec2.Vpc("vpc", opts=ResourceOptions(version="2.10.0")) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -vpc, _ := ec2.NewVpc(ctx, "vpc", &ec2.VpcArgs{}, pulumi.Version("2.10.0")) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var vpc = new Aws.Ec2.Vpc("vpc", new Aws.Ec2.VpcArgs(), - new CustomResourceOptions { Version = "2.10.0" }); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -##### Resource Getter Functions {#resource-get} - -It's possible to look up an existing resource by its ID using the static `get` function that is available on all resource types. This differs from `import` functionality in that, although the resulting resource object's state will match the live state from an existing environment, its management will not come under the control of Pulumi. A resource read in this manner will never be updated or deleted by Pulumi during the course of an update. - -This can be used to consume properties from a resource provisioned elsewhere. For example, this program reads an existing EC2 Security Group whose ID is `sg-0dfd33cdac25b1ec9` and uses it as input when creating an EC2 Instance: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let aws = require("@pulumi/aws"); - -let group = aws.ec2.SecurityGroup.get("group", "sg-0dfd33cdac25b1ec9"); - -let server = new aws.ec2.Instance("web-server", { - ami: "ami-6869aa05", - instanceType: "t2.micro", - securityGroups: [ group.name ], // reference the security group resource above -}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -import * as aws from "@pulumi/aws"; - -let group = aws.ec2.SecurityGroup.get("group", "sg-0dfd33cdac25b1ec9"); - -let server = new aws.ec2.Instance("web-server", { - ami: "ami-6869aa05", - instanceType: "t2.micro", - securityGroups: [ group.name ], // reference the security group resource above -}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -import pulumi_aws as aws - -group = aws.ec2.SecurityGroup.get('group', 'sg-0dfd33cdac25b1ec9') - -server = aws.ec2.Instance('web-server', - ami='ami-6869aa05', - instance_type='t2.micro', - security_groups=[group.name]) # reference the security group resource above -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -import ( - "github.com/pulumi/pulumi-aws/sdk/v3/go/aws/ec2" - "github.com/pulumi/pulumi/sdk/go/pulumi" -) - -func main() { - pulumi.Run(func(ctx *pulumi.Context) error { - group, err := ec2.GetSecurityGroup(ctx, "group", pulumi.ID("sg-0dfd33cdac25b1ec9"), nil) - if err != nil { - return err - } - server, err := ec2.NewInstance(ctx, "web-server", &ec2.InstanceArgs{ - Ami: pulumi.String("ami-6869aa05"), - InstanceType: pulumi.String("t2.micro"), - SecurityGroups: pulumi.StringArray{group.Name}, - }) - if err != nil { - return err - } - return nil - }) -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -using Pulumi; -using Pulumi.Aws.Ec2; -using Pulumi.Aws.Ec2.Inputs; - -class MyStack : Stack -{ - public MyStack() - { - var group = SecurityGroup.Get("group", "sg-0dfd33cdac25b1ec9"); - - var server = new Instance("web-server", new InstanceArgs { - Ami = "ami-6869aa05", - InstanceType = "t2.micro", - SecurityGroups = { group.Name } - }); - } -} -``` - -{{% /choosable %}} - -{{< /chooser >}} - -Note that two values are passed to the `get` function - the logical name Pulumi will use to refer to the resource, and the physical ID that the resource has in the target cloud. - -Importantly, Pulumi will never attempt to modify the Security Group in this example. It simply reads back its state from your currently configured cloud account, and then uses it as input for the EC2 Instance. - -### Components {#components} - -A component resource is a logical grouping of other resources. Components usually instantiate a set of other related resources in their constructor, aggregating them as children, and creating a larger, useful abstraction that encapsulates its implementation details. - -Here are a few examples of components: - -* A `Vpc` that automatically comes with built-in best practices. -* An `AcmeCorpVirtualMachine` that adheres to your company's requirements, like tagging. -* A `KubernetesCluster` that can create EKS, AKS, and GKE clusters depending on the target. - -The implicit `pulumi:pulumi:Stack` resource is itself a component that contains all top-level resources in a program. - -#### Authoring a New Component - -To author your own new component, either in a program or in a reusable library, create a subclass of {{< pulumi-componentresource >}}. Inside of its constructor, you will chain to the base constructor, passing its type string, name, arguments, and options. Also inside of its constructor, you will allocate any child resources, passing the [`parent`](#parent) option as appropriate to ensure component children are parented correctly. - -Here's a simple component example: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -class MyComponent extends pulumi.ComponentResource { - constructor(name, opts) { - super("pkg:index:MyComponent", name, {}, opts); - } -} -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -class MyComponent extends pulumi.ComponentResource { - constructor(name, opts) { - super("pkg:index:MyComponent", name, {}, opts); - } -} -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -class MyComponent(pulumi.ComponentResource): - def __init__(self, name, opts = None): - super().__init__('pkg:index:MyComponent', name, None, opts) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -type MyComponent struct { - pulumi.ResourceState -} - -func NewMyComponent(ctx *pulumi.Context, name string, opts ...pulumi.ResourceOption) (*MyComponent, error) { - myComponent := &MyComponent{} - err := ctx.RegisterComponentResource("pkg:index:MyComponent", name, myComponent, opts...) - if err != nil { - return nil, err - } - - return myComponent, nil -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -class MyComponent : Pulumi.ComponentResource -{ - public MyComponent(string name, ComponentResourceOptions opts) - : base("pkg:index:MyComponent", name, opts) - { - // initialization logic. - - // Signal to the UI that this resource has completed construction. - this.RegisterOutputs(); - } -} -``` - -{{% /choosable %}} - -{{< /chooser >}} - -Upon creating a new instance of `MyComponent`, the call to the base constructor (using `super`/`base`) registers the component instance with the Pulumi engine. This records the resource's state and tracks it across program deployments so that you see diffs during updates like a regular resource (even though components have no provider logic associated with them). Since all resources must have a name, a component constructor should accept a name and pass it to `super`. - -> If you wish to have full control over a custom resource's lifecycle---including running specific code when a resource has been updated or deleted---you should look into [dynamic providers](#dynamicproviders). These let you create full-blown resource abstractions in your language of choice. - -A component must register a unique type name, such as `pkg:index:MyComponent` in the previous example. To reduce the potential of other type name conflicts, this name contains the package and module name, in addition to the type: `::`. These names are namespaced alongside non-component resources, such as `aws:lambda:Function`. - -For more information about components, [see the Pulumi Components tutorial]({{< relref "/docs/tutorials/aws/s3-folder-component" >}}). - -#### Creating Child Resources - -Components will often contain child resources. This entails two things. First, the names are often derived from the component's name, to ensure uniqueness, such as by using the component's name as a prefix. Second, children must be registered as such, by passing the component itself as [the `parent` option](#parent) when constructing a resource. - -This example demonstrates both: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let bucket = new aws.s3.Bucket(`${name}-bucket`, - {/*...*/}, { parent: this }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let bucket = new aws.s3.Bucket(`${name}-bucket`, - {/*...*/}, { parent: this }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -bucket = s3.Bucket(f"{name}-bucket", - opts=pulumi.ResourceOptions(parent=self)) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -bucket, err := s3.NewBucket(ctx, fmt.Sprintf("%s-bucket", name), - &s3.BucketArgs{ /*...*/ }, pulumi.Parent(myComponent)) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var bucket = new Aws.S3.Bucket($"{name}-bucket", - new Aws.S3.BucketArgs(/*...*/), new CustomResourceOptions { Parent = this }); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -#### Registering Component Outputs - -Components can define their own output properties using {{< pulumi-componentresource-registeroutputs >}}. The Pulumi engine uses this information to display the logical outputs of the component and any changes will be shown during an update. - -For example, this registers an S3 bucket's computed domain name, which won't be known until the bucket is created: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -this.registerOutputs({ - bucketDnsName: bucket.bucketDomainName, -}) -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -this.registerOutputs({ - bucketDnsName: bucket.bucketDomainName, -}) -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -self.register_outputs({ - bucketDnsName: bucket.bucketDomainName -}) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -ctx.RegisterResourceOutputs(myComponent, pulumi.Map{ - "bucketDnsName": bucket.BucketDomainName, -}) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -this.RegisterOutputs(new Dictionary -{ - { "bucketDnsName", bucket.BucketDomainName } -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -The call to register outputs typically happens at the very end of the component's constructor. - -The call to `registerOutputs` also tells Pulumi that the resource is done registering children and should be considered fully constructed, so---although it's not enforced---the best practice is to call it in all components even if no outputs need to be registered. - -#### Inheriting Resource Providers - -One option all resources have is the ability to pass an [explicit resource provider](#providers) to supply explicit configuration settings. For instance, you may want to ensure that all AWS resources are created in a different region than the globally configured region. In the case of components, the challenge is that these providers must flow from parent to children. - -To support, this component resources accept a new `providers` option that other custom resources don't have. This value contains a map from provider name to the explicit provider instance to use for that package. This can then be used by a component to fetch the proper `provider` object to use for any child resources. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let component = new MyComponent("...", { - providers: { - aws: useast1, - kubernetes: myk8s, - }, -}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let component = new MyComponent("...", { - providers: { - aws: useast1, - kubernetes: myk8s, - }, -}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -component = MyComponent('...', ResourceOptions(providers={ - 'aws': useast1, - 'kubernetes': myk8s, -})) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -component, err := NewMyResource(ctx, "...", nil, pulumi.ProviderMap( - map[string]pulumi.ProviderResource{ - "aws": awsUsEast1, - "kubernetes": myk8s, - }, -)) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var component = new MyResource("...", new ComponentResourceOptions { - Providers = { - { "aws", awsUsEast1 }, - { "kubernetes", myk8s } - } -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -If a component is itself a child of another component, its set of providers is inherited from its parent by default. - -### Inputs and Outputs {#outputs} - -Resource properties are treated specially in Pulumi, both for purposes of input and output. - -All resource arguments accept so-called _inputs_. Inputs are values of type {{< pulumi-input >}}, a type that permits either a raw value of a given type (like string, integer, boolean, list, map, and so on), an asynchronously computed value (i.e., a `Promise` or `Task`), or an output read from another resource's properties. - -All resource properties on the instance object itself are so-called _outputs_. Outputs are values of type {{< pulumi-output >}}, which behave very much like [promises](https://en.wikipedia.org/wiki/Futures_and_promises); this is necessary because outputs are not fully known until the infrastructure resource has actually completed provisioning, which happens asynchronously. Outputs are also how Pulumi tracks dependencies between resources. - -Outputs, therefore, represent two things: - -1. The eventual raw value of the output -2. The dependency on the source(s) of the output value - -Pulumi automatically captures dependencies when you pass an output from one resource as input to another, ensuring that physical infrastructure resources are not created or updated until all their dependencies are available and up-to-date. - -Because outputs are asynchronous, their actual raw values are not immediately available. If you need to access an output's raw value---for example, to compute a derived, new value, or because you want to log it---you have these options: - -* [Apply](#apply): a callback that receives the raw value, and computes a new output -* [Lifting](#lifting): directly read properties off an output value -* [Interpolation](#outputs-and-strings): concatenate string outputs with other strings directly - -#### Apply {#apply} - -To access the raw value of an output, and transform that value into a new value, use {{< pulumi-apply >}}. This method accepts a callback that will be eventually invoked with the raw value, once it is available. - -For example, the following creates an HTTPS URL from the DNS name of a virtual machine: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let url = virtualmachine.dnsName.apply(dnsName => "https://" + dnsName); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let url = virtualmachine.dnsName.apply(dnsName => "https://" + dnsName); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -url = virtual_machine.dns_name.apply( - lambda dns_name: "https://" + dns_name -) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -url := vpc.DnsName.ApplyString(func(dnsName string) string { - return "https://" + dnsName -}) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var url = virtualmachine.DnsName.Apply(dnsName => "https://" + dnsName); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -The result of the call to {{< pulumi-apply >}} is a new {{< pulumi-output >}}. So in this example, the `url` variable itself is also an {{< pulumi-output >}}. It will resolve to the new new value returned from the callback, and carries the dependencies of the original {{< pulumi-output >}}. If the callback itself returns an {{< pulumi-output >}}, the dependencies of that output are also kept in the resulting {{< pulumi-output >}}. - -> **Note:** during some program executions, {{< pulumi-apply >}} won't be run, such as during a preview when resource output values may remain unknown, so you should avoid side-effects within the callbacks. For this reason, you should not allocate new resources inside of your callbacks either, as it could lead to `pulumi preview` being wrong. - -If you have multiple outputs and need to join them, the [all](#all) function acts like an apply over many resources. - -##### All {#all} - -The {{< pulumi-all >}} function combines multiple {{< pulumi-output >}} values into a single {{< pulumi-output >}} whose value is a combination of the values of the individual outputs, and whose dependencies include all dependencies of each argument. This function joins over an entire list of outputs, waiting for all of them to become available, and then provides them to the supplied callback. This can be used along with {{< pulumi-apply >}} when it is necessary to combine multiple {{< pulumi-output >}} values to compute a new {{< pulumi-output >}} value, such as adding or concatenating outputs from two different resources together, or creating a new data structure that uses them. Just like with {{< pulumi-apply >}}, the result of {{< pulumi-all >}} is itself an {{< pulumi-output >}}. - -For example, let's take a server and database name, and use them to create a database connection string: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -var pulumi = require("@pulumi/pulumi"); -// ... -let connectionString = pulumi.all([sqlServer.name, database.name]) - .apply(([server, db]) => `Server=tcp:${server}.database.windows.net;initial catalog=${db}...`); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -import * as pulumi from "@pulumi/pulumi"; -// ... -let connectionString = pulumi.all([sqlServer.name, database.name]) - .apply(([server, db]) => `Server=tcp:${server}.database.windows.net;initial catalog=${db}...`); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -from pulumi import Output -# ... -connection_string = Output.all(sql_server.name, database.name) \ - .apply(lambda args: f"Server=tcp:{args[0]}.database.windows.net;initial catalog={args[1]}...") -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -connectionString := pulumi.All(sqlServer.Name, database.Name).ApplyT( - func (args []interface{}) (string, error) { - server := args[0].(string) - db := args[1].(string) - return fmt.Sprintf("Server=tcp:%s.database.windows.net;initial catalog=%s...", server, db) - }, -) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -// When all the input values have the same type, Output.All can be used and produces an ImmutableArray. -var connectionString = Output.All(sqlServer.name, database.name) - .Apply(t => `Server=tcp:${t[0]}.database.windows.net;initial catalog=${t[1]}...`); - -// For more flexibility, 'Output.Tuple' is used so that each unwrapped value will preserve their distinct type. -var connectionString2 = Output.Tuple(sqlServer.name, database.name) - .Apply(t => `Server=tcp:${t.Item1}.database.windows.net;initial catalog=${t.Item2}...`); - -// Or using a more natural Tuple syntax and a statement lambda expression. -var connectionString2 = Output.Tuple(sqlServer.name, database.name).Apply(t => -{ - var (serverName, databaseName) = t; - return `Server=tcp:${serverName}.database.windows.net;initial catalog=${databaseName}...`; -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -Notice that {{< pulumi-all >}} works by itself returning an output that represents the combination of multiple outputs, so that within the callback, the raw values are available inside of [a tuple](https://en.wikipedia.org/wiki/Tuple). - -As shown in the examples above, {{< pulumi-all >}} is almost always combined with a call to {{< pulumi-apply >}}. - -##### Accessing Properties of an Output {#lifting} - -If you just need to access a property of an {{< pulumi-output >}} value, in order to pass that property's value as an argument to another resource's constructor, you can often just directly access it. - -For example, if you need to read a domain record from an ACM certificates, that requires drilling into a resource's property value. Because that value is an output, we would normally need to use {{< pulumi-apply >}}: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let certCertificate = new aws.acm.Certificate("cert", { - domainName: "example.com", - validationMethod: "DNS", -}); -let certValidation = new aws.route53.Record("cert_validation", { - records: [ - // Need to pass along a deep subproperty of this Output - certCertificate.domainValidationOptions.apply( - domainValidationOptions => domainValidationOptions[0].resourceRecordValue), - ], - ... -}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let certCertificate = new aws.acm.Certificate("cert", { - domainName: "example.com", - validationMethod: "DNS", -}); -let certValidation = new aws.route53.Record("cert_validation", { - records: [ - // Need to pass along a deep subproperty of this Output - certCertificate.domainValidationOptions.apply( - domainValidationOptions => domainValidationOptions[0].resourceRecordValue), - ], - ... -}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -certificate = aws.acm.Certificate('cert', - domain_name='example.com', - validation_method='DNS' -) - -record = aws.route53.Record('validation', - records=[ - # Need to pass along a deep subproperty of this Output - certificate.domain_validation_options.apply( - lambda domain_validation_options: domain_validation_options[0]['resourceRecordValue'] - ) - ], - ... -) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -cert, err := acm.NewCertificate(ctx, "cert", &acm.CertificateArgs{ - DomainName: pulumi.String("example"), - ValidationMethod: pulumi.String("DNS"), -}) -if err != nil { - return err -} - -record, err := route53.NewRecord(ctx, "validation", &route53.RecordArgs{ - Records: pulumi.StringArray{ - cert.DomainValidationOptions.ApplyString(func(opts []acm.CertificateDomainValidationOption) string { - return *opts[0].ResourceRecordValue - }), - }, - ... -}) -if err != nil { - return err -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var cert = new Certificate("cert", new CertificateArgs -{ - DomainName = "example", - ValidationMethod = "DNS", -}); - -var record = new Record("validation", new RecordArgs -{ - Records = { - cert.DomainValidationOptions.Apply(opts => opts[0].ResourceRecordValue!) - }, - ... -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -To ease simple property and array element access, an {{< pulumi-output >}} _lifts_ the properties of the underlying value, behaving very much like an instance of it. This allows you to access properties and elements directly from the {{< pulumi-output >}} itself without needing {{< pulumi-apply >}}. If we return to the above example, we can now simplify it: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let certCertificate = new aws.acm.Certificate("cert", { - domainName: "example.com", - validationMethod: "DNS", -}); -let certValidation = new aws.route53.Record("cert_validation", { - records: [ - certCertificate.domainValidationOptions[0].resourceRecordValue - ], -... -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let certCertificate = new aws.acm.Certificate("cert", { - domainName: "example.com", - validationMethod: "DNS", -}); -let certValidation = new aws.route53.Record("cert_validation", { - records: [ - certCertificate.domainValidationOptions[0].resourceRecordValue - ], -... -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -certificate = aws.acm.Certificate('cert', - domain_name='example.com', - validation_method='DNS' -) - -record = aws.route53.Record('validation', - records=[ - certificate.domain_validation_options[0].resource_record_value - ], -... -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -cert, err := acm.NewCertificate(ctx, "cert", &acm.CertificateArgs{ - DomainName: pulumi.String("example"), - ValidationMethod: pulumi.String("DNS"), -}) -if err != nil { - return err -} - -record, err := route53.NewRecord(ctx, "validation", &route53.RecordArgs{ - Records: pulumi.StringArray{ - // Notes: - // * `Index` looks up an index in an `ArrayOutput` and returns a new `Output`. - // * Accessor methods like `ResourceRecordValue` lookup properties of a custom struct `Output` and return a new `Output`. - // * `Elem` dereferences a `PtrOutput` to an `Output`, equivalent to `*`. - cert.DomainValidationOptions.Index(pulumi.Int(0)).ResourceRecordValue().Elem(), - }, - ... -}) -if err != nil { - return err -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var cert = new Certificate("cert", new CertificateArgs -{ - DomainName = "example", - ValidationMethod = "DNS", -}); - -var record = new Record("validation", new RecordArgs -{ - // Notes: - // * `GetAt` looks up an index in an `Output>` and returns a new `Output` - // * There are not yet accessor methods for referencing properties like `ResourceRecordValue` on an `Output` directly, - // so the `Apply` is still needed for the property access. - Records = cert.DomainValidationOptions.GetAt(0).Apply(opt => opt.ResourceRecordValue!), -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -This approach is easier to read and write, while not losing any important dependency information that is needed to properly create and maintain the stack. This approach doesn't work in all cases, but when it does, it can be a great help. - -> In JavaScript and TypeScript, a 'lifted' property access on an `Output` that wraps `undefined` will produce another `Output` with the `undefined` value instead of throwing or producing a 'faulted' `Output`. In this manner lifted property accesses behave like the [`?.` (optional chaining operator)](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining) in JavaScript and TypeScript. This makes it much easier to form a chain of property accesses on an `Output`. - -```javascript -let certValidation = new aws.route53.Record("cert_validation", { - records: [certCertificate.domainValidationOptions[0].resourceRecordValue], - -// instead of - -let certValidation = new aws.route53.Record("cert_validation", { - records: [certCertificate.apply(cc => cc ? cc.domainValidationOptions : undefined) - .apply(dvo => dvo ? dvo[0] : undefined) - .apply(o => o ? o.resourceRecordValue : undefined)], -``` - -```typescript -let certValidation = new aws.route53.Record("cert_validation", { - records: [certCertificate.domainValidationOptions[0].resourceRecordValue], - -// instead of - -let certValidation = new aws.route53.Record("cert_validation", { - records: [certCertificate.apply(cc => cc ? cc.domainValidationOptions : undefined) - .apply(dvo => dvo ? dvo[0] : undefined) - .apply(o => o ? o.resourceRecordValue : undefined)], -``` - -##### Working with Outputs and Strings {#outputs-and-strings} - -Outputs containing strings cannot be used directly in operations like string concatenation. _String interpolation_ lets you more easily build a string out of various output values, without needing {{< pulumi-apply >}} or {{< pulumi-all >}}. This can be used to export a stack output, provide a dynamically computed string as a new resource argument, or even just for diagnostic purposes. - -For example, say you want to create a URL from `hostname` and `port` output values. It is possible to use [apply](#apply) and [all](#all) to do this, of course: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let hostname = res.hostname; -let port = res.port; - -// Would like to produce a string equivalent to: http://${hostname}:${port}/ -let url = pulumi.all([hostname, port]). - apply(([hostname, port]) => `http://${hostname}:${port}/`); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let hostname: Output; -let port: Output; - -// Would like to produce a string equivalent to: http://${hostname}:${port}/ -let url = pulumi.all([hostname, port]). - apply(([hostname, port]) => `http://${hostname}:${port}/`); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -hostname: Output[str] -port: Output[int] - -# Would like to produce a string equivalent to: http://${hostname}:${port}/ -url = Output.all(hostname, port).apply(lambda l: f"http://{l[0]}:{l[1]}/") -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -var hostname pulumi.StringOutput -var port pulumi.NumberOutput - -// Would like to produce a string equivalent to: http://${hostname}:${port}/ -url := pulumi.All(hostname, port).ApplyString(func (args []interface{}) string { - return fmt.Sprintf("http://%s:%d/", args[0], args[1]) -}) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -Output hostname = // get some Output -Output port = // get some Output - -// Would like to produce a string equivalent to: http://{hostname}:{port}/ -var url = Output.Tuple(hostname, port).Apply(t => $"http://{t.Item1}:{t.Item2}/"); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -This is verbose and unwieldy, however. To make this common task easier, Pulumi exposes helpers that allow you to create strings that contain outputs---internally hiding all of the messiness required to join them together: - -{{% choosable language javascript %}} - -```javascript -// concat takes a list of args and concatenates all of them into a single output: -const url1 = pulumi.concat("http://", hostname, ":", port, "/"); -// interpolate takes a JavaScript "template literal" and expands outputs correctly: -const url2 = pulumi.interpolate `http://${hostname}:${port}/`; -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -// concat takes a list of args and concatenates all of them into a single output: -const url1: Output = pulumi.concat("http://", hostname, ":", port, "/"); -// interpolate takes a JavaScript "template literal" and expands outputs correctly: -const url2: Output = pulumi.interpolate `http://${hostname}:${port}/`; -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -# concat takes a list of args and concatenates all of them into a single output: -url = Output.concat("http://", hostname, ":", port, "/") -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -url := pulumi.Sprintf("http://%s:%d/", hostname, port) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -// Format takes a FormattableString and expands outputs correctly: -var url = Output.Format($"http://{hostname}:{port}/"); -``` - -{{% /choosable %}} - -##### Convert Input to Output {#frominput} - -It is possible to turn an {{< pulumi-input >}} into an {{< pulumi-output >}} value. Resource arguments already accept outputs as input values, however in some cases you need to know that a value is definitely an {{< pulumi-output >}} at runtime. This can be helpful because, since {{< pulumi-input >}} values have many possible representations---a raw value, a promise, or an output---you would normally need to handle all possible cases; by first transforming that value into an {{< pulumi-output >}}, you can treat it uniformly instead. - -For example, this code transforms an {{< pulumi-input >}} into an {{< pulumi-output >}} so that it can use the {{< pulumi-apply >}} function: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -function split(input) { - let output = pulumi.output(input); - return output.apply(v => v.split()); -} -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -function split(input: pulumi.Input): pulumi.Output { - let output = pulumi.output(input); - return output.apply(v => v.split()); -} -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -def split(input): - output = Output.from_input(input); - return output.apply(lambda v: v.split()); -} -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -func split(input pulumi.StringInput) pulumi.StringArrayOutput { - return input.ToStringOutput().ApplyStringArray(func(s string) []string { - return strings.Split(s, ",") - }) -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -Output Split(Input input) -{ - var output = input.ToOutput() - return output.Apply(v => v.Split(",")); -} -``` - -{{% /choosable %}} - -{{< /chooser >}} - -### Secrets {#secrets} - -All resource input and output values are recorded as [state]({{< relref "state" >}}), either stored in the Pulumi Service, a file, or a pluggable provider of your own choosing. These raw values are usually just server names, configuration settings, and so on. In some cases, however, these values contain sensitive data, such as database passwords or service tokens. - -The Pulumi Service transmits and stores entire state files securely, however, Pulumi also supports encrypting specific values as "secrets" beyond this for extra protection. This ensures that these values never appear as plaintext in your state. The encryption uses automatic per-stack encryption keys provided by the Pulumi Service by default, or [you can use a provider of your own choosing]({{< relref "config#configuring-secrets-encryption" >}}). - -There is a CLI aspect to secrets, in that the CLI's [`config set` command]({{< relref "config#configuration" >}}) supports a [`--secret` flag]({{< relref "config#secrets" >}}) to encrypt your stack's configuration settings. - -There is also a runtime aspect to secrets, in that any {{< pulumi-output >}} value may be marked secret. If an output is a secret, then any computed values from it---such as those derived through an {{< pulumi-apply >}} call---will themselves be marked secret. All such values are stored encrypted inside of your state, and never in plaintext. - -An {{< pulumi-output >}} can be marked secret a number of ways: - -* Reading a secret from configuration using {{< pulumi-config-getsecret >}} or {{< pulumi-config-requiresecret >}} -* Creating a new secret value with {{< pulumi-secret-new >}}, like when generating a new random password -* Marking a resource as having secret properties using [`additionalSecretOutputs`](#additionalsecretoutputs) -* Computing a secret value by using {{< pulumi-apply >}} or {{< pulumi-all >}} with another secret value - -As soon as an {{< pulumi-output >}} is marked secret, you can trust that the Pulumi engine will encrypt it no matter where it goes. - -> *Note*: Inside of an {{< pulumi-apply >}} or {{< pulumi-all >}}, your secret will be decrypted for use within the callback in plaintext. It is up to your program to treat this value sensitively and only pass the value to code that you trust. - -#### Programmatically Creating Secrets - -There are two ways to programmatically create secret values: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} -{{% choosable language javascript %}} - -* Using [`getSecret(key)`]({{< relref "/docs/reference/pkg/nodejs/pulumi/pulumi#Config-getSecret" >}}) or [`requireSecret(key)`]({{< relref "/docs/reference/pkg/nodejs/pulumi/pulumi#Config-requireSecret" >}}) when reading a value from config. -* Calling [`pulumi.secret(value)`]({{< relref "/docs/reference/pkg/nodejs/pulumi/pulumi#secret" >}}) to construct a secret from an existing value. - -{{% /choosable %}} -{{% choosable language typescript %}} - -* Using [`getSecret(key)`]({{< relref "/docs/reference/pkg/nodejs/pulumi/pulumi#Config-getSecret" >}}) or [`requireSecret(key)`]({{< relref "/docs/reference/pkg/nodejs/pulumi/pulumi#Config-requireSecret" >}}) when reading a value from config. -* Calling [`pulumi.secret(value)`]({{< relref "/docs/reference/pkg/nodejs/pulumi/pulumi#secret" >}}) to construct a secret from an existing value. - -{{% /choosable %}} -{{% choosable language python %}} - -* Using [`get_secret`]({{< relref "/docs/reference/pkg/python/pulumi#pulumi.Config.get_secret" >}}) or [`require_secret`]({{< relref "/docs/reference/pkg/python/pulumi#pulumi.Config.require_secret" >}}) when reading a value from config. -* Calling [`Output.secret`]({{< relref "/docs/reference/pkg/python/pulumi#pulumi.Output.secret" >}}) to construct a secret from an existing value. - -{{% /choosable %}} -{{% choosable language go %}} - -* Using `config.GetSecret(key)` or `config.RequireSecret(key)` when reading a value from config. -* Calling `pulumi.ToSecret(value)` to construct a secret from an existing value. - -{{% /choosable %}} -{{% choosable language csharp %}} - -* Using `Config.GetSecret(key)` or `Config.RequireSecret(key)` when reading a value from config. -* Calling `Output.CreateSecret(value)` to construct a secret from an existing value. - -{{% /choosable %}} -{{< /chooser >}} - -To illustrate using these functions, let's create an AWS Parameter Store secure value. To do so, we need to pass an argument to initialize its `value` property. Unfortunately, the obvious thing to do---passing a raw, unencrypted value---will lead to its value also being stored unencrypted in the Pulumi state! Instead, we will ensure that the value is a secret: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -const cfg = new pulumi.Config() -const param = new aws.ssm.Parameter("a-secret-param", { - type: "SecureString", - value: cfg.requireSecret("my-secret-value"), -}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -const cfg = new pulumi.Config() -const param = new aws.ssm.Parameter("a-secret-param", { - type: "SecureString", - value: cfg.requireSecret("my-secret-value"), -}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -cfg = pulumi.Config() -param = ssm.Parameter("a-secret-param", - type="SecureString", - value=cfg.require_secret("my-secret-value")) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -package main - -import ( - "github.com/pulumi/pulumi-aws/sdk/v3/go/aws/ssm" - "github.com/pulumi/pulumi/sdk/v2/go/pulumi" - "github.com/pulumi/pulumi/sdk/v2/go/pulumi/config" -) - -func main() { - pulumi.Run(func(ctx *pulumi.Context) error { - cfg := config.New(ctx, "") - param, err := ssm.NewParameter(ctx, "a-secret-param", &ssm.ParameterArgs{ - Type: "SecureString", - Value: cfg.RequireSecret("my-secret-value"), - }) - if err != nil { - return err - } - return nil - } -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var cfg = new Pulumi.Config() -var param = new Aws.Ssm.Parameter("a-secret-param", new Aws.Ssm.ParameterArgs -{ - type = pulumi.String("SecureString"), - value = cfg.RequireSecret("my-secret-value"), -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -As written, the `Parameter` resource's `value` property will be encrypted in the state file. - -> Pulumi tracks the transitive usage of secrets, so that your secret won't end up accidentally leaking into the state file. This includes automatically marking data generated from secret inputs itself as secret, as well as fully encrypting any resource properties that include secrets in them. - -#### How Secrets Relate to Outputs - -Secrets have the same type {{< pulumi-output >}} as do other unencrypted resource outputs. The difference is that they are marked internally as needing encryption before persisting in the state file. When you combine an existing output that is marked as a secret using {{< pulumi-apply >}} or {{< pulumi-all >}}, the resulting output is also marked as a secret. - -An {{< pulumi-apply >}}'s callback is given the plaintext value of the underlying secret. Although Pulumi ensures that the value returned from an {{< pulumi-apply >}} on a secret is also marked as secret, Pulumi cannot guarantee that the {{< pulumi-apply >}} callback itself will not expose the secret value---for instance, by explicitly printing the value to the console or saving it to a file. Be careful that you do not pass this plaintext value to code that might intentionally or accidentally expose it. - -> Unlike regular outputs, secrets cannot be captured by Pulumi closure serialization system for use in serverless code. Attempting to do so will lead to an exception. We do plan to support this once we can ensure that the values will be persisted securely. See [pulumi/pulumi#2718](https://github.com/pulumi/pulumi/issues/2718). - -#### Explicitly Marking Resource Outputs as Secrets - -It is possible to mark resource outputs as containg secrets. In this case, Pulumi will automatically treat those outputs -as secrets and encrypt them in the state file and anywhere they flow to. To do so, -[use the "additional secret outputs" option, as described above]({{< relref "#additionalsecretoutputs" >}}). - -### Config {#config} - -Configuration allows you to parameterize your program based on externally managed configuration. This can be helpful if you want to, say, have a different number of servers in your production stack than in development. - -> This section describes how to programmatically interact with configuration that has already been set. For more information on how to do so using the CLI, see [Configuration and Secrets]({{< relref "/docs/intro/concepts/config" >}}). - -#### Reading Configuration Values - -To read configuration set in your current stack, use the {{< pulumi-config >}} class. - -Configuration values can be retrieved using either {{< pulumi-config-get >}} or {{< pulumi-config-require >}}. Using {{< pulumi-config-get >}} will return {{< language-null >}} if the configuration value was not provided, and {{< pulumi-config-require >}} will raise an exception with a helpful error message to prevent the deployment from continuing until the variable has been set using the CLI. - -In this example, the name is required, and a lucky number is optional: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let config = new pulumi.Config(); -let name = config.require("name"); -let lucky = config.getNumber("lucky") || 42; -console.log(`Hello, ${name} -- I see your lucky number is ${lucky}!`); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let config = new pulumi.Config(); -let name = config.require("name"); -let lucky = config.getNumber("lucky") || 42; -console.log(`Hello, ${name} -- I see your lucky number is ${lucky}!`); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -config = pulumi.Config(); -name = config.require('name'); -lucky = config.get_number('lucky') or 42 -print(f'Hello, {name} -- I see your lucky number is {lucky}!') -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -package main - -import ( - "github.com/pulumi/pulumi/sdk/v2/go/pulumi" - "github.com/pulumi/pulumi/sdk/v2/go/pulumi/config" -) -func main() { - pulumi.Run(func(ctx *pulumi.Context) error { - conf := config.New(ctx, "") - name := conf.Require("name") - lucky, err := conf.TryInt("lucky") - if err != nil { - lucky = 42 - } - fmt.Printf("Hello, %v -- I see your lucky number is %v!", name, lucky) - return nil - } -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var config = new Pulumi.Config(); -var name = config.Require("name"); -var lucky = config.GetInt32("lucky") ?? 42; -Console.WriteLine($"Hello, {name} -- I see your lucky number is {lucky}!"); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -In this example, we have created an instance of the {{< pulumi-config >}} class, which is a bag of key/value pairs. On that instance, a number of getter functions allow us to read the currently-set values. - -The above example uses the simple, empty constructor. If you are writing code that will be imported into a broader project, such as your own library of components, you should pass your library's name to the constructor. This string is used as a namespace for all configuration keys. Similarly, if you want to access the config of another library, such as the config for a standard library like `aws`, you should also pass the library's name to the constructor. The default constructor automatically uses the current project for that namespace. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let config = new pulumi.Config("namespace"); -let name = config.require("name"); -let lucky = config.getNumber("lucky") || 42; -console.log(`Hello, ${name} -- I see your lucky number is ${lucky}!`); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let config = new pulumi.Config("namespace"); -let name = config.require("name"); -let lucky = config.getNumber("lucky") || 42; -console.log(`Hello, ${name} -- I see your lucky number is ${lucky}!`); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -config = pulumi.Config("namespace"); -name = config.require('name'); -lucky = config.get_number('lucky') or 42 -print(f'Hello, {name} -- I see your lucky number is {lucky}!') -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -package main - -import ( - "github.com/pulumi/pulumi/sdk/v2/go/pulumi" - "github.com/pulumi/pulumi/sdk/v2/go/pulumi/config" -) -func main() { - pulumi.Run(func(ctx *pulumi.Context) error { - conf := config.New(ctx, "namespace") - name := conf.Require("name") - lucky, err := conf.TryInt("lucky") - if err != nil { - lucky = 42 - } - fmt.Printf("Hello, %v -- I see your lucky number is %v!\n", name, lucky) - return nil - } -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var config = new Pulumi.Config("namespace"); -var name = config.Require("name"); -var lucky = config.GetInt32("lucky") ?? 42; -Console.WriteLine($"Hello, {name} -- I see your lucky number is {lucky}!"); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -The {{< pulumi-config >}} object also provides getters that ensure a value is marked secret, ensuring the underlying raw value is encrypted no matter where it goes. Read more about this in the [Secrets documentation](#secrets). - -#### Typed Configuration Values - -Configuration values are stored as strings, but can be parsed and retrieved as typed values. In addition to {{< pulumi-config-get >}} and {{< pulumi-config-require >}}, which are untyped, there are a family of typed functions. - -For example, {{< pulumi-config-getnumber >}} will convert the string value to a number and return a {{< language-int32 >}} value instead of a string, and raise an exception if the value cannot be parsed as a number. We saw this in action above. - -For richer structured data, the {{< pulumi-config-getobject >}} method can be used to parse JSON values which can be set on the command line with `pulumi config set` and the `--path` flag. For example: - -```bash -$ pulumi config set --path data.active true -$ pulumi config set --path data.nums[0] 1 -$ pulumi config set --path data.nums[1] 2 -$ pulumi config set --path data.nums[2] 3 -``` - -A program can read the `data` config into a rich object with: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let config = new pulumi.Config(); -let data = config.requireObject("data"); -console.log(`Active: ${data.active}`); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -interface Data { - active: boolean; - nums: number[]; -} - -let config = new pulumi.Config(); -let data = config.requireObject("data"); -console.log(`Active: ${data.active}`); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -config = pulumi.Config() -data = config.require_object("data") -print(f"Active: ${data.active}") -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -package main - -import ( - "github.com/pulumi/pulumi/sdk/v2/go/pulumi" - "github.com/pulumi/pulumi/sdk/v2/go/pulumi/config" -) - -type Data struct { - Active bool - Nums []int -} - -func main() { - pulumi.Run(func(ctx *pulumi.Context) error { - var d Data - cfg := config.New(ctx, "") - cfg.RequireObject("data", &d) - fmt.Printf("Active: %v\n", d.Active) - return nil - }) -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var config = new Pulumi.Config(); -var data = config.RequireObject("data"); -Console.WriteLine($"Active: {data.GetProperty("active")}"); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -### Providers {#providers} - -You can use packages from your language's native package manager: for example, NPM for Node.js, Pip for Python, Go modules for Go, and NuGet for .NET. These packages may transitively depend on the Pulumi SDK, which itself is just a native package. The Pulumi SDK defines how resources created by a program will be communicated to the Pulumi engine. The ability to register resources with the Pulumi engine is the only difference between a Pulumi package and any other native package. - -Any packages that create custom resources---classes that derive from the {{< pulumi-customresource >}} base class---will cause Pulumi to load an associated "resource provider plugin" at runtime, which is a binary that implements the Create, Read, Update, and Delete resources defined by the package. Normally plugins are installed automatically when you install the package, but you can also [manage plugins explicitly using the CLI]({{< relref "/docs/reference/cli/pulumi_plugin" >}}). - -This is in contrast to a component resource---classes that derive from the {{< pulumi-componentresource >}} base class--whose logic is written entirely within that library itself, without any external plugin required. A component resource does not manage any external infrastructure state; instead, it simply aggregates existing resources into a larger abstraction. - -Finally, _dynamic providers_ let you write an entire provider within your language of choice, without needing to create a resource provider plugin. This has the advantage that you can flexibly create new resource types---but with the disadvantage that you can't share them easily across multiple languages, as resource plugins are language-neutral. - -#### Resource Providers - -The resource provider for a custom resource is determined based on its package name. For example, the `aws` package will load a plugin named `pulumi-resource-aws`, and the `kubernetes` package will load a plugin named `pulumi-resource-kubernetes`. Each provider uses the configuration from its package to alter its behavior. - -##### Default Provider Configuration - -By default, each provider uses its package's global configuration settings, which are controlled by your stack's configuration. For example, if you run this CLI command: - -```bash -$ pulumi config set aws:region us-west-2 -``` - -Then deploying the following Pulumi program will create a single EC2 instance in the `us-west-2` region: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let aws = require("@pulumi/aws"); - -let instance = new aws.ec2.Instance("myInstance", { - instanceType: "t2.micro", - ami: "myAMI", -}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let aws = require("@pulumi/aws"); - -let instance = new aws.ec2.Instance("myInstance", { - instanceType: "t2.micro", - ami: "myAMI", -}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -from pulumi_aws import ec2 - -instance = ec2.Instance("myInstance", instance_type="t2.micro", ami="myAMI") -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -vpc, err := ec2.NewInstance(ctx, "myInstance", &ec2.InstanceArgs{ - InstanceType: pulumi.String("t2.micro"), - Ami: pulumi.String("myAMI"), -}) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var instance = new Aws.Ec2.Instance("myInstance", new Aws.Ec2.InstanceArgs -{ - InstanceType = "t2.micro", - Ami = "myAMI", -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -##### Explicit Provider Configuration - -While this works for the majority of Pulumi programs, some programs may have special requirements. For example, it may require the ability to deploy to multiple AWS regions simultaneously, or to deploy to a Kubernetes cluster created earlier in the program that requires explicitly creating, configuring, and referencing providers. This is typically done by instantiating the relevant package's `Provider` type and passing in the options for each {{< pulumi-customresource >}} or {{< pulumi-componentresource >}} that needs to use it. For example, the following configuration and program will create an ACM certificate in the `us-east-1` region and a load balancer listener in the `us-west-2` region. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let pulumi = require("@pulumi/pulumi"); -let aws = require("@pulumi/aws"); - -// Create an AWS provider for the us-east-1 region. -let useast1 = new aws.Provider("useast1", { region: "us-east-1" }); - -// Create an ACM certificate in us-east-1. -let cert = new aws.acm.Certificate("cert", { - domainName: "foo.com", - validationMethod: "EMAIL", -}, { provider: useast1 }); - -// Create an ALB listener in the default region that references the ACM certificate created above. -let listener = new aws.lb.Listener("listener", { - loadBalancerArn: loadBalancerArn, - port: 443, - protocol: "HTTPS", - sslPolicy: "ELBSecurityPolicy-2016-08", - certificateArn: cert.arn, - defaultAction: { - targetGroupArn: targetGroupArn, - type: "forward", - }, -}) -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let pulumi = require("@pulumi/pulumi"); -let aws = require("@pulumi/aws"); - -// Create an AWS provider for the us-east-1 region. -let useast1 = new aws.Provider("useast1", { region: "us-east-1" }); - -// Create an ACM certificate in us-east-1. -let cert = new aws.acm.Certificate("cert", { - domainName: "foo.com", - validationMethod: "EMAIL", -}, { provider: useast1 }); - -// Create an ALB listener in the default region that references the ACM certificate created above. -let listener = new aws.lb.Listener("listener", { - loadBalancerArn: loadBalancerArn, - port: 443, - protocol: "HTTPS", - sslPolicy: "ELBSecurityPolicy-2016-08", - certificateArn: cert.arn, - defaultAction: { - targetGroupArn: targetGroupArn, - type: "forward", - }, -}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -import pulumi -import pulumi_aws as aws - -# Create an AWS provider for the us-east-1 region. -useast1 = aws.Provider("useast1", region="us-east-1") - -# Create an ACM certificate in us-east-1. -cert = aws.acm.Certificate("cert", - domain_name="foo.com", - validation_method="EMAIL", - __opts__=pulumi.ResourceOptions(provider=useast1)) - -# Create an ALB listener in the default region that references the ACM certificate created above. -listener = aws.lb.Listener("listener", - load_balancer_arn=load_balancer_arn, - port=443, - protocol="HTTPS", - ssl_policy="ELBSecurityPolicy-2016-08", - certificate_arn=cert.arn, - default_action={ - "target_group_arn": target_group_arn, - "type": "forward", - }) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -// Create an AWS provider for the us-east-1 region. -useast1, err := aws.NewProvider(ctx, "useast1", &aws.ProviderArgs{ - Region: pulumi.String("us-east-1"), -}) -if err != nil { - return err -} - -// Create an ACM certificate in us-east-1. -cert, err := acm.NewCertificate(ctx, "myInstance", &acm.CertificateArgs{ - DomainName: pulumi.String("foo.com"), - ValidationMethod: pulumi.String("EMAIL"), -}, pulumi.Provider(useast1)) -if err != nil { - return err -} - -// Create an ALB listener in the default region that references the ACM certificate created above. -listener, err := lb.NewListener(ctx, "myInstance", &lb.ListenerArgs{ - LoadBalancerArn: loadBalancerArn, - Port: pulumi.Int(443), - Protocol: pulumi.String("HTTPS"), - SslPolicy: pulumi.String("ELBSecurityPolicy-2016-08"), - CertificateArn: cert.Arn, - DefaultActions: lb.ListenerDefaultActionArray{ - &lb.ListenerDefaultActionArgs{ - TargetGroupArn: targetGroupArn, - Type: pulumi.String("forward"), - }, - }, -}) -if err != nil { - return err -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -// Create an AWS provider for the us-east-1 region. -var useast1 = new Aws.Provider("useast1", new Aws.ProviderArgs { Region = "us-east-1" }); - -// Create an ACM certificate in us-east-1. -var cert = new Aws.Acm.Certificate("cert", new Aws.Acm.CertifiateArgs -{ - DomainName = "foo.com", - ValidationMethod = "EMAIL", -}, new ResourceArgs { Provider = useast1 }); - -// Create an ALB listener in the default region that references the ACM certificate created above. -var listener = new Aws.Lb.Listener("listener", new Aws.Lb.ListenerArgs -{ - LoadBalancerArn = loadBalancerArn, - Port = 443, - Protocol = "HTTPS", - SslPolicy = "ELBSecurityPolicy-2016-08", - CertificateArn = cert.arn, - DefaultAction: new Aws.Lb.ListenerDefaultAction - { - TargetGroupArn = targetGroupArn, - Type = "forward", - }, -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -```bash -$ pulumi config set aws:region us-west-2 -``` - -Component resources also accept a set of providers to use with their child resources. For example, the EC2 instance parented to `myResource` in the program below will be created in `us-east-1`, and the Kubernetes pod parented to `myResource` will be created in the cluster targeted by the "test-ci" context. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -class MyResource extends pulumi.ComponentResource { - constructor(name, opts) { - let instance = new aws.ec2.Instance("instance", { ... }, { parent: this }); - let pod = new kubernetes.core.v1.Pod("pod", { ... }, { parent: this }); - } -} - -let useast1 = new aws.Provider("useast1", { region: "us-east-1" }); -let myk8s = new kubernetes.Provider("myk8s", { context: "test-ci" }); -let myResource = new MyResource("myResource", { providers: { aws: useast1, kubernetes: myk8s } }); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -class MyResource extends pulumi.ComponentResource { - constructor(name, opts) { - let instance = new aws.ec2.Instance("instance", { ... }, { parent: this }); - let pod = new kubernetes.core.v1.Pod("pod", { ... }, { parent: this }); - } -} - -let useast1 = new aws.Provider("useast1", { region: "us-east-1" }); -let myk8s = new kubernetes.Provider("myk8s", { context: "test-ci" }); -let myResource = new MyResource("myResource", { providers: { aws: useast1, kubernetes: myk8s } }); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -class MyResource(pulumi.ComponentResource): - def __init__(self, name, opts): - instance = aws.ec2.Instance("instance", ..., __opts__=pulumi.ResourceOptions(parent=self)) - pod = kubernetes.core.v1.Pod("pod", ..., __opts__=pulumi.ResourceOptions(parent=self)) - -useast1 = aws.Provider("useast1", region="us-east-1") -myk8s = kubernetes.Provider("myk8s", context="test-ci") -my_resource = MyResource("myResource", pulumi.ResourceOptions(providers={ - "aws": useast1, - "kubernetes": myk8s, -}) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -useast1, err := aws.NewProvider(ctx, "useast1", &aws.ProviderArgs{ - Region: pulumi.String("us-east-1"), -}) -if err != nil { - return err -} -myk8s, err := kubernetes.NewProvider(ctx, "myk8s", &kubernetes.ProviderArgs{ - Context: pulumi.String("test-ci"), -}) -if err != nil { - return err -} -myResource, err := NewMyResource(ctx, "myResource", pulumi.ProviderMap(map[string]pulumi.ProviderResource{ - "aws": useast1, - "kubernetes": myk8s, -})) -if err != nil { - return err -} -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -using Pulumi; -using Aws = Pulumi.Aws; -using Kubernetes = Pulumi.Kubernetes; - -class MyResource : ComponentResource -{ - public MyResource(string name, ComponentResourceOptions opts) - : base(name, opts) - { - var instance = new Aws.Ec2.Instance("instance", new Aws.Ec2.InstanceArgs { ... }, new CustomResourceOptions { Parent = this }); - var pod = new Kubernetes.Core.V1.Pod("pod", new Kubernetes.Core.V1.PodArgs { ... }, new CustomResourceOptions { Parent = this }); - } -} - -class MyStack -{ - public MyStack() - { - var useast1 = new Aws.Provider("useast1", - new Aws.ProviderArgs { Region = "us-east-1" }); - var myk8s = new Kubernetes.Provider("myk8s", - new Kubernetes.ProviderArgs { Context = "test-ci" }); - var myResource = new MyResource("myResource", - new ComponentResourceOptions { Providers = { useast1, myk8s } }); - } -} -``` - -{{% /choosable %}} - -{{< /chooser >}} - -#### Dynamic Providers {#dynamicproviders} - -Every {{< pulumi-customresource >}} has a provider associated with it which knows how to `create`, `read`, `update`, and `delete` instances of the custom resource in the backing cloud provider. This provider plugin is defined by implementing the Pulumi Resource Provider gRPC interface. Most resources implement this without you needing to know how. - -This plugin model is flexible and allows multi-language consumption of a shared set of resource providers. It does mean, however, that you need to implement a gRPC interface, and create and distribute a plugin. In some cases, it's useful to more rapidly create new resource types---for instance, if a feature is missing from your favorite provider, you'd like to create a resource model over some REST APIs, or you need to implement some custom CRUD logic. - -Pulumi supports a concept called **dynamic providers** for this. Dynamic providers provide a flexible approach to defining custom resource types directly within the source code of your Pulumi program. They aren't as easy to share with other programs, and cannot be used across languages, but are as easy to create as implementing an interface. - -You should consider implementing a dynamic provider if: - -1. You need to manage a cloud resource that doesn't have provider support, and you expect to only use it from within one program. If you expect to use it from many programs, and in many languages, implementing a full provider is preferable. -2. You need to integrate custom logic into the deployment workflow that runs exactly during one or more of the `create`, `read`, `update`, or `delete` steps, instead of running "always" as part of a normal Pulumi program. - -Dynamic providers are defined by first implementing the `pulumi.dynamic.ResourceProvider` interface. This interface supports all CRUD operations, but only the create function is required. A minimal implementation might look like this: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -const myProvider = { - async create(inputs) { - return { id: "foo", outs: {}}; - } -} -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -const myProvider: pulumi.dynamic.ResourceProvider = { - async create(inputs) { - return { id: "foo", outs: {}}; - } -} -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -from pulumi.dynamic import ResourceProvider, CreateResult - -class MyProvider(ResourceProvider): - def create(self, inputs): - return CreateResult(id_="foo", outs={}) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -// Dynamic Providers are currently not supported in Go. -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -// Dynamic Providers are currently not supported in .NET. -``` - -{{% /choosable %}} - -{{< /chooser >}} - -This resource provider is then used to create a new kind of custom resource by inheriting from the `pulumi.dynamic.Resource` base class which is a subclass of `pulumi.CustomResource`: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -class MyResource extends pulumi.dynamic.Resource { - constructor(name, props, opts) { - super(myProvider, name, props, opts); - } -} -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -class MyResource extends pulumi.dynamic.Resource { - constructor(name: string, props: {}, opts?: pulumi.CustomResourceOptions) { - super(myProvider, name, props, opts); - } -} -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -from pulumi import ResourceOptions -from pulumi.dynamic import Resource -from typing import Any, Optional - -class MyResource(Resource): - def __init__(self, name: str, props: Any, opts: Optional[ResourceOptions] = None): - super().__init__(MyProvider(), name, props, opts) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -// Dynamic Providers are currently not supported in Go. -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -// Dynamic Providers are currently not supported in .NET. -``` - -{{% /choosable %}} - -{{< /chooser >}} - -We can now create instances of the new `MyResource` resource type in our program with `new MyResource("name", args)`, just like we would any ordinary resource. Pulumi understands how to use our custom provider logic at the right time. - -Specifically, if Pulumi determines the resource has not yet been created, it will call the `create` method on the resource provider interface. If another Pulumi deployment happens and the resource already exists, Pulumi will call the `diff` method to determine whether a change can be made in place or whether a replacement is needed. If a replacement is needed, Pulumi will call `create` for the new resource and then `delete` for the old resource. If no replacement is needed, Pulumi will call `update`. In all cases, Pulumi first calls the `check` method with the resource arguments to give the provider a chance to validate that the arguments are valid. And finally, if Pulumi needs to read an existing resource without managing it directly, it will call `read`. See below for details on the details of each of these functions. - -##### How Dynamic Providers Work - -Dynamic providers are a flexible and low-level mechanism to plug arbitrary code directly into the deployment process. Whereas most code in a Pulumi program runs as part of constructing the desired state of resources (the "resource graph"), the code inside a dynamic provider's interface implementation, such as `create` or `update`, runs instead during resource provisioning (while the resource graph is being turned into a set of CRUD operations scheduled against the cloud providers). - -In fact, these two phases of execution actually run in completely separate processes. The construction of a `new MyResource` happens inside the JavaScript, Python, or Go process running your Pulumi program. But your implementations of `create` or `update` are executed by a special resource provider binary called `pulumi-resource-pulumi-nodejs`. This binary is what actually implements the Pulumi resource provider gRPC interface and speaks directly to the Pulumi engine. - -Because your implementation of the resource provider interface must be used by a different process, potentially at a different point in time, dynamic providers are built on top of the same [function serialization]({{< relref "/docs/tutorials/aws/serializing-functions" >}}) that is used for turning callbacks into AWS Lambdas or Google Cloud Functions. Because of this serialization, there are some limits on what can be done inside the implementation of the resource provider interface, which you can read more about in the function serialization documentation. - -##### Dynamic Resource Inputs - -The inputs to your `pulumi.dynamic.ResourceProvider`'s functions come from subclasses of `pulumi.dynamic.Resource`. These include any values in the input arguments passed to the `pulumi.dynamic.Resource` constructor. This is just a map of key/value pairs, however in statically typed languages, you can declare types for these input shapes. - -For example, `props` in this code ends up becoming the inputs to the resource provider functions: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -class MyResource extends pulumi.dynamic.Resource { - constructor(name, props, opts) { - super(myprovider, name, props, opts); - } -} -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -interface MyResourceInputs { - myStringProp: pulumi.Input; - myBoolProp: pulumi.Input; - ... -} - -class MyResource extends pulumi.dynamic.Resource { - constructor(name: string, props: MyResourceInputs, opts?: pulumi.CustomResourceOptions) { - super(myprovider, name, props, opts); - } -} -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -from pulumi import Input, ResourceOptions -from pulumi.dynamic import Resource -from typing import Any, Optional - -class MyResourceInputs(object): - my_string_prop: Input[str] - my_bool_prop: Input[bool] - def __init__(self, my_string_prop, my_bool_prop): - self.my_string_prop = my_string_prop - self.my_bool_prop = my_bool_prop - -class MyResource(Resource): - def __init__(self, name: str, props: MyResourceInputs, opts: Optional[ResourceOptions] = None): - super().__init__(MyProvider(), name, {**vars(props)}, opts) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -// Dynamic Providers are currently not supported in Go. -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -// Dynamic Providers are currently not supported in .NET. -``` - -{{% /choosable %}} - -{{< /chooser >}} - -##### Resource Provider Interface - -Implementing the `pulumi.dynamic.ResourceProvider` interface requires implementing a subset of the following methods. Each of these methods may be asynchronous, and most implementations of these methods will perform network I/O to provision resources in a backing cloud provider or other resource model. There are several important contracts between a dynamic provider and the Pulumi CLI that inform when these methods are called and with what data. - -Though the input properties passed to a `pulumi.dynamic.Resource` instance will usually be [`Input` values](#outputs) the dynamic provider's functions are invoked with the fully resolved input values in order to compose well with Pulumi resources. Strong typing for the inputs to your provider's functions can help clarify this. You can achieve this by creating a second interface with the same properties as your resource's inputs, but with fully unwrapped types. - -{{< chooser language "typescript,python,go,csharp" >}} - -{{% choosable language typescript %}} - -```typescript -// Exported type. -export interface MyResourceInputs { - myStringProp: pulumi.Input; - myBoolProp: pulumi.Input; - ... -} - -// Non-exported type used by the provider functions. -// This interface contains the same inputs, but as un-wrapped types. -interface MyResourceProviderInputs { - myStringProp: string; - myBoolProp: boolean; - ... -} - -class MyResourceProvider implements pulumi.dynamic.ResourceProvider { - async create(inputs: MyResourceProviderInputs): Promise { - ... - } - - async diff(id: string, oldOutputs: MyResourceProviderOutputs, newInputs: MyResourceProviderInputs): Promise { - ... - } - ... -} - -class MyResource extends pulumi.dynamic.Resource { - constructor(name: string, props: MyResourceInputs, opts?: pulumi.CustomResourceOptions) { - super(myprovider, name, props, opts); - } -} -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -from pulumi import Input, Output, ResourceOptions -from pulumi.dynamic import * -from typing import Any, Optional - -class MyResourceInputs(object): - my_string_prop: Input[str] - my_bool_prop: Input[bool] - - def __init__(self, my_string_prop, my_bool_prop): - self.my_string_prop = my_string_prop - self.my_bool_prop = my_bool_prop - -class _MyResourceProviderInputs(object): - """ - MyResourceProviderInputs is the unwrapped version of the same inputs - from the MyResourceInputs class. - """ - my_string_prop: str - my_bool_prop: bool - - def __init__(self, my_string_prop: str, my_bool_prop: bool): - self.my_bool_prop = my_bool_prop - self.my_string_prop = my_string_prop - -class MyResourceProvider(ResourceProvider): - def create(self, inputs: _MyResourceProviderInputs) -> CreateResult: - ... - return CreateResult() - - def diff(self, id: str, oldInputs: _MyResourceProviderInputs, newInputs: _MyResourceProviderInputs) -> DiffResult: - ... - return DiffResult() - -class MyResource(Resource): - def __init__(self, name: str, props: MyResourceInputs, opts: Optional[ResourceOptions] = None): - super().__init__(MyResourceProvider(), name, {**vars(props)}, opts) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -// Dynamic Providers are currently not supported in Go. -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -// Dynamic Providers are currently not supported in .NET. -``` - -{{% /choosable %}} -{{< /chooser >}} - -###### `check(olds, news)` - -`check` is invoked before any other methods, and is passed the resolved input properties that were originally provided to the resource constructor by the user. It is passed both the old input properties that were stored in the _state file_ after the previous update to the resource, as well as the new inputs from the current deployment. It has two jobs: (1) Verify that the inputs (particularly the news) are valid and return useful error messages if they are not, and (2) Return a set of checked inputs. The inputs returned from the call to `check` will be the inputs that the Pulumi engine uses for all further processing of the resource, including the values that will be passed back in to `diff`, `create`, `update`, or other operations. In many cases, the `news` can be returned directly as the checked inputs. But in cases where the provider needs to populate defaults, or do some normalization on values, it may want to do that in the `check` method so that this data is complete and normalized prior to being passed in to other methods. - -###### `create(inputs)` - -`create` is invoked when the URN of the resource created by the user is not found in the existing state of the deployment. The engine passes the provider the checked inputs returned from the call to `check`. The `create` method is expected to do the work in the backing cloud provider to create the requested resource. It then returns two pieces of data: (1) an `id` that can uniquely identify the resource in the backing provider for later lookups, and (2) a set of `outputs` from the backing provider that should be returned to the user code as properties on the {{< pulumi-customresource >}} object, and stored in the _checkpoint_ file. If an error occurs, an exception can be thrown from the `create` method to return this error to the user. - -###### `diff(id, olds, news)` - -`diff` is invoked when the URN of the resource created by the user is found in the existing state of the deployment. This means the resource already exists, and will need to be either updated or replaced. The `diff` method is passed the `id` of the resource---as returned by `create`, as well as the old outputs from the checkpoint file which are values returned from a previous call to either `create` or `update`. It is also passed the new checked inputs from the current deployment. It returns four optional values: - -* `changes`: `true` if the provider believes there is a difference between the `olds` and `news` and wants to do an `update` or `replace` to affect this change. -* `replaces`: An array of property names that have changed that should force a replacement. Returning a non-zero length array here will tell the Pulumi engine to schedule a replacement instead of an update, which might involve downtime, so this should only be used when a `diff` requested by the user cannot be implemented as an in-place update on the backing cloud provider. -* `stables`: An array of property names that are known not to change between updates. Pulumi will use this information to allow some {{< pulumi-apply >}} calls on {{< pulumi-output >}} to be processed during `previews` because it knows that the values of these will stay the same during an update. -* `deleteBeforeReplace`: `true` if the proposed replacements require deleting the existing resource before creating the new one. By default Pulumi will try to create the new resource before deleting the old one to avoid downtime. -If an error occurs, an exception can be thrown from the `diff` method to return this error to the user. - -###### `update(id, olds, news)` - -Update is invoked if the call to `diff` indicates replacement is not needed. It is passed the `id` of the resource as returned by `create`, and the old outputs from the checkpoint file which are values returned from a previous call to either `create` or `update`. It is also passed the new checked inputs from the current deployment. The `update` method is expected to do the work in the backing cloud provider to update an existing resource to the new desired state. It then returns a new set of `outputs` from the backing provider that should be returned to the user code as properties on the {{< pulumi-customresource >}} object, and stored into the checkpoint file. If an error occurs, an exception can be thrown from the `update` method to return this error to the user. - -###### `delete(id, props)` - -Delete is invoked if the URN exists in the previous state but not in the new desired state, or if a replacement is needed. It is passed the `id` of the resource as returned by `create`, and the old outputs from the checkpoint file which are values returned from a previous call to either `create` or `update`. It is expected to delete the corresponding resource from the backing cloud provider. Nothing needs to be returned. If an error occurs, an exception can be thrown from the `delete` method to return this error to the user. - -###### `read(id, props)` - -Read is invoked when the Pulumi engine needs to get data about a resource that is not managed by Pulumi. It is passed the `id` of the resource as tracked in the backing cloud provider, and an optional bag of additional properties that can be used to disambiguate the request if needed. The `read` method is expected to look up the requested resource, and return the canonical `id` and output properties of this resource if found. If an error occurs, an exception can be thrown from the `read` method to return this error to the user. - -##### Dynamic Resource Outputs - -Any outputs can be returned by your `create` function in the `outs` property of `pulumi.dynamic.CreateResult`. - -> **Note:** The following only applies to statically typed languages. - -If you need to access the outputs of your custom resource outside it with strong typing support, declare each output property returned in the `outs` property by your `create` function as a class member of the `pulumi.dynamic.Resource` itself. For example, in TypeScript, these must be declared as `public readonly` class members in your `pulumi.dynamic.Resource` class. These class members must also have the type `pulumi.Output`. - -> **Note:** The name of the class member must match the names of the output properties as returned by the `create` function. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -JavaScript does not support types. -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -... - -interface MyResourceProviderOutputs { - myNumberOutput: number; - myStringOutput: string; -} - -class MyResourceProvider implements pulumi.dynamic.ResourceProvider { - async create(inputs: MyResourceProviderInputs): Promise { - ... - // Values are for an example only. - return { id: "...", outs: { myNumberOutput: 12, myStringOutput: "some value" }}; - } -} - -export class MyResource extends pulumi.dynamic.Resource { - public readonly myStringOutput!: pulumi.Output; - public readonly myNumberOutput!: pulumi.Output; - - constructor(name: string, props: MyResourceInputs, opts?: pulumi.CustomResourceOptions) { - super(myprovider, name, { myStringOutput: undefined, myNumberOutput: undefined, ...props }, opts); - } -} -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -from pulumi import ResourceOptions, Input, Output -from pulumi.dynamic import Resource, ResourceProvider, CreateResult -from typing import Any, Optional - -... -... - -class MyProvider(ResourceProvider): - def create(self, inputs): - return CreateResult(id_="foo", outs={ 'my_number_output': 12, 'my_string_output': "some value" }) - -class MyResource(Resource): - my_string_output: Output[str] - my_number_output: Output[str] - - def __init__(self, name: str, props: MyResourceInputs, opts: Optional[ResourceOptions] = None): - super().__init__(MyProvider(), name, { 'my_string_output': None, 'my_number_output': None, **vars(props) }, opts) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -// Dynamic Providers are not yet supported in Go. -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -// Dynamic Providers are currently not supported in .NET. -``` - -{{% /choosable %}} - -{{< /chooser >}} - -##### Dynamic Provider Examples - -###### Example: Random - -This example generates a random number using a dynamic provider. It highlights using dynamic providers to run some code only when a resource is created, and then store the results of that in the state file so that this value is maintained across deployments of the resource. Because we want our random number to be created once, and then remain stable for subsequent updates, we cannot simply use a random number generator in our program; we need dynamic providers. The result is a provider similar to the one provided in `@pulumi/random`, just specific to our program and language. - -Implementing this example requires that we have a provider and resource type: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let pulumi = require("@pulumi/pulumi"); -let crypto = require("crypto"); - -let randomprovider = { - async create(inputs) { - return { id: crypto.randomBytes(16).toString('hex'), outs: {}}; - }, -} - -class Random extends pulumi.dynamic.Resource { - constructor(name, opts) { - super(randomprovider, name, {}, opts); - } -} - -exports.Random = Random; -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -import * as pulumi from "@pulumi/pulumi"; -import * as crypto from "crypto"; - -const randomprovider: pulumi.dynamic.ResourceProvider = { - async create(inputs) { - return { id: crypto.randomBytes(16).toString('hex'), outs: {}}; - }, -} - -export class Random extends pulumi.dynamic.Resource { - constructor(name: string, opts?: pulumi.CustomResourceOptions) { - super(randomprovider, name, {}, opts); - } -} -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -from pulumi import ResourceOptions -from pulumi.dynamic import Resource, ResourceProvider, CreateResult -from typing import Optional -import binascii -import os - -class RandomProvider(ResourceProvider): - def create(self, inputs): - return CreateResult(id_=binascii.b2a_hex(os.urandom(16)), outs={}) - -class Random(Resource): - def __init__(self, name: str, opts: Optional[ResourceOptions] = None): - super().__init__(RandomProvider(), name, {}, opts) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -// Dynamic Providers are currently not supported in Go. -``` - -{{% /choosable %}} - -{{% choosable language csharp %}} - -```csharp -// Dynamic Providers are currently not supported in .NET. -``` - -{{% /choosable %}} - -{{< /chooser >}} - -Now, with this, we can construct new `Random` resource instances, and Pulumi will drive the right calls at the right time. - -###### Example: GitHub Labels REST API - -This example highlights making REST API calls to some backing provider---the GitHub API in this case---to perform CRUD operations. Because the resource provider method implementations will be serialized and used in a different process, we keep all the work to initialize the REST client and make calls to it local to each function. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let pulumi = require("@pulumi/pulumi"); -let Octokit = require("@octokit/rest"); - -// Set this value before creating an instance to configure the authentication token to use for deployments -let auth = "token invalid"; -exports.setAuth = function(token) { auth = token; } - -const githubLabelProvider = { - async create(inputs) { - const ocktokit = new Ocktokit({auth}); - const label = await ocktokit.issues.createLabel(inputs); - return { id: label.data.id.toString(), outs: label.data }; - }, - async update(id, olds, news) { - const ocktokit = new Ocktokit({auth}); - const label = await ocktokit.issues.updateLabel({ ...news, current_name: olds.name }); - return { outs: label.data }; - }, - async delete(id, props) { - const ocktokit = new Ocktokit({auth}); - await ocktokit.issues.deleteLabel(props); - } -} - -class Label extends pulumi.dynamic.Resource { - constructor(name, args, opts) { - super(githubLabelProvider, name, args, opts); - } -} - -exports.Label = Label; -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -import * as pulumi from "@pulumi/pulumi"; -import * as Ocktokit from "@octokit/rest"; - -// Set this value before creating an instance to configure the authentication token to use for deployments -let auth = "token invalid"; -export function setAuth(token: string) { auth = token; } - -export interface LabelResourceInputs { - owner: pulumi.Input; - repo: pulumi.Input; - name: pulumi.Input; - color: pulumi.Input; - description?: pulumi.Input; -} - -interface LabelInputs { - owner: string; - repo: string; - name: string; - color: string; - description?: string; -} - -const githubLabelProvider: pulumi.dynamic.ResourceProvider = { - async create(inputs: LabelInputs) { - const ocktokit = new Ocktokit({auth}); - const label = await ocktokit.issues.createLabel(inputs); - return { id: label.data.id.toString(), outs: label.data }; - }, - async update(id, olds: LabelInputs, news: LabelInputs) { - const ocktokit = new Ocktokit({auth}); - const label = await ocktokit.issues.updateLabel({ ...news, current_name: olds.name }); - return { outs: label.data }; - }, - async delete(id, props: LabelInputs) { - const ocktokit = new Ocktokit({auth}); - await ocktokit.issues.deleteLabel(props); - } -} - -export class Label extends pulumi.dynamic.Resource { - constructor(name: string, args: LabelResourceInputs, opts?: pulumi.CustomResourceOptions) { - super(githubLabelProvider, name, args, opts); - } -} -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -from pulumi import ComponentResource, export, Input, Output -from pulumi.dynamic import Resource, ResourceProvider, CreateResult, UpdateResult -from typing import Optional -from github import Github, GithubObject - -auth = "" -g = Github(auth) - -class GithubLabelArgs(object): - owner: Input[str] - repo: Input[str] - name: Input[str] - color: Input[str] - description: Optional[Input[str]] - def __init__(self, owner, repo, name, color, description=None): - self.owner = owner - self.repo = repo - self.name = name - self.color = color - self.description = description - -class GithubLabelProvider(ResourceProvider): - def create(self, props): - l = g.get_user(props["owner"]).get_repo(props["repo"]).create_label( - name=props["name"], - color=props["color"], - description=props.get("description", GithubObject.NotSet)) - return CreateResult(l.name, {**props, **l.raw_data}) - def update(self, id, _olds, props): - l = g.get_user(props["owner"]).get_repo(props["repo"]).get_label(id) - l.edit(name=props["name"], - color=props["color"], - description=props.get("description", GithubObject.NotSet)) - return UpdateResult({**props, **l.raw_data}) - def delete(self, id, props): - l = g.get_user(props["owner"]).get_repo(props["repo"]).get_label(id) - l.delete() - -class GithubLabel(Resource): - name: Output[str] - color: Output[str] - url: Output[str] - description: Output[str] - def __init__(self, name, args: GithubLabelArgs, opts = None): - full_args = {'url':None, 'description':None, 'name':None, 'color':None, **vars(args)} - super().__init__(GithubLabelProvider(), name, full_args, opts) - -label = GithubLabel("foo", GithubLabelArgs("lukehoban", "todo", "mylabel", "d94f0b")) - -export("label_color", label.color) -export("label_url", label.url) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -// Dynamic Providers are not currently supported in Go. -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -// Dynamic Providers are currently not supported in .NET. -``` - -{{% /choosable %}} - -{{< /chooser >}} - -#### Additional Examples - -* [Add a Custom Domain to an Azure CDN endpoint](https://github.com/pulumi/examples/tree/master/azure-ts-dynamicresource) - * Similar to the previous example, this is another example of a shortcoming of the regular Azure resource provider available in Pulumi. However, due to the availability of a REST API, we can easily add a custom domain to an Azure CDN resource using a dynamic provider. -* [Dynamic Providers as Provisioners](https://github.com/pulumi/examples/tree/master/aws-ts-ec2-provisioners) - * Provisioning a VM after it is created is a common problem. Developers have the option to run user-supplied scripts while creating the VM itself. For example, the AWS EC2 resource has a userData parameter, that allows you to specify an inline script, which EC2 will run at instance startup. However, this example of dynamic providers as provisioners allows you to copy/execute scripts on the target instance without replacing the instance itself. - -### Stack Outputs {#stack-outputs} - -A stack may export values as [stack outputs]({{< relref "stack#outputs" >}}). These outputs are shown during an update, can be easily retrieved from the Pulumi CLI, and are displayed in the Pulumi Console. They can be used for important values like resource IDs and computed IP addresses and DNS names. They can also be used for [inter-stack dependencies](#stack-references), such as when a lower layer of infrastructure needs to export values for consumption elsewhere. - -To export values from a stack, use the following definition in the top-level of the entrypoint for your project: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -exports.url = resource.url; -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -export let url = resource.url; -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -pulumi.export("url", resource.url) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -ctx.Export("url", resource.Url) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -public class MyStack : Stack -{ - public MyStack() - { - ... - this.Url = resource.Url; - } - - // 'url' is the output name. By default, it would take the property name 'Url'. - [Output("url")] Output Url { get; set; } -} - ``` - -{{% /choosable %}} - -{{< /chooser >}} - -From the CLI, you can then use [`pulumi stack output url`]({{< relref "/docs/reference/cli/pulumi_stack_output" >}}) to get the value and incorporate into other scripts or tools. - -The right-hand side of a stack export can be a regular value, an [Output](#outputs), or a `Promise` (effectively, the same as an [Input](#outputs)). The actual values are resolved at the end of `pulumi up`. - -Stack exports are effectively JSON serialized, though quotes are removed when exporting strings. - -For example, this program: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -exports.x = "hello" -exports.o = {num: 42} -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -export let x = "hello"; -export let o = {num: 42}; -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -pulumi.export("x", "hello") -pulumi.export("o", {'num': 42}) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -ctx.Export("x", pulumi.String("hello")) -ctx.Export("o", pulumi.Map(map[string]pulumi.Input{ - "num": pulumi.Int(42), -})) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -class MyStack : Stack -{ - [Output] public Output x { get; set; } - [Output] public Output> o { get; set; } - - public MyStack() - { - this.x = Output.Create("hello"); - this.o = Output.Create( - new Dictionary { { "num", 42 } } - .ToImmutableDictionary()); - } -} -``` - -{{% /choosable %}} - -{{< /chooser >}} - -will lead to the following stack outputs: - -```bash -$ pulumi stack output x -hello -$ pulumi stack output o -{"num": 42} -``` - -The full set of outputs can be rendered as JSON using `pulumi stack output --json`: - -```bash -$ pulumi stack output --json -{ - "x": "hello", - "o": { - "num": 42 - } -} -``` - -> **Note**: If you export a resource, it too will be JSON serialized. This usually isn't what you want, especially as some resources can be quite large. If you only wanted to export its ID or name, for example, just export those properties directly. - -Stack outputs respect secret annotations and will also be encrypted appropriately. If a stack contains any secret values, their plaintext values will not be shown by default. Instead, they will be displayed as `[secret]` in the CLI. Pass `--show-secrets` to `pulumi stack output` to see the plaintext value. - -### Stack References {#stack-references} - -Stack references allow you to access the [outputs](#stack-outputs) of one stack from another stack. - -To reference values from another stack, create an instance of the `StackReference` type using the fully qualified name of the stack as an input, and then read exported stack outputs by their name: - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -const pulumi = require("@pulumi/pulumi"); -const other = new pulumi.StackReference("acmecorp/infra/other"); -const otherOutput = other.getOutput("x"); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -import * as pulumi from "@pulumi/pulumi"; -const other = new pulumi.StackReference("acmecorp/infra/other"); -const otherOutput = other.getOutput("x"); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -from pulumi import StackReference - -other = StackReference(f"acmecorp/infra/other") -other_output = other.get_output("x"); -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -other, err := pulumi.NewStackReference(ctx, "acmecorp/infra/other", nil) -if err != nil { - return err -} -otherOutput := other.GetOutput(pulumi.String("x")) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var other = new StackReference("acmecorp/infra/other"); -var otherOutput = other.GetOutput("x"); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -Stack names must be fully qualified, including the organization, project, and stack name components, in the format `//`. For individual accounts, use your account name for the organization component. - -### Assets and Archives - -The Pulumi SDK provides two classes for working with files - `Asset` and `Archive`. Some Pulumi Resource inputs accept either an `Asset` or an `Archive` as input, and Pulumi understands how to take the files referenced by the `Asset` or `Archive` and package them up for use by the resource. There are several different concrete implementations of these two concepts, based on various ways the files might be provided - whether in memory, on disk, or in an archive. Similarly, these can be consumed by resources that expect a variety of packaging formats. The Pulumi `Asset` and `Archive` concepts provide a bridge between these two. - -#### Assets - -There are three kinds of `Asset`: - -* `FileAsset`: The contents of the asset are read from a file on disk. -* `StringAsset`: The contents of the asset are read from a string in memory. -* `RemoteAsset`: The contents of the asset are read from an `http`, `https` of `file` URI. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let fileAsset = new pulumi.asset.FileAsset("./file.txt"); -let stringAsset = new pulumi.asset.StringAsset("Hello, world!"); -let remoteAsset = new pulumi.asset.RemoteAsset("http://worldclockapi.com/api/json/est/now"); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let fileAsset = new pulumi.asset.FileAsset("./file.txt"); -let stringAsset = new pulumi.asset.StringAsset("Hello, world!"); -let remoteAsset = new pulumi.asset.RemoteAsset("http://worldclockapi.com/api/json/est/now"); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -file_asset = pulumi.FileAsset("./file.txt") -string_asset = pulumi.StringAsset("Hello, world!") -remote_asset = pulumi.RemoteAsset("http://worldclockapi.com/api/json/est/now") -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -fileAsset := pulumi.NewFileAsset("./file.txt") -stringAsset := pulumi.NewStringAsset("Hello, world!") -remoteAsset := pulumi.NewRemoteAsset("http://worldclockapi.com/api/json/est/now") -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -using Pulumi; - -var fileAsset = new FileAsset("./file.txt); -var stringAsset = new StringAsset("Hello, world!"); -var remoteAsset = new RemoteAsset("http://worldclockapi.com/api/json/est/now"); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -Any of these assets can be passed to a resource accepting an `Asset` as input. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let object = new aws.s3.BucketObject(`obj`, { - bucket: bucket.id, - key: key, - source: fileAsset, -}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let object = new aws.s3.BucketObject("obj", { - bucket: bucket.id, - key: key, - source: fileAsset, -}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -obj = aws.s3.BucketObject("obj", - bucket=bucket.id, - key=key, - source=fileAsset) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -obj, err := s3.NewBucketObject(ctx, "obj", &s3.BucketObjectArgs{ - Bucket: bucket.ID(), - Key: key, - Source: fileAsset, -}) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var obj = new Aws.S3.BucketObject("obj", new Aws.S3.BucketObjectArgs -{ - Bucket = bucket.Id, - Key = key, - Source = fileAsset, -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -#### Archives - -There are three kinds of `Archive`: - -* `FileArchive`: The contents of the archive are read from either a folder on disk or a file on disk in one of the supported formats: `.tar`, `.tgz`, `.tar.gz`, `.zip` or `.jar`. -* `RemoteArchive`: The contents of the asset are read from an `http`, `https` of `file` URI, which must produce an archive of one of the same supported types as `FileArchive`. -* `AssetArchive`: The contents of the archive are read from a map of either [`Asset`](#asset) or [`Archive`](#archive) objects, one file or folder respectively per entry in the map. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let fileArchive = new pulumi.asset.FileArchive("./file.zip"); -let remoteArchive = new pulumi.asset.RemoteArhcive("http://contoso.com/file.zip"); -let assetArchive = new pulumi.asset.AssetArchive({ - "file": new pulumi.asset.StringAsset("Hello, world!"), - "folder": new pulumi.asset.FileArchive("./folder"), -}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let fileArchive = new pulumi.asset.FileArchive("./file.zip"); -let remoteArchive = new pulumi.asset.RemoteArhcive("http://contoso.com/file.zip"); -let assetArchive = new pulumi.asset.AssetArchive({ - "file": new pulumi.asset.StringAsset("Hello, world!"), - "folder": new pulumi.asset.FileArchive("./folder"), -}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -file_archive = pulumi.FileArchive("./file.zip") -remote_archive = pulumi.RemoteArhcive("http://contoso.com/file.zip") -asset_archive = pulumiAssetArchive({ - "file": pulumi.StringAsset("Hello, world!"), - "folder": pulumi.FileArchive("./folder") -}) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -fileArchive := pulumi.NewFileArchive("./file.zip") -remoteArchive := pulumi.NewRemoteArhcive("http://contoso.com/file.zip") -assetArchive := pulumi.NewAssetArchive(map[string]interface{}{ - "file": pulumi.NewStringAsset("Hello, world!"), - "folder": pulumi.NewFileArchive("./folder"), -}) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -using Pulumi; - -var fileArchive = new FileArchive("./file.zip"); -var remoteArchive = new RemoteArhcive("http://contoso.com/file.zip"); -var assetArchive = new AssetArchive(new Dictionary -{ - { "file", new StringAsset("Hello, world!") }, - { "folder", new FileArchive("./folder") } -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -Note that a folder may be passed to `FileArchive` to constuct an archive from the contents of that folder. Note also that both assets (single files) and archives (folders containing files) can be combined as part of building up an `AssetArchive`. - -Any of these archives can be passed to a resource accepting an `Archive` as input. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} - -```javascript -let fn = new aws.lambda.Function(`fn`, { - role: role.arn, - runtime: "python3.7", - handler: "hello.handler", - code: fileArchive, -}); -``` - -{{% /choosable %}} -{{% choosable language typescript %}} - -```typescript -let fn = new aws.lambda.Function(`fn`, { - role: role.arn, - runtime: "python3.7", - handler: "hello.handler", - code: fileArchive, -}); -``` - -{{% /choosable %}} -{{% choosable language python %}} - -```python -fn = lambda_.Function("fn", - role=role.arn, - runtime="python3.7", - handler="hello.handler", - code=fileArchive) -``` - -{{% /choosable %}} -{{% choosable language go %}} - -```go -fn, err := lmabda.NewFunction(ctx, "fn", &lambda.FunctionArgs{ - Rucket: role.ARN(), - Runtime: "python3.7", - Handler: "hello.handler", - Code: fileArchive, -}) -``` - -{{% /choosable %}} -{{% choosable language csharp %}} - -```csharp -var fn = new Aws.Lambda.Function("fn", new Aws.Lambda.FunctionArgs -{ - Role = role.arn, - Runtime = "python3.7", - Handler = "hello.handler", - Code = fileArchive, -}); -``` - -{{% /choosable %}} - -{{< /chooser >}} - -### Runtime Functions - -The Pulumi SDK library also offers a number of helper functions. - -* [Current Project or Stack](#current-project-stack): get information about the current deployment -* [Logging](#logging): for diagnostics, warnings, or errors pertaining to the deployment -* [Serializing Lambdas](#runtime): for turning JavaScript callbacks into data which can be used as application code - -#### Getting the Current Project or Stack {#current-project-stack} - -The {{< pulumi-getproject >}} and {{< pulumi-getstack >}} functions give you the currently deploying project and stack, respectively. This can be useful for naming or tagging resources. - -{{< chooser language "javascript,typescript,python,go,csharp" >}} - -{{% choosable language javascript %}} +## Pulumi Programming Model {#pulumi-programming-model} -```javascript -let project = pulumi.getProject(); -let stack = pulumi.getStack(); -``` +This diagram illustrates the structure of the Pulumi programming model. -{{% /choosable %}} -{{% choosable language typescript %}} +![Programming](programming-model.png) -```typescript -let project = pulumi.getProject(); -let stack = pulumi.getStack(); -``` +### Definitions -{{% /choosable %}} -{{% choosable language python %}} +Here are explanations of each component of the programming model. -```python -project = pulumi.get_project() -stack = pulumi.get_stack() -``` +**Project**. A Pulumi [project]() contains code for declaring infrastructure. It has a name and instructions on how to run the code. The project folder also contains the default stack configuration files. -{{% /choosable %}} -{{% choosable language go %}} +**Program**. A [program]() is the code for building infrastructure and organizing them into stacks. -```go -project := ctx.Project() -stack := ctx.Stack() -``` +**Stack**. [Stacks]() are an instantiation of a program and contain a collection of cloud resources. A project can have multiple stacks. Stacks are similar to environments. For example, a project might have a dev stack, a test stack and a production stack. -{{% /choosable %}} -{{% choosable language csharp %}} +**Resource**. A [resource]() represents a type of infrastructure, such as a compute instance. Resources can be aggregated together as component resources -```csharp -var project = Deployment.Instance.ProjectName; -var stack = Deployment.Instance.StackName; -``` +**Inputs**. A resource has [inputs]() that represent the properties and dependencies between resources. An example of an input is the connection string to a database. -{{% /choosable %}} +**Outputs**. A resource has [outputs]() that are properties of the resource instance. Outputs are also how Pulumi tracks dependencies between resources. -{{< /chooser >}} +**Secrets**. One type of input is a [secret](). Secrets are private data, such as passwords, used by a resource. Secrets can be encrypted. -#### Logging +**Environment Variables**. Another type of input are [environment variables](), which the stack requires to deploy the infrastructure correctly. An example of an environment variable is the AWS region where you will deploy your infrastructure. -The {{< pulumi-log >}} collection of functions allows you to log diagnostics, warnings, or errors with the Pulumi engine. These will be displayed alongside all other Pulumi output in the CLI and in the Pulumi Console. They will also be logged and kept for historical purposes if you ever want to use them to audit or diagnose what has transpired. +**Stack Outputs**. A [stack output]() consists of the properties that a stack exports, such as a domain name or a Kubernetes kubeconfig file. -{{< chooser language "javascript,typescript,python,go,csharp" >}} +**Stack References**. A [stack reference]() connects the exported properties of one stack to another stack. For example, you can declare a Kubernetes cluster in one stack which consumes services in another stack. -{{% choosable language javascript %}} +### How the model works {#how-the-model-works} -```javascript -pulumi.log.info("message") -pulumi.log.info("message", resource) -pulumi.log.debug("hidden by default") -pulumi.log.warn("warning") -pulumi.log.error("fatal error") -``` +A Pulumi project is a directory that contains the configuration files and the code. The code declares the infrastructure you want. The configuration files tell the Pulumi CLI how to run the code and can contain project information such as environment variables and secrets. -{{% /choosable %}} -{{% choosable language typescript %}} +When you run a program, via the pulumi up command, it instantiates a stack, which contains the infrastructure resources declared in the code. Resources can take inputs such as the port number for a service created by a resource. The stack can also export outputs, such as an IP address, which can be used by you or by another stack via a stack reference. -```typescript -pulumi.log.info("message") -pulumi.log.info("message", resource) -pulumi.log.debug("hidden by default") -pulumi.log.warn("warning") -pulumi.log.error("fatal error") -``` +The Pulumi programming model lets you use imperative programming languages to declare infrastructure. Pulumi SDKs abstract cloud resources so that you can set their properties by using a programming language. They are instantiated declaratively by the Pulumi CLI. The advantage of using code is that you can extend or combine resources to build infrastructure to your design. -{{% /choosable %}} -{{% choosable language python %}} +## Pulumi Environment {#pulumi-environment} -```python -log.info("message") -log.info("message", resource) -log.debug("hidden by default") -log.warn("warning") -log.error("fatal error") -``` +Here are explanations of each component of the Pulumi environment. -{{% /choosable %}} -{{% choosable language go %}} +### Definitions -```go -// Optional arguments for logging. -args := &pulumi.LogArgs{ - Resource: resource, - StreamID: 0, - Ephemeral: false, -} +**Cloud Service Provider**. Any company or organization that manages cloud services. -ctx.Log.Info("message", nil) -ctx.Log.Info("message", args) -ctx.Log.Debug("hidden by default", nil) -ctx.Log.Warn("warning", nil) -ctx.Log.Error("fatal error", nil) -``` +**Pulumi engine**. The Pulumi engine runs the set of operations that can create infrastructure or move it from its current state to its desired state. -{{% /choosable %}} -{{% choosable language csharp %}} +**Resource Provider**. A resource provider communicates with the cloud service to create the declared infrastructure. -```csharp -Pulumi.Log.Info("message"); -Pulumi.Log.Info("message", resource); -Pulumi.Log.Debug("hidden by default"); -Pulumi.Log.Warn("warning"); -Pulumi.Log.Error("fatal error"); -``` +**Language Host**. The language host runs a Pulumi program and sets up an environment where it can register resources with the deployment engine. -{{% /choosable %}} +**Program State**. Pulumi stores a copy of the current state of your infrastructure. This is often called state and is stored in transactional snapshots called checkpoints. Pulumi records checkpoints at various points so that it can differentiate between the goal state and the current state during an update, recover from a failure, or destroy resources. -{{< /chooser >}} +### How Pulumi Deploys Resources -#### Serializing Lambdas NODE.JS ONLY {#runtime} +Pulumi uses a desired state model for managing infrastructure. A language host executes a Pulumi program to compute a desired state for a stack’s infrastructure. The deployment engine (this is different from the Pulumi engine) compares this desired state with the stack’s current state and determines what resources need to be created, updated or deleted. The engine uses a set of resource providers (such as AWS or Azure) to manage the individual resources. As it operates, the engine updates the state of your infrastructure with information about all resources that have been provisioned as well as any pending operations. -You can create libraries and components that allow the caller to pass in JavaScript callbacks to invoke at runtime. For example, you can create an AWS Lambda function or an Azure Function by providing a JavaScript callback to be used as its implementation. +The following diagram illustrates the interaction between the components that make up the Pulumi environment. -{{< chooser language "javascript,typescript,python,go,csharp" >}} +![Deploy resources](deploy-resources.png) -{{% choosable language javascript %}} +### Language Hosts -```javascript -let bucket = new aws.s3.Bucket("mybucket"); -bucket.onObjectCreated("onObject", async (ev) => { - // This is the code that will be run when the Lambda is invoked (any time an object is added to the bucket). - console.log(JSON.stringify(ev)); -}); -``` +The language host is responsible for running a Pulumi program and setting up an environment where it can register resources with the deployment engine. The language host has two pieces: -{{% /choosable %}} -{{% choosable language typescript %}} +- A language executor, which is a binary named `pulumi-language-`, which Pulumi uses to launch the runtime for the language your program is written in (e.g. Node or Python). This binary is distributed with the Pulumi CLI. -```typescript -let bucket = new aws.s3.Bucket("mybucket"); -bucket.onObjectCreated("onObject", async (ev: aws.s3.BucketEvent) => { - // This is the code that will be run when the Lambda is invoked (any time an object is added to the bucket). - console.log(JSON.stringify(ev)); -}); -``` +- A language runtime, which prepares your program for execution and observes its execution in order to detect resource registrations. When a resource is registered (for example, via `new Resource()` in JavaScript or `Resource(...)` in Python), the language runtime communicates the registration request back to the deployment engine. -{{% /choosable %}} -{{% choosable language python %}} + The language runtime is distributed as a regular package, just like any other code that might depend on your program. For example, the Node runtime is contained in the `@pulumi/pulumi` package available on npm, and the Python runtime is contained in the `pulumi` package available on PyPI. -```python -# Runtime code provided via callbacks are currently not supported in Python. -# -# See https://github.com/pulumi/pulumi/issues/1535. -``` +### Deployment Engine -{{% /choosable %}} -{{% choosable language go %}} +The deployment engine is embedded in the Pulumi CLI. The deployment engine computes the set of operations that will move the current state of your infrastructure to the desired state. When the deployment engine receives a resource registration from the language host, the engine examines the existing state to determine if that resource already exists. . If it doesn’t, , the engine uses a resource provider to create it on the cloud service. If it already exists, the engine works with the resource provider to determine if anything has changed by comparing the old state of the resource with the new, desired state. If there are changes, the engine determines if it can update the current resource or if it must replace it by creating a new version and deleting the old version. The decision depends on what resource properties are changing and the type of the resource itself. When the language host reports to the deployment engine that it has executed the Pulumi program, the engine looks for any existing resources without a new resource registration and schedules these resources for deletion. -```go -// Runtime code provided via callbacks are currently not supported in Go. -// -// See https://github.com/pulumi/pulumi/issues/1614. -``` +### Resource Providers -{{% /choosable %}} -{{% choosable language csharp %}} +A resource provider has two pieces: -```csharp -// Runtime code provided via callbacks are currently not supported in .NET. -// -// See https://github.com/pulumi/pulumi/issues/3406. -``` +- A resource plugin, which is the binary the deployment engine uses to manage a resource. These plugins are stored in the plugin cache (located in `~/.pulumi/plugins`). You can manage them with the Pulumi plugin commands. -{{% /choosable %}} +- An SDK which provides bindings for each type of resource the provider can manage. Like the language runtime itself, the SDKs are available as regular packages. For example, there is a `@pulumi/aws` package for Node, which is available on npm and a `pulumi_aws` package for Python, which is available on PyPI. When these packages are added to your project, they run `pulumi plugin install` behind the scenes in order to download the resource plugin from pulumi.com. -{{< /chooser >}} +### State -Libraries which use JavaScript callbacks as inputs to be provided as source text to resource construction---like the Lambda that is created by the `onObjectCreated` function in the previous example---are built on top of the [pulumi.runtime.serializeFunction]({{< relref "/docs/reference/pkg/nodejs/pulumi/pulumi/runtime#serializeFunction" >}}) API, which takes a JavaScript `Function` object as input, and returns a `Promise` containing the serialized form of that function. +State is critical to how Pulumi operates. Pulumi stores a copy of the current infrastructure state. State is stored in transactional snapshots called checkpoints. A checkpoint is recorded by Pulumi at various points so that it can diff between the goal state and the current state during an update, recovering from failure, or destroying resources. -When serializing a function to text, the following steps are taken: +## Summary -1. Any captured variables referenced by the function are evaluated when the function is serialized. -2. The values of those variables are serialized. -3. When the values are objects, all properties and prototype chains are serialized. When the values are functions, those functions are serialized by following these same steps. +Building infrastructure with Pulumi requires a program to declare the infrastructure and the Pulumi environment to deploy and manage that infrastructure. There are two main differences between using your favorite programming language to write a program versus using a YAML or JSON [DSL]() to declare infrastructure. One is that a programming language allows you to extend or combine resources. The other difference is that you can take advantage of the language’s software engineering tools such as IDEs, testing frameworks, and versioning. -See [Serializing Functions]({{< relref "/docs/tutorials/aws/serializing-functions" >}}) for more details. +The following documents will give you a deeper understanding of the Pulumi programming model. diff --git a/content/docs/intro/concepts/programming-model.png b/content/docs/intro/concepts/programming-model.png new file mode 100644 index 0000000000000000000000000000000000000000..e43edbab2ea3527a065edd7e4840dd8b34c39aed GIT binary patch literal 26625 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