Как контролировать порядок создания ресурсов в Пулуми

Я пытаюсь создать некоторые ресурсы, и мне нужно навести порядок создания. например, создание aws.s3.Bucket для хранения журналов, прежде чем он может быть использован в качестве входа в aws.cloudfront.Distribution,

Как контролировать порядок создания ресурсов при использовании 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);

Простой ответ

В официальных документах весьма информативны об этом варианте:

В dependsOn option предоставляет список явных ресурсов зависимости ресурсов.

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 автоматически (в противном случае операция создания новой версии завершится ошибкой, поскольку имя уже используется).

Другие вопросы по тегам