如何在Pulumi中控制资源创建顺序

时间:2018-06-20 22:02:10

标签: pulumi

我正在尝试创建一些资源,并且需要执行某种创建顺序。例如在将日志用作aws.s3.Bucket的输入之前,先创建一个aws.cloudfront.Distribution来存储日志。

使用Pulumi时如何控制资源创建顺序?

2 个答案:

答案 0 :(得分:2)

通常,Pulumi自动处理资源创建的顺序。在TypeScript中,甚至可以由语言的类型系统通过pulumi.Input<T>pulumi.Output<T>类型来强制执行。但是实际上并不需要了解这些类型的细节。

Pulumi引擎将解析资源的所有“参数”或“输入”。因此,如果将一个资源用作配置另一个资源的参数,则将首先创建从属资源。即按您希望的方式工作。

但是,在某些情况下,您需要显式标记一个资源依赖于另一个资源。当Pulumi程序之外存在某种耦合时,就会发生这种情况。

要指定显式依赖关系,可以为资源提供pulumi.ResourceOptions的实例,并设置其dependsOn属性。 Pulumi引擎将在处理资源之前解析dependsOn数组中的所有资源。

这是一个简单的示例,显示了Pulumi确定订购的两种方式。 AWS S3存储桶是一种包含称为对象的文件的资源。必须先创建存储桶,然后才能在其中创建任何对象。

// Create a bucket named "example-bucket", available at s3://example-bucket.
let bucket = new aws.s3.Bucket("bucket",
    {
        bucket: "example-bucket",
    });

let file1 = new aws.s3.BucketObject("file1", {
    // The bucket field of BucketObjectArgs is an instance of
    // aws.s3.Bucket. Pulumi will know to create the "bucket"
    // resource before this BucketObject resource.
    bucket: bucket,
});

let file2 = new aws.s3.BucketObject("file2",
    {
        // The bucket field of BucketObjectArgs is a string. So
        // Pulumi does not know to block creating the file2 resource
        // until the S3 bucket exists.
        bucket: "example-bucket",
    } as aws.s3.BucketArgs,
    {
        // By putting "bucket" in the "dependsOn" array here,
        // the Pulumi engine will create the bucket resource before
        // this file2 resource.
        dependsOn: [ bucket ],
    } as pulumi.ResourceOptions);

答案 1 :(得分:1)

简单答案

official docs关于此选项的信息非常丰富:

dependsOn选项提供了显式资源依赖关系的列表 资源。

当您执行以下操作时,Pulumi会自动跟踪资源之间的依赖关系 提供来自其他资源输出的输入参数 属性。
但是,在某些情况下,您可能需要显式 指定Pulumi不了解的其他依赖项,但 必须尊重。
如果依赖项是外部的,则可能会发生这种情况 基础架构本身(例如应用程序依赖项),或者是 暗示由于订购或最终的一致性要求。
这些依赖关系确保资源的创建,更新和删除 按正确的顺序完成。

以下示例说明了使res2依赖于res1,即使 没有属性级别的依赖项:

#Python
res1 = MyResource("res1");
res2 = MyResource("res2", opts=ResourceOptions(depends_on=[res1]));

#Golang
res1, _ := NewMyResource(ctx, "res1", &MyResourceArgs{/*...*/})
res2, _ := NewMyResource(ctx, "res2", &MyResourceArgs{/*...*/}, pulumi.DependsOn([]Resource{res1}))

#JS
let res1 = new MyResource("res1", {/*...*/});
let res2 = new MyResource("res2", {/*...*/}, { dependsOn: [res1] });


如果您想了解引擎盖下发生的事情

了解有关creation and deletion order的信息:

Pulumi尽可能并行执行资源操作,但是 了解某些资源可能依赖于其他资源 资源。
如果提供一种资源的输出作为输入 到另一个,引擎记录这两者之间的依赖关系 资源作为状态的一部分,并在调度时使用这些资源 操作。
也可以通过使用 dependsOn资源选项。

默认情况下,如果必须替换资源,Pulumi将尝试 在销毁旧资源之前创建该资源的新副本。
这很有用,因为它允许对基础结构进行更新 没有停机时间。
这种行为可以由 deleteBeforeReplace选项。
如果您禁用了自动命名, 提供资源的特定名称,将其视为 被自动标记为deleteBeforeReplace(否则, 由于名称位于,因此新版本的create操作将失败 使用)。