← Pulumi / pulumi / tutorial
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:
- Účet Cloudflare a API token s oprávněním upravovat prostředky uvedené v tomto tutoriálu. V případě potřeby si zaregistrujte účet Cloudflare ↗ než budete pokračovat. Váš token musí mít následující:
Account-Workers Scripts-EditoprávněníZone-Workers Route-EditoprávněníZone-DNS-Editoprávnění
- Účet Pulumi Cloud. Můžete se zaregistrovat na always-free individual tier ↗.
- Pulumi CLI je nainstalovaný na vašem počítači.
- A Programovací jazyk podporovaný Pulumi ↗ nakonfigurovaný. (TypeScript, JavaScript, Python, Go, .NET, Java, nebo použijte YAML)
- Doména spravovaná Cloudflare. Dokončete Návod na přidání webu a přesuňte svou stávající doménu pod správu Cloudflare.
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-cloudflareb. 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 loginc. 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 initializedpulumi new typescript --name serverless-cloudflare --yes
# wait a few seconds while the project is initializedpulumi new python --name serverless-cloudflare --yes
# wait a few seconds while the project is initializedpulumi new go --name serverless-cloudflare --yes
# wait a few seconds while the project is initializedpulumi new java --name serverless-cloudflare --yes
# wait a few seconds while the project is initializedpulumi new csharp --name serverless-cloudflare --yes
# wait a few seconds while the project is initializedpulumi new yaml --name serverless-cloudflare --yesd. 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 --yesCreating 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.comf. 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/cloudflareadded 1 package ...npm install @pulumi/cloudflareadded 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/cloudflarego: 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 ↗
- Otevřete
pom.xml. - Přidejte závislost Pulumi Cloudflare do
<dependencies>sekce.
<dependency>
<groupId>com.pulumi</groupId>
<artifactId>cloudflare</artifactId>
<version>5.38.0</version>
</dependency>- 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: trueb. 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 --yeswait for the dev stack to become ready4. 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 destroyb. Odstraňte stack Pulumi
pulumi stack rm devDalší kroky
Navštivte Dokumentace balíčku Cloudflare ↗ a prozkoumejte další prostředky, které můžete definovat pomocí Pulumi a Cloudflare.