INTEGRITY Документация

Добавьте сайт

В этом руководстве вы пошагово подключите существующий сайт к Cloudflare с помощью инфраструктуры как кода (IaC) Pulumi и познакомитесь с жизненным циклом управления ресурсами. В частности, вы создадите Zone и запись DNS для разрешения вашего нового сайта. Руководство построено на принципе IaC и повторяет шаги, перечисленные в Руководство по добавлению сайта.

Перед началом работы

Убедитесь, что у вас есть:

1. Инициализируйте проект

Проект Pulumi представляет собой набор файлов в отдельной папке, описывающий инфраструктуру, которую требуется создать. Папка проекта Pulumi определяется обязательным Pulumi.yaml файл. Вы будете использовать Pulumi CLI для создания и настройки нового проекта.

a. Создайте каталог

Для этого руководства используйте новый пустой каталог.

mkdir addsite-cloudflare
cd addsite-cloudflare

b. Войдите в Pulumi Cloud

Pulumi Cloud ↗ это размещённый сервис, который предоставляет безопасную и масштабируемую платформу для управления инфраструктурой как кодом. Вы будете использовать его для хранения конфигураций бэкенда Pulumi.

В командной строке нажмите Enter, чтобы войти в аккаунт Pulumi Cloud через браузер. Также вы можете указать Токен доступа Pulumi Cloud ↗.

pulumi login

c. Создайте новую программу

Программа Pulumi представляет собой код, написанный на поддерживаемый язык программирования ↗ который определяет ресурсы инфраструктуры.

Чтобы создать программу, выберите нужный язык и выполните команду pulumi команда:

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

d. Создайте стек

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. В этом руководстве вы сохраните следующие значения:

# Define an ESC Environment name
E=cloudflare/my-dev-env

# Create a new Pulumi ESC Environment
pulumi config env init --env $E --yes
Creating 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.com

f. Установите пакет Cloudflare

Чтобы определять ресурсы Cloudflare в программе Pulumi, установите пакет Cloudflare для выбранного языка программирования.

Установите пакет Cloudflare, выполнив следующую команду:

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 ...

Ниже приведены инструкции для Apache Maven. Для других менеджеров проектов Java, таких как Gradle, см. официальную Репозиторий Maven ↗

  1. Откройте свой pom.xml файл.
  2. Добавьте зависимость Pulumi Cloudflare внутри <dependencies> раздел.
<dependency>
    <groupId>com.pulumi</groupId>
    <artifactId>cloudflare</artifactId>
    <version>5.38.0</version>
</dependency>
  1. Выполните:
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: true

3. Разверните изменения

Теперь, когда ресурсы определены, вы можете развернуть изменения с помощью Pulumi CLI, чтобы они отобразились в вашей учетной записи Cloudflare.

Чтобы развернуть изменения, выполните:

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

4. Настройте DNS-провайдера

a. Получите серверы имен

После добавления домена в Cloudflare этому домену будут назначены два авторитетных сервера имен.

Чтобы получить назначенные nameservers, выполните:

pulumi stack output

b. Обновите настройки регистратора

Обновите серверы имен у своего регистратора, чтобы активировать сервисы Cloudflare для домена. Инструкции зависят от регистратора. Возможно, вы найдете нужные указания в разделе этот сводный список популярных регистраторов.

c. Проверьте статус домена

После успешной регистрации ваш домен status изменится на active.

pulumi stack output

5. Протестируйте сайт

Вы выполните две 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 --yes

b. Удалите стек

pulumi stack rm dev

Следующие шаги

Вы последовательно определили ресурсы Cloudflare, необходимые для добавления сайта в Cloudflare. Вы описываете ресурсы на выбранном языке программирования, а остальное берет на себя Pulumi.

Чтобы развернуть бессерверное приложение с помощью Pulumi, следуйте Руководство по развертыванию Worker.