INTEGRITY Dokumentace

Nasazení Workeru

V tomto tutoriálu budete postupovat podle podrobného návodu, jak nasadit aplikaci Hello World pomocí Cloudflare Workers a infrastruktury jako kódu (IaC) v Pulumi, abyste se seznámili s životním cyklem správy prostředků. Konkrétně vytvoříte Worker, Route a DNS Record pro přístup k aplikaci, než nakonec všechny prostředky odstraníte.

Než začnete

Ujistěte se, že máte:

1. Inicializace projektu

Projekt Pulumi je sada souborů ve vyhrazené složce, která popisuje infrastrukturu, jež chcete vytvořit. Složka projektu Pulumi se rozpoznává podle povinného Pulumi.yaml soubor. K vytvoření a konfiguraci nového projektu použijete Pulumi CLI.

a. Vytvořte adresář

Pro tento návod použijte nový a prázdný adresář.

mkdir serverless-cloudflare
cd serverless-cloudflare

b. Přihlaste se do Pulumi Cloud

Pulumi Cloud ↗ je hostovaná služba, která poskytuje zabezpečenou a škálovatelnou platformu pro správu infrastruktury jako kódu. Použijete ji k uložení konfigurací backendu Pulumi.

Ve výzvě stiskněte Enter a přihlaste se ke svému účtu Pulumi Cloud přes prohlížeč. Případně můžete zadat Přístupový token Pulumi Cloud ↗.

pulumi login

c. Vytvořte nový program

Program Pulumi je kód napsaný v podporovaný programovací jazyk ↗ který definuje prostředky infrastruktury.

Chcete-li vytvořit program, vyberte preferovaný jazyk a spusťte pulumi příkaz:

pulumi new javascript --name serverless-cloudflare --yes
# wait a few seconds while the project is initialized
pulumi new typescript --name serverless-cloudflare --yes
# wait a few seconds while the project is initialized
pulumi new python --name serverless-cloudflare --yes
# wait a few seconds while the project is initialized
pulumi new go --name serverless-cloudflare --yes
# wait a few seconds while the project is initialized
pulumi new java --name serverless-cloudflare --yes
# wait a few seconds while the project is initialized
pulumi new csharp --name serverless-cloudflare --yes
# wait a few seconds while the project is initialized
pulumi new yaml --name serverless-cloudflare --yes

d. Vytvořte stack

Pulumi stack ↗ je instancí programu Pulumi. Stacky lze konfigurovat nezávisle na sobě a mohou představovat různá prostředí (vývoj, staging, produkce) nebo feature branche. V tomto tutoriálu použijete dev stack.

Chcete-li vytvořit instanci svého dev stack spusťte:

pulumi up --yes
# wait a few seconds for the stack to be instantiated.

V tuto chvíli jste ještě nedefinovali žádné zdroje, takže budete mít prázdný stack.

e. Uložte nastavení aplikace

V tomto kroku uložíte nastavení aplikace do Pulumi ESC Environment ↗, soubor YAML obsahující konfigurace a tajné hodnoty. Lze k nim přistupovat několika způsoby, včetně programu Pulumi. Všechna prostředí ESC jsou bezpečně uložena ve vašem účtu Pulumi Cloud a lze je plně spravovat přes Pulumi CLI. V tomto tutoriálu uložíte následující hodnoty:

# Give your new ESC Environment a name
E=hello-world/dev-env

# Initialize the new ESC Environment
pulumi config env init --env $E --yes
Creating environment hello-world/dev-env for stack dev...
# Replace abc123 with your Cloudflare account ID
pulumi env set $E --plaintext pulumiConfig.accountId abc123

# Replace API_TOKEN with your Cloudflare API token
pulumi env set $E --secret pulumiConfig.cloudflare:apiToken API_TOKEN

# Replace example.com with your domain
pulumi env set $E --plaintext pulumiConfig.domain example.com

