Cloudflare連載5日目の記事です。
はじめに
TIG DXチームの小林弘樹です。
近年、CloudflareをCDNやDNSで活用しているシステムが増えている印象があります。宮崎さんの記事でもCloudflareを採用した事例が紹介されています。
CloudflareをCDNやDNSに利用しているサービスにおいて、CDNレイヤでメンテナンスイン/アウトを実装する方法を書いてみます。
概要
やりたいこと
- Cloudflare上にメンテナンスページ(htmlファイル)をデプロイする
- 運用保守拠点からのアクセスはオリジンにアクセスさせ、その他一般ユーザーからのアクセスはメンテナンスページにリダイレクトさせる
- Cloudflare APIを利用して、メンテナンスイン/アウトを自動化する
利用サービス
ドメイン取得・管理
今回の構成はCloudflare上でドメインを管理していることが前提となります。
Cloudflareでドメインを取得したり、取得済みのドメインをCloudflareに移管する方法については、詳しくわかりやすい情報が多く公開されているため他の記事を参照してください。
Cloudflare R2設定
バケット構築
まずはバケットを作ります。
2024/05現在では凝った設定はできないため、ただ箱のみとなります。
resource "cloudflare_r2_bucket" "maintenance" { |
パブリックアクセス設定
Cloudflare R2の設定画面からパブリックアクセス設定の「ドメインに接続」をクリックし、Cloudflareで管理しているドメインを利用して任意のドメインを入力します
ステータスがアクティブになったら完了です。
htmlファイルアップロード
メンテナンスページ(htmlファイル)のデプロイは自動化したいため、APIでのアップロードを行います。
Cloudflare R2のAPIは、制約は多いですがAWS S3 APIと互換性があるため、AWS CLIやAWS SDKなどと同様に実行できます。
今回はAWS CLIで実行します。
まずは、APIトークンを発行する必要があります。
Cloudflare R2の概要画面から「R2 APIトークンの管理」をクリックし、「APIトークンを作成する」をクリックします。
オブジェクトの書き込み権限を付与して作成します。
また、バケットはメンテナンスページ用のバケットに特定しておきましょう。
作成完了すると以下の情報が表示されるため控えておきます。
- アクセスキーID
- シークレットアクセスキー
- エンドポイント
aws configureでアクセスキーとシークレットアクセスキーを設定し、以下のコマンドを実行します。
$HTML_PATH
はアップロードしたいhtmlファイルのパス、$R2_BUCKET_NAME
はバケット名、$R2_ENDPOINT
はエンドポイントに適宜修正してください。
aws s3 cp $HTML_PATH s3://$R2_BUCKET_NAME --endpoint-url https://$R2_ENDPOINT --region apac |
リダイレクトルール設定
許可IPリスト作成
まずメンテンナンス中でもアクセスを許可したい運用保守拠点のIPアドレスリストを作成します。
下記のリストはTerraformからでも作れますが、著者が検証した限りでは何も変更を加えていないのにも関わらずapplyをする度にリソースが作り直されるという現象が起き、正しく設定されているのかがわかりづらく運用上困るため手動構築としています。
アカウント管理のリスト管理画面から、「リストを作成する」をクリックして作成します。
リスト作成後、許可したいIPアドレスを追加したら完了です。
リダイレクトルール作成
作成したIPリスト以外のIPリストからのアクセスはメンテナンスページにリダイレクトするように設定します。
locals
で設定しているところは適宜修正してください。注意事項としては、ルールはruleset
という単位で作成され、リダイレクトルール全体で1つのruleset
である必要があります。
つまり、既に他のリダイレクトルールが存在していると作成できなかったり、後から別のリダイレクトルールを追加しようとするとruleset
ごと更新になったりする点に注意が必要です。
resource "cloudflare_ruleset" "single_redirects" { |
なぜリダイレクトルールか
Cloudflareでこのようなリダイレクトを行いたいときには、他に以下の手段があります。
このうちPage Rulesは最近非推奨となり、廃止されることが予定されています。
Workersはより細かく柔軟に設定が可能ですが、今回のような単純なリダイレクト制御の場合はそこまでは不要であるため、よりシンプルなリダイレクトルールを採用しています。
自動化設定
自動化についてはGitHub Actionsなどを想定してはしていますが、特定のサービスに依存はしないためコマンドのみ記載します。
APIトークン作成
まずはAPIで色々と実行するためにAPIトークンを作成します。
プロフィールのAPIトークン画面から「トークンを作成する」をクリックします。
権限は動的リダイレクトの編集権限とキャッシュパージの実行権限が必要です。
また後述するルールセットIDの調査のためにルールセットの読み取り権限も付けておきます。
その他は極力必要最小権限となるように設定しましょう。
作成が完了したらトークンの値を控えておきます。
メンテナンスイン
以下のコマンドでメンテナンスインを実現できます。
# R2バケットにメンテナンスページをアップロード |
メンテナンスアウト
以下のコマンドでメンテナンスアウトを実現できます。
# リダイレクトルールを無効化 |
【補足】ルールセットID(&ルールID)の確認方法
著者が調べた限りでは、画面上で簡単にルールセットIDを確認する方法がありませんでしたので、Cloudflare APIを利用して確認しています。
ルールIDについては、作成したルール詳細を画面で表示するとURL末尾に入っていますが、一応同様に記載します。
# ルールセットIDの確認 |
最後に
Cloudflare R2とリダイレクトルールを利用してメンテナンスイン/アウトを実装できました。
少しでもCloudflareを利用している方の参考になれば幸いです。