5

我正在尝试创建一些资源,并且需要强制执行某种创建顺序。例如创建一个aws.s3.Bucket用于存储日志,然后才能将其用作aws.cloudfront.Distribution.

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

4

2 回答 2

9

一般情况下,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);
于 2018-06-20T22:02:09.690 回答
2

简单的答案

官方文档对此选项提供了很多信息:

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] });


如果您想了解幕后发生的事情

阅读有关创建和删除顺序的信息:

Pulumi 尽可能并行执行资源操作,但理解某些资源可能对其他资源有依赖关系。
如果将一种资源的输出作为输入提供给另一种资源,则引擎会将这两种资源之间的依赖关系记录为状态的一部分,并在调度操作时使用它们。
这个列表也可以通过使用 dependsOn资源选项来扩充。

默认情况下,如果必须替换资源,Pulumi 会在销毁旧资源之前尝试创建该资源的新副本。
这很有帮助,因为它允许在不停机的情况下更新基础设施。
此行为可以由 deleteBeforeReplace选项控制。
如果您通过为资源提供特定名称来禁用自动命名,它将被视为deleteBeforeReplace自动标记(否则新版本的创建操作将失败,因为该名称正在使用中)。

于 2020-05-13T14:50:41.587 回答