f. Nainstalujte balíček Cloudflare

Aby bylo možné definovat zdroje Cloudflare ve svém programu Pulumi, musíte nainstalovat balíček Cloudflare pro vámi zvolený jazyk.

Nainstalujte balíček Cloudflare spuštěním následujícího příkazu:

npm install @pulumi/cloudflare
added 1 package ...
npm install @pulumi/cloudflare
added 1 package ...
echo "pulumi_cloudflare>=5.38,<6.0.0" >> requirements.txt
source venv/bin/activate
pip install -r requirements.txt
...Collecting pulumi-cloudflare...
go get github.com/pulumi/pulumi-cloudflare/sdk/v3/go/cloudflare
go: downloading github.com/pulumi/pulumi-cloudflare ...

Níže jsou uvedeny pokyny pro Apache Maven. Pro jiné správce Java projektů, jako je Gradle, se podívejte na oficiální Repozitář Maven ↗

  1. Otevřete pom.xml .
  2. Přidejte závislost Pulumi Cloudflare do <dependencies> sekce.
<dependency>
    <groupId>com.pulumi</groupId>
    <artifactId>cloudflare</artifactId>
    <version>5.38.0</version>
</dependency>
  1. Spusťte:
mvn clean install
...[INFO] BUILD SUCCESS...
dotnet add package Pulumi.Cloudflare
...
info : Adding PackageReference for package 'Pulumi.Cloudflare' into project
...

Pro YAML není třeba stahovat žádné závislosti. Přeskočte tuto část.

2. Definice prostředků Cloudflare v kódu

Po instalaci balíčku Cloudflare nyní můžete definovat libovolný podporovaný zdroj Cloudflare ↗ ve vašem programu Pulumi. Dále definujte Worker, Route a DNS Record.

a. Přidejte skript Workers

Zdroj Workers Script ↗ představuje Cloudflare Worker, který lze nasadit do sítě Cloudflare.

Nahraďte obsah svého vstupního souboru následujícím:

Název souboru: index.js

"use strict";
const pulumi = require("@pulumi/pulumi");
const cloudflare = require("@pulumi/cloudflare");

const config = new pulumi.Config();
const accountId = config.require("accountId");
const domain = config.require("domain");

const content = `export default {
  async fetch(request) {
    const options = { headers: { 'content-type': 'text/plain' } };
    return new Response("Hello World!", options);
  },
};`;

const worker = new cloudflare.WorkersScript("hello-world-worker", {
	accountId: accountId,
	name: "hello-world-worker",
	content: content,
	module: true, // ES6 module
});

Název souboru: index.ts

import * as pulumi from "@pulumi/pulumi";
import * as cloudflare from "@pulumi/cloudflare";

const config = new pulumi.Config();
const accountId = config.require("accountId");
const domain = config.require("domain");

const content = `export default {
  async fetch(request) {
    const options = { headers: { 'content-type': 'text/plain' } };
    return new Response("Hello World!", options);
  },
};`;

const worker = new cloudflare.WorkersScript("hello-world-worker", {
	accountId: accountId,
	name: "hello-world-worker",
	content: content,
	module: true, // ES6 module
});

Název souboru: __main__.py

"""Pulumi program """
import pulumi
import pulumi_cloudflare as cloudflare

CONFIG = pulumi.Config()
ACCOUNT_ID = CONFIG.get("accountId")
DOMAIN = CONFIG.require("domain")
CONTENT = """
export default {
  async fetch(request) {
    const options = { headers: { 'content-type': 'text/plain' } };
    return new Response("Hello World!", options);
  },
};
"""

worker = cloudflare.WorkersScript("hello-world-worker",
    account_id=ACCOUNT_ID,
    name="hello-world-worker",
    content=CONTENT,
    module=True  # ES6 module
)

Název souboru: main.go

package main

