CDN アーキテクチャ設計書
@ecauth/auth-js クライアントライブラリの Cloudflare Pages 配信構成と SRI/CSP 戦略。
1. 概要
@ecauth/auth-js の UMD/ESM ビルドを Cloudflare Pages
で配信し、EC-CUBE プラグインから cdn.ec-auth.io
経由で読み込む。
背景
- EC-CUBE プラグインは
composer requireでインストールされるが、npm パッケージのビルド成果物(UMD ファイル)は PHP パッケージに含まれない - CDN 配信にすることで、プラグイン側のアセット管理(node_modules からのコピー、ビルドステップ)が不要になる
- 将来のマルチプラットフォーム展開(WordPress、Magento 等)でも同じ CDN URL を利用可能
2. アーキテクチャ全体像
flowchart TB
subgraph GitHub["GitHub"]
Release["GitHub Release
(v0.1.3)"]
Actions["GitHub Actions
(publish.yml)"]
npm["npmjs.com
(@ecauth/auth-js)"]
end
subgraph Cloudflare["Cloudflare"]
Pages["Cloudflare Pages
(ecauth-cdn)"]
Edge["Cloudflare Edge Cache"]
DNS["DNS
cdn.ec-auth.io"]
end
subgraph Client["EC-CUBE / ブラウザ"]
Script["<script src="cdn.ec-auth.io/...">"]
end
Release -->|trigger| Actions
Actions -->|pnpm publish| npm
Actions -->|upload artifacts| Release
Actions -->|wrangler pages deploy| Pages
DNS --> Edge
Edge -->|cache miss| Pages
Script -->|HTTPS| Edge
デプロイフロー
- GitHub Release を作成(
v0.1.3等) publish.ymlワークフローがトリガー- npm publish → ビルド成果物を Release にアップロード → 過去バージョンをダウンロード → Cloudflare Pages にデプロイ
cdn.ec-auth.io経由でアクセス可能
3. URL 設計
https://cdn.ec-auth.io/auth-js/{version}/ecauth-auth.umd.js
https://cdn.ec-auth.io/auth-js/{version}/ecauth-auth.esm.js
https://cdn.ec-auth.io/auth-js/latest/ecauth-auth.umd.js
| URL パターン | 用途 | 更新タイミング |
|---|---|---|
/auth-js/0.1.3/ecauth-auth.umd.js |
固定バージョン | 不変(イミュータブル) |
/auth-js/latest/ecauth-auth.umd.js |
最新バージョン | リリース時に上書き |
プラグインのリリース版は固定バージョン URL を使用し、開発時は
latest を利用する。
EC-CUBE プラグインでの利用
<script src="https://cdn.ec-auth.io/auth-js/0.1.3/ecauth-auth.umd.js"></script>
<script>
EcAuth.webauthn.authenticate({
optionsUrl: '{{ url("ecauth_passkey_authenticate_options") }}',
verifyUrl: '{{ url("ecauth_passkey_authenticate_verify") }}',
csrfToken: csrfToken
});
</script>
4. インフラ構成
Cloudflare リソース(Terraform)
| リソース | 名前 | 用途 |
|---|---|---|
| Pages Project | ecauth-cdn |
静的ファイルホスティング |
| Pages Domain | cdn.ec-auth.io |
カスタムドメイン |
| DNS CNAME | cdn → ecauth-cdn.pages.dev |
DNS 解決 |
Terraform 構成は ecauth-infrastructure/environments/cdn/
で管理。
# environments/cdn/main.tf
resource "cloudflare_pages_project" "ecauth_cdn" {
account_id = var.cloudflare_account_id
name = "ecauth-cdn"
production_branch = "main"
}
resource "cloudflare_pages_domain" "cdn" {
account_id = var.cloudflare_account_id
project_name = cloudflare_pages_project.ecauth_cdn.name
name = "cdn.ec-auth.io"
}
resource "cloudflare_dns_record" "cdn" {
zone_id = var.cloudflare_zone_id
name = "cdn"
type = "CNAME"
content = "ecauth-cdn.pages.dev"
ttl = 1
proxied = true
}
1Password シークレット
| アイテム | フィールド | 用途 |
|---|---|---|
cloudflare-credentials |
CLOUDFLARE_API_TOKEN |
Terraform + wrangler 認証 |
cloudflare-credentials |
CLOUDFLARE_ACCOUNT_ID |
Cloudflare アカウント識別 |
cloudflare-credentials |
CLOUDFLARE_ZONE_ID |
ec-auth.io ゾーン識別 |
5. CI/CD パイプライン
publish.yml(ecauth-auth-js)
flowchart LR
A["Release 作成"] --> B["Build & Test"]
B --> C["バージョン検証"]
C --> D["npm publish
(skip if published)"]
D --> E["Release に
artifacts アップロード"]
E --> F["cdn-dist 準備
(current + past versions)"]
F --> G["Cloudflare Pages
deploy --branch=main"]
安全策
| 対策 | 説明 |
|---|---|
| バージョン検証 | Release タグと package.json バージョンの一致を確認 |
| publish スキップ | npm view で既に公開済みならスキップ(再実行安全) |
| concurrency | concurrency: group: publish で同時実行を防止 |
過去バージョンの蓄積
Cloudflare Pages は毎回全ファイルをデプロイするため、過去バージョンを残す仕組みが必要。
現在の方式: GitHub Releases
からビルド成果物をダウンロードして cdn-dist
に含めてデプロイ。
cdn-dist/
├── auth-js/
│ ├── 0.1.1/
│ │ ├── ecauth-auth.umd.js
│ │ └── ecauth-auth.esm.js
│ ├── 0.1.2/
│ │ ├── ecauth-auth.umd.js
│ │ └── ecauth-auth.esm.js
│ ├── 0.1.3/
│ │ ├── ecauth-auth.umd.js
│ │ └── ecauth-auth.esm.js
│ └── latest/
│ ├── ecauth-auth.umd.js
│ └── ecauth-auth.esm.js
将来の方式: バージョン数が増えた場合、Cloudflare R2(オブジェクトストレージ)への移行を検討。追記型デプロイが可能になり、過去バージョンの再ダウンロードが不要になる。詳細は ecauth-auth-js#4 を参照。
6. 関連リポジトリと変更対象
| リポジトリ | 変更内容 | ファイル |
|---|---|---|
| ecauth-infrastructure | Terraform: Pages project, DNS, Pages domain | environments/cdn/ |
| ecauth-infrastructure | terraform.yml: plan-cdn/apply-cdn ジョブ追加 | .github/workflows/terraform.yml |
| ecauth-auth-js | publish.yml: CDN デプロイステップ追加 | .github/workflows/publish.yml |
| ec-cube4-ecauth | テンプレート: CDN URL に変更(別タスク) | Resource/template/admin/*.twig |