← Pulumi / pulumi / tutorial
Добавьте сайт
В этом руководстве вы пошагово подключите существующий сайт к Cloudflare с помощью инфраструктуры как кода (IaC) Pulumi и познакомитесь с жизненным циклом управления ресурсами. В частности, вы создадите Zone и запись DNS для разрешения вашего нового сайта. Руководство построено на принципе IaC и повторяет шаги, перечисленные в Руководство по добавлению сайта.
Перед началом работы
Убедитесь, что у вас есть:
- Аккаунт Cloudflare и API-токен с разрешением на редактирование ресурсов, используемых в этом руководстве. При необходимости зарегистрируйте Аккаунт Cloudflare ↗ перед тем как продолжить. Ваш токен должен обладать следующим:
Zone-Zone-EditразрешениеZone-DNS-Editразрешениеinclude-All zones from an account-<your account>ресурс zone
- Аккаунт Pulumi Cloud. Вы можете зарегистрировать постоянно бесплатный индивидуальный тариф ↗.
- Pulumi CLI установлен на вашем компьютере.
- A Язык программирования, поддерживаемый Pulumi ↗ настроен. (TypeScript, JavaScript, Python, Go, .NET, Java или используйте YAML)
- Доменное имя. Вы можете использовать
example.comчтобы завершить это руководство.
1. Инициализируйте проект
Проект Pulumi представляет собой набор файлов в отдельной папке, описывающий инфраструктуру, которую требуется создать. Папка проекта Pulumi определяется обязательным Pulumi.yaml файл. Вы будете использовать Pulumi CLI для создания и настройки нового проекта.
a. Создайте каталог
Для этого руководства используйте новый пустой каталог.
mkdir addsite-cloudflare
cd addsite-cloudflareb. Войдите в Pulumi Cloud
Pulumi Cloud ↗ это размещённый сервис, который предоставляет безопасную и масштабируемую платформу для управления инфраструктурой как кодом. Вы будете использовать его для хранения конфигураций бэкенда Pulumi.
В командной строке нажмите Enter, чтобы войти в аккаунт Pulumi Cloud через браузер. Также вы можете указать Токен доступа Pulumi Cloud ↗.
pulumi loginc. Создайте новую программу
Программа Pulumi представляет собой код, написанный на поддерживаемый язык программирования ↗ который определяет ресурсы инфраструктуры.
Чтобы создать программу, выберите нужный язык и выполните команду pulumi команда:
pulumi new javascript --name addsite-cloudflare --yes
# wait a few seconds while the project is initializedpulumi new typescript --name addsite-cloudflare --yes
# wait a few seconds while the project is initializedpulumi new python --name addsite-cloudflare --yes
# wait a few seconds while the project is initializedpulumi new go --name addsite-cloudflare --yes
# wait a few seconds while the project is initializedpulumi new java --name addsite-cloudflare --yes
# wait a few seconds while the project is initializedpulumi new csharp --name addsite-cloudflare --yes
# wait a few seconds while the project is initializedpulumi new yaml --name addsite-cloudflare --yesd. Создайте стек
Pulumi стек ↗ это экземпляр программы Pulumi. Стеки настраиваются независимо друг от друга и могут представлять разные окружения (development, staging, production) или ветки функциональности. В этом руководстве вы будете использовать dev стек.
Чтобы создать экземпляр своего dev стек, выполните:
pulumi up --yes
# wait a few seconds for the stack to be instantiated.На данный момент вы еще не определили ни одного ресурса, поэтому стек будет пустым.
e. Сохраните настройки
На этом шаге вы сохраните свои настройки в Pulumi ESC Environment ↗, YAML-файл с конфигурациями и секретами. Доступ к ним можно получить несколькими способами, включая программу Pulumi. Все ESC Environments надёжно хранятся в вашем аккаунте Pulumi Cloud и полностью управляются через Pulumi CLI. В этом руководстве вы сохраните следующие значения:
- Ваш Cloudflare ID аккаунта.
- Действительный API Cloudflare токен.
- Домен. Например,
example.com.
# Define an ESC Environment name
E=cloudflare/my-dev-env
# Create a new Pulumi ESC Environment
pulumi config env init --env $E --yesCreating environment cloudflare/my-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 registered domain, or leave as is
pulumi env set $E --plaintext pulumiConfig.domain example.comf. Установите пакет Cloudflare
Чтобы определять ресурсы Cloudflare в программе Pulumi, установите пакет Cloudflare для выбранного языка программирования.
Установите пакет Cloudflare, выполнив следующую команду:
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 ...Ниже приведены инструкции для Apache Maven. Для других менеджеров проектов Java, таких как Gradle, см. официальную Репозиторий Maven ↗
- Откройте свой
pom.xmlфайл. - Добавьте зависимость Pulumi Cloudflare внутри
<dependencies>раздел.
<dependency>
<groupId>com.pulumi</groupId>
<artifactId>cloudflare</artifactId>
<version>5.38.0</version>
</dependency>- Выполните:
mvn clean install...[INFO] BUILD SUCCESS...dotnet add package Pulumi.Cloudflare...
info : Adding PackageReference for package 'Pulumi.Cloudflare' into project
...Для YAML не требуется загружать никаких зависимостей. Переходите к следующему шагу.
2. Опишите ресурсы Cloudflare в коде
После установки пакета Cloudflare вы можете определить любой поддерживаемый ресурс Cloudflare ↗ в своей программе Pulumi. Далее вы определите Zone и DNS-запись.
a. Добавьте зону
Домен, или сайт, в Cloudflare называется Zone. В Pulumi Ресурс Zone ↗ представляет собой Cloudflare Zone.
Замените содержимое файла точки входа следующим:
Имя файла: 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");
// Create a Cloudflare resource (Zone)
const zone = new cloudflare.Zone("my-zone", {
zone: domain,
accountId: accountId,
plan: "free",
jumpStart: true,
});
exports.zoneId = zone.id;
exports.nameservers = zone.nameServers;
exports.status = zone.status;Имя файла: 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");
// Create a Cloudflare resource (Zone)
const zone = new cloudflare.Zone("my-zone", {
zone: domain,
accountId: accountId,
plan: "free",
jumpStart: true,
});
export const zoneId = zone.id;
export const nameservers = zone.nameServers;
export const status = zone.status;Имя файла: __main__.py
import pulumi
import pulumi_cloudflare as cloudflare
account_id = pulumi.Config().require("accountId")
domain = pulumi.Config().require("domain")
# Create a Cloudflare resource (Zone)
zone = cloudflare.Zone("my-zone",
zone=domain,
account_id=account_id,
plan="free",
jump_start=True)
pulumi.export("zoneId", zone.id)
pulumi.export('nameservers', zone.name_servers)
pulumi.export('status', zone.status)Имя файла: main.go
package main
import (
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
cloudflare "github.com/pulumi/pulumi-cloudflare/sdk/v3/go/cloudflare"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
domain, _ := ctx.GetConfig("domain")
// Create a Cloudflare resource (Zone)
zone, err := cloudflare.NewZone(ctx, "my-zone", &cloudflare.ZoneArgs{
Zone: pulumi.String(domain),
Plan: pulumi.String("free"),
JumpStart: pulumi.Bool(true),
})
if err != nil {
return err
}
ctx.Export("zoneId", zone.ID())
ctx.Export("nameservers", zone.NameServers)
ctx.Export("status", zone.Status)
return nil
})
}Имя файла: src/main/java/myproject/App.java
package myproject;
import com.pulumi.Pulumi;
import com.pulumi.Context;
import com.pulumi.cloudflare.ZoneArgs;
import com.pulumi.cloudflare.Zone;
public class App {
public static void main(String[] args) {
Pulumi.run(ctx -> {
var config = ctx.config();
String accountId = config.require("accountId");
String domain = config.require("domain");
var zone = new Zone("my-zone", ZoneArgs.builder()
.zone(domain)
.accountId(accountId)
.plan("free")
.jumpStart(true)
.build());
ctx.export("zoneId", zone.id());
ctx.export("nameservers", zone.nameServers());
ctx.export("status", zone.status());
});
}
}Имя файла: Program.cs
using System.Threading.Tasks;
using System.Collections.Immutable;
using Pulumi;
using Pulumi.Cloudflare;
class Program
{
static Task<int> Main() => Deployment.RunAsync<MyStack>();
class MyStack : Stack
{
public MyStack()
{
var config = new Pulumi.Config();
var accountId = config.Require("accountId");
var domain = config.Require("domain");
var zone = new Zone("my-zone", new ZoneArgs
{
ZoneName = domain,
AccountId = accountId,
Plan = "free",
JumpStart = true
});
this.ZoneId = zone.Id;
this.Nameservers = zone.NameServers;
this.Status = zone.Status;
}
[Output]
public Output<string> ZoneId { get; set; }
public Output<ImmutableArray<string>> Nameservers { get; set; }
public Output<string> Status { get; set; }
}
}Имя файла: Pulumi.yaml
name: addsite-cloudflare
runtime: yaml
resources:
myZone:
type: cloudflare:Zone
properties:
zone: ${domain}
accountId: ${accountId}
plan: "free"
jumpStart: true
outputs:
zoneId: ${myZone.id}
nameservers: ${exampleZone.nameServers}
status: ${exampleZone.status}Обратите внимание, что код также выводит несколько свойств ресурса Zone, таких как zoneId, nameservers, а также status, чтобы к ним можно было легко обратиться на следующих шагах.
b. Добавьте запись DNS
Теперь добавьте DNS Ресурс Record ↗ чтобы протестировать ранее настроенную Zone.
Добавьте следующий фрагмент кода в файл точки входа после определение ресурса Zone:
Имя файла: index.js
const record = new cloudflare.Record("my-record", {
zoneId: zone.id,
name: domain,
content: "192.0.2.1",
type: "A",
proxied: true,
});Имя файла: index.ts
const record = new cloudflare.Record("my-record", {
zoneId: zone.id,
name: domain,
content: "192.0.2.1",
type: "A",
proxied: true,
});Имя файла: __main__.py
record = cloudflare.Record("my-record",
zone_id=zone.id,
name=domain,
content="192.0.2.1",
type="A",
proxied=True
)Имя файла: main.go
_, err = cloudflare.NewRecord(ctx, "my-record", &cloudflare.RecordArgs{
ZoneId: zone.ID(),
Name: pulumi.String(domain),
Content: pulumi.String("192.0.2.1"),
Type: pulumi.String("A"),
Proxied: pulumi.Bool(true),
})
if err != nil {
return err
}Имя файла: src/main/java/myproject/App.java
// Add imports
import com.pulumi.cloudflare.Record;
import com.pulumi.cloudflare.RecordArgs;
// Below the Zone resource, add
new Record("my-record", RecordArgs.builder()
.zoneId(zone.id())
.name(domain)
.content("192.0.2.1")
.type("A")
.proxied(true)
.build());Имя файла: Program.cs
new Record("my-record", new RecordArgs
{
ZoneId = zone.Id,
Name = domain,
Content = "192.0.2.1",
Type = "A",
Proxied = true
});Имя файла: Pulumi.yaml
myRecord:
type: cloudflare:Record
properties:
zoneId: ${myZone.id}
name: ${domain}
content: 192.0.2.1
type: A
proxied: true3. Разверните изменения
Теперь, когда ресурсы определены, вы можете развернуть изменения с помощью Pulumi CLI, чтобы они отобразились в вашей учетной записи Cloudflare.
Чтобы развернуть изменения, выполните:
pulumi up --yeswait for the dev stack to become ready4. Настройте DNS-провайдера
a. Получите серверы имен
После добавления домена в Cloudflare этому домену будут назначены два авторитетных сервера имен.
Чтобы получить назначенные nameservers, выполните:
pulumi stack outputb. Обновите настройки регистратора
Обновите серверы имен у своего регистратора, чтобы активировать сервисы Cloudflare для домена. Инструкции зависят от регистратора. Возможно, вы найдете нужные указания в разделе этот сводный список популярных регистраторов.
c. Проверьте статус домена
После успешной регистрации ваш домен status изменится на active.
pulumi stack output5. Протестируйте сайт
Вы выполните две nslookup команд для серверов имён, назначенных Cloudflare.
Чтобы протестировать сайт, выполните:
DOMAIN=$(pulumi config get domain)
NS1=$(pulumi stack output nameservers | jq '.[0]' -r)
NS2=$(pulumi stack output nameservers | jq '.[1]' -r)
nslookup $DOMAIN $NS1
nslookup $DOMAIN $NS2Для .NET используйте Nameservers как Output.
Убедитесь, что в ответе возвращается IP-адрес (или несколько адресов) вашего сайта.
6. Очистка
На этом последнем шаге вы удалите ресурсы и стек, использованные в этом руководстве.
a. Удалите ресурсы
pulumi destroy --yesb. Удалите стек
pulumi stack rm devСледующие шаги
Вы последовательно определили ресурсы Cloudflare, необходимые для добавления сайта в Cloudflare. Вы описываете ресурсы на выбранном языке программирования, а остальное берет на себя Pulumi.
Чтобы развернуть бессерверное приложение с помощью Pulumi, следуйте Руководство по развертыванию Worker.