import (
	"github.com/pulumi/pulumi-cloudflare/sdk/v5/go/cloudflare"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi/config"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		conf := config.New(ctx, "")
		accountID := conf.Get("accountId")
		domain := conf.Get("domain")
		content := `
		export default {
		  async fetch(request) {
		    const options = { headers: { 'content-type': 'text/plain' } };
		    return new Response("Hello World!", options);
		  },
		};
		`
		worker, err := cloudflare.NewWorkersScript(ctx, "hello-world-worker", &cloudflare.WorkersScriptArgs{
			AccountId: pulumi.String(accountID),
			Name:      pulumi.String("hello-world-worker"),
			Content:   pulumi.String(content),
			Module:    pulumi.Bool(true), // ES6 module
		})
		if err != nil {
			return err
		}

		return nil
	})
}

Název souboru: src/main/java/myproject/App.java

package myproject;

import com.pulumi.Pulumi;
import com.pulumi.cloudflare.WorkersScript;
import com.pulumi.cloudflare.WorkersScriptArgs;
import com.pulumi.core.Output;

public class App {
    public static void main(String[] args) {
        Pulumi.run(ctx -> {
            var content = """
              export default {
                async fetch(request) {
                  const options = { headers: { 'content-type': 'text/plain' } };
                  return new Response("Hello World!", options);
                },
              };
            """;

            var accountId = ctx.config().require("accountId");
            var domain = ctx.config().require("domain");
            var worker = new WorkersScript("hello-world-worker", WorkersScriptArgs.builder()
                .accountId(accountId)
                .name("hello-world-worker")
                .content(content)
                .module(true)
                .build());

            return;
        });
    }
}

Název souboru: Program.cs

using Pulumi;
using Cloudflare = Pulumi.Cloudflare;

return await Deployment.RunAsync(() =>
{
    var config = new Config();
    var accountId = config.Require("accountId");
    var domain = config.Require("domain");
    var content = @"
            export default {
                async fetch(request) {
                    const options = { headers: { 'content-type': 'text/plain' } };
                    return new Response(""Hello World!"", options);
                },
            };
        ";

    var worker = new Cloudflare.WorkersScript("hello-world-worker", new()
    {
        AccountId = accountId,
        Name = "hello-world-worker",
        Content = content,
        Module = true
    });
    return;
});

Název souboru: Pulumi.yaml

name: serverless-cloudflare
runtime: yaml
resources:
  worker:
    type: cloudflare:WorkersScript
    properties:
      accountId: "${accountId}"
      name: "hello-world-worker"
      content: |
        export default {
            async fetch(request) {
                const options = { headers: { 'content-type': 'text/plain' } };
                return new Response("Hello World!", options);
            },
        };
      module: true

b. Přidejte Route

Nyní přidáte Zdroj Workers Route ↗ do svého programu Pulumi, aby skript Workers měl koncový bod a byl aktivní. Pro správnou konfiguraci Route také vyhledáte ID zóny své domény.

Do vstupního souboru přidejte následující úryvek kódu po prostředek skriptu Worker:

Název souboru: index.js

const zone = cloudflare.getZone({
	accountId: accountId,
	name: domain,
});

const zoneId = zone.then((z) => z.zoneId);

const route = new cloudflare.WorkersRoute("hello-world-route", {
	zoneId: zoneId,
	pattern: "hello-world." + domain,
	scriptName: worker.name,
});

Název souboru: index.ts

const zone = cloudflare.getZone({
	accountId: accountId,
	name: domain,
});

const zoneId = zone.then((z) => z.zoneId);

const route = new cloudflare.WorkersRoute("hello-world-route", {
	zoneId: zoneId,
	pattern: "hello-world." + domain,
	scriptName: worker.name,
});

Název souboru: __main__.py

zone = cloudflare.get_zone(account_id=ACCOUNT_ID, name=DOMAIN)
zone_id = zone.zone_id
route = cloudflare.WorkersRoute("hello-world-route",
    zone_id=zone_id,
    pattern="hello-world." + DOMAIN,
    script_name=worker.name
)

