【问题标题】:How to control resource creation order in Pulumi如何控制 Pulumi 中的资源创建顺序
【发布时间】:2018-11-30 03:30:37
【问题描述】:

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

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

【问题讨论】:

    标签: pulumi


    【解决方案1】:

    一般来说,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);
    

    【讨论】:

      【解决方案2】:

      简单回答

      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(否则 新版本的创建操作将失败,因为名称在 使用)。

      【讨论】:

        猜你喜欢
        • 2022-11-11
        • 2021-10-05
        • 1970-01-01
        • 2021-05-15
        • 2018-09-27
        • 2016-06-19
        • 2019-08-22
        • 2013-05-15
        相关资源
        最近更新 更多