一般的なシナリオのCDN設定スニペット cdn-configuration-snippets
この記事では、AEM as a Cloud Serviceの実用的なcdn.yaml パターンについて説明します。 CDN トラフィックルール 、お客様が管理するCDN資格情報、およびWAFを含むトラフィックフィルタールールの機能ドキュメントと一緒に使用します。 Cloud Manager config パイプライン を使用してスニペットをデプロイします。
顧客管理CDN customer-managed-cdn
一部のドメインのみのEdge キー認証の設定 edge-auth-selected-hosts
問題:顧客が管理するCDNでは、一部の顧客ホスト名に対して認証を適用する必要がありますが、パブリッシュに到達する他のホスト名はそのヘッダーなしで使用できます(ロールアウト中や、CDNの背後に1つのブランドドメインしかない場合など)。
解決策:X-Forwarded-Hostの最初のホスト名がターゲット ホスト名に等しい場合にのみ、X-AEM-Edge-Key認証が必要です(例:example.com)。 ルールはforwardedDomain リクエストプロパティを使用して、その一致を実行し、エッジ認証者に対してauthenticate アクションを実行します。 プログラムのホスト名、認証者名、主要なプレースホルダーを置き換えます。
kind: "CDN"
version: "1"
data:
authentication:
authenticators:
- name: edge-key-auth
type: edge
edgeKey1: ${{CDN_EDGEKEY_1}}
edgeKey2: ${{CDN_EDGEKEY_2}}
rules:
- name: edge-key-auth-rule
when: { reqProperty: forwardedDomain, equals: "example.com" }
action:
type: authenticate
authenticator: edge-key-auth
VPN IPから送信されないリクエストに対するEdge キー認証の設定 edge-auth-trusted-ips
問題:BYOCDNのエッジキー認証を設定しますが、VPN IPのパブリッシュドメインにのみ直接アクセスを許可します
解決策:クライアント IPがVPN IPのリストに含まれていない場合にのみ、X-AEM-Edge-Key認証が必要です
kind: "CDN"
version: "1"
data:
authentication:
authenticators:
- name: edge-key-auth
type: edge
edgeKey1: ${{CDN_EDGEKEY_1}}
edgeKey2: ${{CDN_EDGEKEY_2}}
rules:
- name: edge-key-auth-rule
when: { reqProperty: clientIp, notIn: ["10.0.0.1", "11.0.0.0/24", "<other VPN IPs>"] }
action:
type: authenticate
authenticator: edge-key-auth
リダイレクト redirects
APEX ドメインからwwwへのリダイレクト apex-to-www
kind: "CDN"
version: "1"
data:
redirects:
rules:
- name: non-www-to-www-redirect
when:
reqProperty: domain
doesNotMatch: '^www\.'
action:
type: redirect
status: 301
location:
join:
format: 'https://www.%s%s'
args:
- reqProperty: domain
- reqProperty: url
キャッシュキーの変更 cache-key
CDNは、個別の「キャッシュキー」フィールドを公開しません。 URLはキャッシュに参加するので、URLを変更してキャッシュエントリを分割できます。例えば、 リクエスト変換を通じてクエリパラメーターを追加します。
kind: "CDN"
version: "1"
data:
requestTransformations:
rules:
- name: set-request-different-cache-curl
when:
allOf:
- reqProperty: tier
equals: publish
- reqHeader: user-agent
matches: curl
actions:
- type: set
queryParam: cache
value: 'curl'
正規化されたパスへのリダイレクト trailing-slash
ブラウザーが公開時に末尾のスラッシュ (例:https://www.example.com/path/からhttps://www.example.com/pathまで)をリクエストすると、永続的なリダイレクトを送信します。
kind: "CDN"
version: "1"
data:
redirects:
rules:
- name: remove-trailing-slash
when:
allOf:
- reqProperty: tier
equals: publish
- reqProperty: domain
equals: www.example.com
- reqProperty: originalPath
matches: ^/(.+)/$
action:
type: redirect
status: 301
location:
reqProperty: originalPath
transform:
- op: replace
match: ^/(.+)/$
replacement: https://www.example.com/\1
JSON Cookieからの情報の抽出 json-cookie
kind: "CDN"
version: "1"
data:
requestTransformations:
rules:
- name: options-response
when: { reqProperty: tier, equals: publish }
actions:
- type: set
reqHeader: x-mycookie-info
value:
reqCookie: mycookie
transform:
- 'base64decode'
- { op: 'replace', match: '"info":\s*"([^"]*)"', replacement: '\1'}
クロスオリジン設定 cross-origin
CDNからのOPTIONS リクエストの提供 options-from-cdn
kind: "CDN"
version: "1"
data:
requestTransformations:
rules:
- name: options-response
when:
allOf:
- { reqProperty: path, like: /mypathi* }
- { reqProperty: method, equals: "OPTIONS" }
- { reqHeader: Origin, equals: "https://example.com" }
actions:
- type: respond
status: 200
reason: "OK"
headers:
content-type: 'text/plain'
access-control-allow-origin: { reqHeader: Origin }
access-control-allow-methods: "*"
access-control-allow-headers: "*"
トラフィックフィルター traffic-filters
レート制限ASN rate-limit-asn
問題:IPごとのレート制限により、分散型サービス拒否(DDoS)パターンを見落とす可能性があります。各アドレスがしきい値を下回るので、正当で不正なトラフィックはIP層で同じように見えます。
解決策:同じネットワーク名を共有するホストをリミッターが集約するように、自律的なシステム名(clientAsName)でリクエストをカウントします。 スニペットは、リクエストごとにclientAsNameをログプロパティに書き込み、その値でグループ化されたオーサーとパブリッシュにレート制限を適用します。 多くのユーザーは1つのASNを共有できます(大規模なISPや企業のVPN離脱など)。そのため、チューニングでは慎重に制限を行い、CDN ログに誤検出がないか監視します。
kind: "CDN"
version: "1"
data:
requestTransformations:
rules:
- name: log-on-request
when: "*"
actions:
- type: set
logProperty: client_as_name
value:
reqProperty: clientAsName
trafficFilters:
rules:
- name: limit-requests-client-as-name
when:
reqProperty: tier
matches: "author|publish"
rateLimit:
limit: 60
window: 10
penalty: 300
count: all
groupBy:
- reqProperty: clientAsName
action: block