Název souboru: main.go

zone, err := cloudflare.LookupZone(ctx, &cloudflare.LookupZoneArgs{
  AccountId: &accountID,
  Name:      &domain,
}, nil)
if err != nil {
  return err
}

route, err := cloudflare.NewWorkersRoute(ctx, "hello-world-route", &cloudflare.WorkersRouteArgs{
  ZoneId:     pulumi.String(zone.Id),
  Pattern:    pulumi.String("hello-world." + domain),
  ScriptName: worker.Name,
})
if err != nil {
  return err
}

Název souboru: src/main/java/myproject/App.java

final var zone = CloudflareFunctions.getZone(GetZoneArgs.builder()
  .accountId(accountId)
  .name(domain)
  .build());
var route = new WorkersRoute("hello-world-route", WorkersRouteArgs.builder()
  .zoneId(zone.applyValue(getZoneResult -> getZoneResult.id()))
  .pattern("hello-world." + domain)
  .scriptName(worker.name())
  .build());

Název souboru: Program.cs

var zone = Output.Create(Cloudflare.GetZone.InvokeAsync(new()
{
    AccountId = accountId,
    Name = domain,
}));
var route = new Cloudflare.WorkersRoute("hello-world-route", new()
{
    ZoneId = zone.Apply(z => z.Id),
    Pattern = "hello-world." + domain,
    ScriptName = worker.Name,
});

Název souboru: Pulumi.yaml

Pod runtime klíč přidejte následující kód:

# new top-level section
variables:
  zone:
    fn::invoke:
      function: cloudflare:getZone
      arguments:
        accountId: ${accountId}
        name: ${domain}

Pod worker prostředek přidejte následující kód:

route:
  type: cloudflare:WorkersRoute
  properties:
    zoneId: ${zone.id}
    pattern: "hello-world.${domain}"
    scriptName: ${worker.name}

c. Přidejte DNS Record

Nyní přidáte DNS Prostředek Record ↗ k přeložení dříve nakonfigurovaného Route. V dalším kroku také vypíšete URL adresu Route, aby k ní bylo možné snadno přistupovat.

Do vstupního souboru přidejte následující úryvek kódu po prostředek Route:

Název souboru: index.js

const record = new cloudflare.Record("hello-world-record", {
	name: route.pattern,
	type: "A",
	content: "192.0.2.1",
	zoneId: zoneId,
	proxied: true,
});

exports.url = pulumi.interpolate`https://${record.hostname}`;

Název souboru: index.ts

const record = new cloudflare.Record("hello-world-record", {
	name: route.pattern,
	type: "A",
	content: "192.0.2.1",
	zoneId: zoneId,
	proxied: true,
});

export const url = pulumi.interpolate`https://${record.hostname}`;

Název souboru: __main__.py

record = cloudflare.Record("hello-world-record",
    name=route.pattern,
    type="A",
    content="192.0.2.1",
    zone_id=zone_id,
    proxied=True
)

url = pulumi.Output.concat("https://", record.hostname)
pulumi.export('url', url)

Název souboru: main.go

record, err := cloudflare.NewRecord(ctx, "hello-world-record", &cloudflare.RecordArgs{
  Name:    route.Pattern,
  Type:    pulumi.String("A"),
  Content: pulumi.String("192.0.2.1"),
  ZoneId:  pulumi.String(zone.Id),
  Proxied: pulumi.Bool(true),
})
if err != nil {
  return err
}

ctx.Export("url", pulumi.Sprintf("https://%s", record.Hostname))

Název souboru: src/main/java/myproject/App.java

var record = new Record("hello-world-record", RecordArgs.builder()
    .name(route.pattern())
    .type("A")
    .content("192.0.2.1")
    .zoneId(zone.applyValue(getZoneResult -> getZoneResult.id()))
    .proxied(true)
    .build());

