Pulumi+GoでCloudflareのDNS既存リソースを管理してみる
最近Pulumiについてちょくちょく言及されているのを見て、気になったので試してみる。 まずは簡単な所から、Cloudflareで管理しているドメインのDNS設定を整理したかったので、そこをPulumiでコード管理にしてみた。
環境
- MacBook Air M1, 2020(Apple M1)
- macOS Ventura バージョン13.3.1 (a)
- go version go1.20.5 darwin/arm64
環境構築
Pulumiのインストール
Download & Install Pulumi | Pulumi Docsを参考にHomebrewを利用してインストールする。 インストール方法はいくつか選択肢があったが、素直にCommunity Homebrewを利用してインストールする。
Pulumiプロジェクトの作成
Pulumi & AWS: Create new project を参考に実施する。
pulumi new
すると、Pulumi Cloudへのログインを求められるので、Enterを押してブラウザからログインする。
Pulumi Cloudのアカウントがない場合は、作成をしてログインする。
ブラウザでログインが完了すると、他項目の入力を求められるので入力していく。
stackについては、 tkancf/prod
とするとPulumi Cloud上で https://app.pulumi.com/tkancf/<my-cloudflare-project>/prod
というpath構造になった。
GoのSDKをインストール
CloudflareのAPIトークンを設定する
CloudflareのAPIトークンを取得する。
Cloudflareにログインし、Get your API token
からTokenを作成する。今回は、Zone:Read, DNS:Read, DNS:Edit
権限があればOK。
取得したAPIトークンを保存する
PulumiのCloudflareのドキュメント Cloudflare: Installation & Configurationを参考に実施する。
環境変数として定義することも可能だが、下記コマンドでPulumiスタックと一緒に保存することができる。 複数ユーザーが簡単にアクセスできるようになり、公式でも推されていたのでこちらの方法で実施した。
Pulumi.prod.yaml
が生成され、APIトークンは暗号化されて保存されている。
Pulumi Cloud によって管理されるスタックごとの暗号化キーと値ごとのソルトを使用して値を暗号化されるらしい。
https://www.pulumi.com/docs/concepts/secrets/
コードを書く
ExistingId
関連の箇所は既存のDNSレコードをインポートするために、既存のDNSレコードのIDが必要なので入れておく。
インポート完了後は不要になるので、消してOK。
コードはgistにもサンプルを上げておく。 (https://gist.github.com/tkancf/bbcfc04e14c05529d2ec8e022ff1c85a#file-pulumi-go-cloudflare-dns-go)
デプロイ
インポートしようとしているリソースと差分があると、以下のように警告を出してくれるので差分がなくなるようにコードを修正していく。
ExistingId
関連の箇所をコードから消して終わり。
終わりに
以上、思った以上に簡単に既存リソースをインポート出来た。 Pulumiを触ったのは初めてだったが、公式がサンプルコードを多数置いてくれており悩む部分は少なかった。 個人的にはTerraformより既存リソースのインポートならPulumiの方が楽だと感じたが、まだ大きな違いを感じるほどしっかり触れてはいないので、今後もっと触ってみたい。
参考資料
- https://www.pulumi.com/docs/clouds/aws/get-started/create-project/
- https://www.pulumi.com/docs/concepts/secrets/
- https://www.pulumi.com/docs/get-started/
- https://www.pulumi.com/docs/install/
- https://www.pulumi.com/docs/intro/concepts/resources/#autonaming.
- https://www.pulumi.com/registry/packages/cloudflare/installation-configuration/