サイトを追加する
このチュートリアルでは、Pulumi Infrastructure as Code (IaC) を使用して既存のサイトを Cloudflare に移行するための手順を段階的に説明します。これにより、リソース管理ライフサイクルに慣れることができます。特に、ゾーンと新しく追加したサイトを解決するための DNS レコードを作成します。このチュートリアルは、サイトを追加するチュートリアル に記載された手順を完了するために IaC の原則を採用しています。
以下を確認してください:
- このチュートリアルのリソースを編集する権限を持つ Cloudflare アカウントと API トークン。必要に応じて、Cloudflare アカウント ↗にサインアップしてください。トークンには以下の権限が必要です:
Zone-Zone-Edit権限Zone-DNS-Edit権限include-All zones from an account-<your account>ゾーンリソース
- Pulumi Cloud アカウント。常に無料の個人プランにサインアップできます。こちらから ↗。
- Pulumi CLI がマシンにインストールされていること。
- Pulumi がサポートするプログラミング言語 ↗が設定されていること。(TypeScript、JavaScript、Python、Go、.NET、Java、または YAML を使用)
- ドメイン名。チュートリアルを完了するために
example.comを使用できます。
このチュートリアル用に新しく空のディレクトリを使用します。
mkdir addsite-cloudflarecd addsite-cloudflareプロンプトで Enter を押して、ブラウザを介して Pulumi Cloud アカウントにログインします。あるいは、Pulumi Cloud アクセストークン ↗を提供することもできます。
pulumi loginプログラムを作成するには、希望する言語を選択し、pulumi コマンドを実行します:
pulumi new javascript --name addsite-cloudflare --yes# プロジェクトが初期化されるまで数秒待ちますpulumi new typescript --name addsite-cloudflare --yes# プロジェクトが初期化されるまで数秒待ちますpulumi new python --name addsite-cloudflare --yes# プロジェクトが初期化されるまで数秒待ちますpulumi new go --name addsite-cloudflare --yes# プロジェクトが初期化されるまで数秒待ちますpulumi new java --name addsite-cloudflare --yes# プロジェクトが初期化されるまで数秒待ちますpulumi new csharp --name addsite-cloudflare --yes# プロジェクトが初期化されるまで数秒待ちますpulumi new yaml --name addsite-cloudflare --yes以下が必要です:
# ESC 環境名を定義するE=my-dev-env
# 新しい Pulumi ESC 環境を作成するpulumi config env init --env $E --yes --stack dev
# API_TOKEN を Cloudflare API トークンに置き換えるpulumi env set $E --secret pulumiConfig.cloudflare:apiToken API_TOKEN
# abc123 を Cloudflare アカウント ID に置き換えるpulumi env set $E --plaintext pulumiConfig.accountId abc123
# example.com を登録済みのドメインに置き換えるか、そのままにするpulumi env set $E --plaintext pulumiConfig.domain example.com
# ESC 環境を確認するpulumi env open $E{ "pulumiConfig": { "accountId": "111222333", "cloudflare:apiToken": "abc123abc123", "domain": "example.com" }}dev スタックをインスタンス化するには、次のコマンドを実行します:
pulumi up --yes --stack dev# スタックがインスタンス化されるまで数秒待ちます。この時点では、リソースを定義していないため、空のスタックになります。
これから、Pulumi Cloudflare パッケージと Cloudflare ゾーンリソースを Pulumi プログラムに追加します。
npm install @pulumi/cloudflareadded 1 package ...npm install @pulumi/cloudflareadded 1 package ...echo "pulumi_cloudflare>=5.35,<6.0.0" >> requirements.txtsource venv/bin/activatepip 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ファイルを開きます。<dependencies>セクション内に Pulumi Cloudflare 依存関係を追加します。
<dependency> <groupId>com.pulumi</groupId> <artifactId>cloudflare</artifactId> <version>5.35.1</version></dependency>- 次のコマンドを実行します:
mvn clean install...[INFO] BUILD SUCCESS...dotnet add package Pulumi.Cloudflare...info : Adding PackageReference for package 'Pulumi.Cloudflare' into project...YAML にはダウンロードする依存関係はありません。スキップしてください。
エントリポイントファイルの内容を以下のように置き換えます:
"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");
// Cloudflare リソース(ゾーン)を作成するconst zone = new cloudflare.Zone("my-zone", { zone: domain, accountId: accountId, plan: "free", jumpStart: true,});
// ゾーン ID をエクスポートするexports.zoneId = zone.id;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");
// Cloudflare リソース(ゾーン)を作成するconst zone = new cloudflare.Zone("my-zone", { zone: domain, accountId: accountId, plan: "free", jumpStart: true,});
// ゾーン ID をエクスポートするexport const zoneId = zone.id;import pulumiimport pulumi_cloudflare as cloudflare
account_id = pulumi.Config().require("accountId")domain = pulumi.Config().require("domain")
# Cloudflare リソース(ゾーン)を作成するzone = cloudflare.Zone("my-zone", zone=domain, account_id=account_id, plan="free", jump_start=True)
# ゾーン ID をエクスポートするpulumi.export("zoneId", zone.id)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")
// Cloudflare リソース(ゾーン)を作成する 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 }
// ゾーン ID をエクスポートする ctx.Export("zoneId", zone.ID()) return nil })}エントリポイントファイルは src/main/java/myproject ディレクトリにあります。
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()); }); }}using System.Threading.Tasks;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; }
[Output] public Output<string> ZoneId { get; set; } }}environment: - my-dev-env
resources: myZone: type: cloudflare:Zone properties: zone: ${domain} accountId: ${accountId} plan: "free" jumpStart: true
outputs: zoneId: ${myZone.id}pulumi up --yes --stack dev# 変更が適用されるまで数秒待ちますゾーン作成を確認するために zoneId の値を確認します。
pulumi stack output zoneIdd8fcb6d731fe1c2d75e2e8d6ad63fad5Cloudflare にドメインを追加すると、そのドメインには 2 つの割り当てられた権限のあるネームサーバーが割り当てられます。
エントリポイントファイルの最後に、zoneId 変数の下に以下を追加します:
exports.nameservers = zone.nameServers;exports.status = zone.status;export const nameservers = zone.nameServers;export const status = zone.status;pulumi.export('nameservers', zone.name_servers)pulumi.export('status', zone.status)ctx.Export("nameservers", zone.NameServers)ctx.Export("status", zone.Status)ctx.export("nameservers", zone.nameServers());ctx.export("status", zone.status());Program.csファイルの先頭にusing System.Collections.Immutable;を追加します。this.ZoneId = zone.Id;の下に、以下を追加します:
this.Nameservers = zone.NameServers;this.Status = zone.Status;public Output<string> ZoneId { get; set; }の下に、以下を追加します:
public Output<ImmutableArray<string>> Nameservers { get; set; }public Output<string> Status { get; set; }nameservers: ${exampleZone.nameServers}status: ${exampleZone.status}pulumi up --yes --stack dev割り当てられたネームサーバーを取得するために nameservers の値を確認します:
pulumi stack output --stack devドメインのCloudflareサービスを有効にするために、レジストラでネームサーバーを更新してください。手順はレジストラごとに異なります。この一般的なレジストラの統合リストの下にガイダンスが見つかるかもしれません。
正常に登録されると、ドメインのstatusはactiveに変更されます。
pulumi stack outputこれからドメインにDNSレコードを追加します。
以下は、Pulumiプログラムのエントリポイントファイルの最終バージョンです。 エントリポイントファイルの内容を以下のように置き換えてください。
"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");
// Cloudflareリソース(ゾーン)を作成const zone = new cloudflare.Zone("my-zone", { zone: domain, accountId: accountId, plan: "free", jumpStart: true,});
// ゾーンIDをエクスポートexports.zoneId = zone.id;exports.nameservers = zone.nameServers;exports.status = zone.status;
const record = new cloudflare.Record("my-record", { zoneId: zone.id, name: domain, value: "192.0.2.1", type: "A", proxied: true,});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");
// Cloudflareリソース(ゾーン)を作成const zone = new cloudflare.Zone("my-zone", { zone: domain, accountId: accountId, plan: "free", // 希望するプランを選択、例: "free", "pro", "business" など jumpStart: true,});
// ゾーンIDをエクスポートexport const zoneId = zone.id;
// Cloudflareが割り当てたネームサーバーをエクスポートexport const nameservers = zone.nameServers;
// ステータスをエクスポートexport const status = zone.status;
// サイトのためのレコードを設定const record = new cloudflare.Record("my-record", { zoneId: zoneId, name: domain, value: "192.0.2.1", type: "A", proxied: true,});import pulumiimport pulumi_cloudflare as cloudflare
account_id = pulumi.Config().require("accountId")domain = pulumi.Config().require("domain")
# Cloudflareリソース(ゾーン)を作成zone = cloudflare.Zone("my-zone", zone=domain, account_id=account_id, plan="free", jump_start=True)
# ゾーンIDをエクスポートpulumi.export("zoneId", zone.id)pulumi.export('nameservers', zone.name_servers)pulumi.export('status', zone.status)
record = cloudflare.Record("my-record", zone_id=zone.id, name=domain, value="192.0.2.1", type="A", proxied=True)package main
import ( cloudflare "github.com/pulumi/pulumi-cloudflare/sdk/v3/go/cloudflare" "github.com/pulumi/pulumi/sdk/v3/go/pulumi")
func main() { pulumi.Run(func(ctx *pulumi.Context) error { domain, _ := ctx.GetConfig("domain")
// Cloudflareリソース(ゾーン)を作成 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 }
// ゾーンIDをエクスポート ctx.Export("zoneId", zone.ID()) ctx.Export("nameservers", zone.NameServers) ctx.Export("status", zone.Status)
_, err = cloudflare.NewRecord(ctx, "my-record", &cloudflare.RecordArgs{ ZoneId: zone.ID(), Name: pulumi.String(domain), Value: pulumi.String("192.0.2.1"), Type: pulumi.String("A"), Proxied: pulumi.Bool(true), }) if err != nil { return err }
return nil })}package myproject;
import com.pulumi.Pulumi;import com.pulumi.Context;import com.pulumi.cloudflare.ZoneArgs;import com.pulumi.cloudflare.Zone;import com.pulumi.cloudflare.Record;import com.pulumi.cloudflare.RecordArgs;
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());
new Record("my-record", RecordArgs.builder() .zoneId(zone.id()) .name(domain) .value("192.0.2.1") .type("A") .proxied(true) .build()); }); }}using System.Collections.Immutable;using System.Threading.Tasks;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;
new Record("my-record", new RecordArgs { ZoneId = zone.Id, Name = domain, Value = "192.0.2.1", Type = "A", Proxied = true });
}
[Output] public Output<string> ZoneId { get; set; } public Output<ImmutableArray<string>> Nameservers { get; set; } public Output<string> Status { get; set; } }}environment: - my-dev-env
resources: myZone: type: cloudflare:Zone properties: zone: ${domain} accountId: ${accountId} plan: "free" jumpStart: true
myRecord: type: cloudflare:Record properties: zoneId: ${myZone.id} name: ${domain} value: 192.0.2.1 type: A proxied: trueoutputs: zoneId: ${myZone.id} nameservers: ${exampleZone.nameServers} status: ${exampleZone.status}pulumi up --yes --stack devCloudflareが割り当てたネームサーバーに対して2つのnslookupコマンドを実行します。
サイトをテストするには、次のコマンドを実行します:
DOMAIN=$(pulumi config get domain)NS1=$(pulumi stack output nameservers | jq '.[0]' -r)NS2=$(pulumi stack output nameservers | jq '.[1]' -r)nslookup $DOMAIN $NS1nslookup $DOMAIN $NS2.NETの場合は、NameserversをOutputとして使用します。
応答がサイトのIPアドレスを返すことを確認してください。
この最後のステップでは、チュートリアル全体で使用したリソースとスタックを削除します。
pulumi destroy --yespulumi stack rm devCloudflareにサイトを追加するために必要なリソースを段階的に定義しました。新しいリソースごとに、pulumi upコマンドを使用してdevスタックに変更を適用します。選択したプログラミング言語でリソースを宣言し、Pulumiが残りを処理します。
Hello Worldチュートリアルに従って、Pulumiを使用してサーバーレスアプリをデプロイしてください。