ctx.export("url", Output.format("https://%s", record.hostname()));

Název souboru: Program.cs

Všimněte si aktualizovaného příkazu ' return ', protože nyní exportujete hodnotu. Nezapomeňte také zahrnout using System.Collections.Generic; ve svých importech.

var record = new Cloudflare.Record("hello-world-record", new()
{
    Name = route.Pattern,
    Type = "A",
    Content = "192.0.2.1",
    ZoneId = zone.Apply(z => z.Id),
    Proxied = true
});

return new Dictionary<string, object?>
{
    ["url"] = Output.Format($"https://{record.Hostname}")
};

Všimněte si nového prvku nejvyšší úrovně outputs sekce.

  record:
    type: cloudflare:Record
    properties:
      name: ${route.pattern}
      type: A
      content: "192.0.2.1"
      zoneId: ${zone.id}
      proxied: true

outputs:
  url: "https://${record.hostname}"

d. (Volitelné) Ověřte svůj kód

Ověřte, že všechny vaše změny odpovídají úplnému řešení níže:

Název souboru: index.js

"use strict";
const pulumi = require("@pulumi/pulumi");
const cloudflare = require("@pulumi/cloudflare");

const config = new pulumi.Config();
const accountId = config.require("accountId");
const domain = config.require("domain");

const content = `export default {
  async fetch(request) {
    const options = { headers: { 'content-type': 'text/plain' } };
    return new Response("Hello World!", options);
  },
};`;

const worker = new cloudflare.WorkersScript("hello-world-worker", {
	accountId: accountId,
	name: "hello-world-worker",
	content: content,
	module: true, // ES6 module
});

const zone = cloudflare.getZone({
	accountId: accountId,
	name: domain,
});

const zoneId = zone.then((z) => z.zoneId);

const route = new cloudflare.WorkersRoute("hello-world-route", {
	zoneId: zoneId,
	pattern: "hello-world." + domain,
	scriptName: worker.name,
});

const record = new cloudflare.Record("hello-world-record", {
	name: route.pattern,
	type: "A",
	content: "192.0.2.1",
	zoneId: zoneId,
	proxied: true,
});

exports.url = pulumi.interpolate`https://${record.hostname}`;

Název souboru: index.ts

import * as pulumi from "@pulumi/pulumi";
import * as cloudflare from "@pulumi/cloudflare";

const config = new pulumi.Config();
const accountId = config.require("accountId");
const domain = config.require("domain");

const content = `export default {
  async fetch(request) {
    const options = { headers: { 'content-type': 'text/plain' } };
    return new Response("Hello World!", options);
  },
};`;

const worker = new cloudflare.WorkersScript("hello-world-worker", {
	accountId: accountId,
	name: "hello-world-worker",
	content: content,
	module: true, // ES6 module
});

const zone = cloudflare.getZone({
	accountId: accountId,
	name: domain,
});

const zoneId = zone.then((z) => z.zoneId);

const route = new cloudflare.WorkersRoute("hello-world-route", {
	zoneId: zoneId,
	pattern: "hello-world." + domain,
	scriptName: worker.name,
});

const record = new cloudflare.Record("hello-world-record", {
	name: route.pattern,
	type: "A",
	content: "192.0.2.1",
	zoneId: zoneId,
	proxied: true,
});

export const url = pulumi.interpolate`https://${record.hostname}`;

Název souboru: __main__.py

"""Pulumi program """
import pulumi
import pulumi_cloudflare as cloudflare

CONFIG = pulumi.Config()
ACCOUNT_ID = CONFIG.get("accountId")
DOMAIN = CONFIG.require("domain")
CONTENT = """
export default {
  async fetch(request) {
    const options = { headers: { 'content-type': 'text/plain' } };
    return new Response("Hello World!", options);
  },
};
"""

worker = cloudflare.WorkersScript("hello-world-worker",
    account_id=ACCOUNT_ID,
    name="hello-world-worker",
    content=CONTENT,
    module=True  # ES6 module
)

zone = cloudflare.get_zone(account_id=ACCOUNT_ID, name=DOMAIN)
zone_id = zone.zone_id
route = cloudflare.WorkersRoute("hello-world-route",
    zone_id=zone_id,
    pattern="hello-world." + DOMAIN,
    script_name=worker.name
)

record = cloudflare.Record("hello-world-record",
    name=route.pattern,
    type="A",
    content="192.0.2.1",
    zone_id=zone_id,
    proxied=True
)

url = pulumi.Output.concat("https://", record.hostname)
pulumi.export('url', url)

Název souboru: main.go

package main

import (
	"github.com/pulumi/pulumi-cloudflare/sdk/v5/go/cloudflare"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi/config"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		conf := config.New(ctx, "")
		accountID := conf.Get("accountId")
		domain := conf.Get("domain")
		content := `
		export default {
		  async fetch(request) {
		    const options = { headers: { 'content-type': 'text/plain' } };
		    return new Response("Hello World!", options);
		  },
		};
		`
		worker, err := cloudflare.NewWorkersScript(ctx, "hello-world-worker", &cloudflare.WorkersScriptArgs{
			AccountId: pulumi.String(accountID),
			Name:      pulumi.String("hello-world-worker"),
			Content:   pulumi.String(content),
			Module:    pulumi.Bool(true), // ES6 module
		})
		if err != nil {
			return err
		}
		zone, err := cloudflare.LookupZone(ctx, &cloudflare.LookupZoneArgs{
			AccountId: &accountID,
			Name:      &domain,
		}, nil)
		if err != nil {
			return err
		}

		route, err := cloudflare.NewWorkersRoute(ctx, "hello-world-route", &cloudflare.WorkersRouteArgs{
			ZoneId:     pulumi.String(zone.Id),
			Pattern:    pulumi.String("hello-world." + domain),
			ScriptName: worker.Name,
		})
		if err != nil {
			return err
		}

		record, err := cloudflare.NewRecord(ctx, "hello-world-record", &cloudflare.RecordArgs{
			Name:    route.Pattern,
			Type:    pulumi.String("A"),
			Content: pulumi.String("192.0.2.1"),
			ZoneId:  pulumi.String(zone.Id),
			Proxied: pulumi.Bool(true),
		})
		if err != nil {
			return err
		}

		ctx.Export("url", pulumi.Sprintf("https://%s", record.Hostname))

		return nil
	})
}

Název souboru: src/main/java/myproject/App.java

package myproject;

import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.cloudflare.WorkersScript;
import com.pulumi.cloudflare.WorkersScriptArgs;
import com.pulumi.cloudflare.CloudflareFunctions;
import com.pulumi.cloudflare.inputs.GetZoneArgs;
import com.pulumi.cloudflare.WorkersRoute;
import com.pulumi.cloudflare.WorkersRouteArgs;
import com.pulumi.cloudflare.Record;
import com.pulumi.cloudflare.RecordArgs;

public class App {
    public static void main(String[] args) {
        Pulumi.run(ctx -> {
            var content = """
				export default {
				  async fetch(request) {
				    const options = { headers: { 'content-type': 'text/plain' } };
				    return new Response("Hello World!", options);
				  },
				};
			""";

            var accountId = ctx.config().require("accountId");
            var domain = ctx.config().require("domain");

            var worker = new WorkersScript("hello-world-worker", WorkersScriptArgs.builder()
                .accountId(accountId)
                .name("hello-world-worker")
                .content(content)
                .module(true)
                .build());
            final var zone = CloudflareFunctions.getZone(GetZoneArgs.builder()
                .accountId(accountId)
                .name(domain)
                .build());
            var route = new WorkersRoute("hello-world-route", WorkersRouteArgs.builder()
                .zoneId(zone.applyValue(getZoneResult -> getZoneResult.id()))
                .pattern("hello-world." + domain)
                .scriptName(worker.name())
                .build());
            var record = new Record("hello-world-record", RecordArgs.builder()
                .name(route.pattern())
                .type("A")
                .content("192.0.2.1")
                .zoneId(zone.applyValue(getZoneResult -> getZoneResult.id()))
                .proxied(true)
                .build());

            ctx.export("url", Output.format("https://%s", record.hostname()));
            return;
        });
    }
}

Název souboru: Program.cs

using System.Collections.Generic;
using Pulumi;
using Cloudflare = Pulumi.Cloudflare;

return await Deployment.RunAsync(() =>
{
    var config = new Config();
    var accountId = config.Require("accountId");
    var domain = config.Require("domain");
    var content = @"
            export default {
                async fetch(request) {
                    const options = { headers: { 'content-type': 'text/plain' } };
                    return new Response(""Hello World!"", options);
                },
            };
        ";

    var worker = new Cloudflare.WorkersScript("hello-world-worker", new()
    {
        AccountId = accountId,
        Name = "hello-world-worker",
        Content = content,
        Module = true
    });
    var zone = Output.Create(Cloudflare.GetZone.InvokeAsync(new()
    {
        AccountId = accountId,
        Name = domain,
    }));
    var route = new Cloudflare.WorkersRoute("hello-world-route", new()
    {
        ZoneId = zone.Apply(z => z.Id),
        Pattern = "hello-world." + domain,
        ScriptName = worker.Name,
    });

    var record = new Cloudflare.Record("hello-world-record", new()
    {
        Name = route.Pattern,
        Type = "A",
        Content = "192.0.2.1",
        ZoneId = zone.Apply(z => z.Id),
        Proxied = true
    });

    return new Dictionary<string, object?>
    {
        ["url"] = Output.Format($"https://{record.Hostname}")
    };
});

Název souboru: Pulumi.yaml

name: serverless-cloudflare
runtime: yaml
variables:
  zone:
    fn::invoke:
      function: cloudflare:getZone
      arguments:
        accountId: ${accountId}
        name: ${domain}

resources:
  worker:
    type: cloudflare:WorkersScript
    properties:
      accountId: "${accountId}"
      name: "hello-world-worker"
      content: |
        export default {
            async fetch(request) {
                const options = { headers: { 'content-type': 'text/plain' } };
                return new Response("Hello World!", options);
            },
        };
      module: true
  route:
    type: cloudflare:WorkersRoute
    properties:
      zoneId: ${zone.id}
      pattern: "hello-world.${domain}"
      scriptName: ${worker.name}
  record:
    type: cloudflare:Record
    properties:
      name: ${route.pattern}
      type: A
      content: "192.0.2.1"
      zoneId: ${zone.id}
      proxied: true

outputs:
  url: "https://${record.hostname}"

3. Nasazení aplikace

Nyní, když jste definovali všechny prostředky Cloudflare, můžete pomocí Pulumi CLI nasadit aplikaci Hello World do svého účtu Cloudflare.

Chcete-li nasadit změny, spusťte:

pulumi up --yes
wait for the dev stack to become ready

4. Otestování Worker

Postupně jste přidali zdroje Cloudflare pro spuštění a přístup k vaší aplikaci Hello World. Aplikaci můžete otestovat pomocí příkazu curl na url výstup ze stacku Pulumi.

curl $(pulumi stack output url)
Hello, World!

5. Úklid

V tomto posledním kroku vyčistíte prostředky a stack použité v celém tutoriálu.

a. Odstraňte zdroje Cloudflare

pulumi destroy

b. Odstraňte stack Pulumi

pulumi stack rm dev

Další kroky

Navštivte Dokumentace balíčku Cloudflare ↗ a prozkoumejte další prostředky, které můžete definovat pomocí Pulumi a Cloudflare.