はじめに
CloudFront の Behavior でパスパターン文字のワイルドカードとして以下が使える。
-
*
は、0 個以上の文字に一致します。 -
?
は、正確に 1 個の文字に一致します。
一般的な利用では、先頭固定でパスを取る (例: /static/
以下に静的リソースを配置する。 /docs/
以下に記事コンテンツを配置する) と思うが、アプリケーションの作り上、途中に特定パスが入るようなケース (例: 途中にディレクトリ css
を含む全てのパスを対象にしたい時など) を CloudFront のパスパターンとして利用可能かを調査した。
実験内容と結果
Behavior の登録は可能か?
- パスパターンとして
/*/css/*
を CloudFront の Behavior に登録する (1) - パスパターンとして
/*/*/css/*
を CloudFront の Behavior に登録する (2)
結果: 共に登録可能 。 独自の挙動を設定できる。
どの Behavior にマッチするか?
CloudFront の Behavior の設定は以下の通りとする。
/*/css/*
は /*/*/css/*
を含むルールなので、優先度はこのような順として設定している。
No. | 優先度 | パスパターン |
---|---|---|
1 | 0 | /*/*/css/* |
2 | 1 | /*/css/* |
3 | 2 |
* (デフォルト) |
準備したファイル構造は以下の通り。 この時、アクセスによってどのようなパターンにマッチするかを確認する。
$ tree
.
├── css
│ ├── dir3
│ │ └── ok.txt
│ └── ok.txt
├── dir1
│ ├── css
│ │ ├── dir3
│ │ │ └── ok.txt
│ │ └── ok.txt
│ ├── dir2
│ │ ├── css
│ │ │ ├── dir3
│ │ │ │ └── ok.txt
│ │ │ └── ok.txt
│ │ ├── dir3
│ │ │ ├── css
│ │ │ │ └── ok.txt
│ │ │ └── ok.txt
│ │ └── ok.txt
│ └── ok.txt
└── ok.txt
検証結果は以下の通り。
URI | 一致した Behavior No. |
---|---|
/ok.txt |
3 (Default) |
/css/ok.txt |
3 (Default) |
/css/dir3/ok.txt |
3 (Default) |
/dir1/ok.txt |
3 (Default) |
/dir1/css/ok.txt |
2 ( /*/css/* ) |
/dir1/css/dir3/ok.txt |
2 ( /*/css/* ) |
/dir1/dir2/ok.txt |
3 (Default) |
/dir1/dir2/dir3/ok.txt |
3 (Default) |
/dir1/dir2/css/ok.txt |
1 ( /*/*/css/* ) |
/dir1/dir2/css/dir3/ok.txt |
1 ( /*/*/css/* ) |
/dir1/dir2/dir3/css/ok.txt |
1 ( /*/*/css/* ) |
最初に提示したワイルドカードルールに従った Behavior が選ばれていることが分かる(複数にマッチする場合は、最初にマッチした優先度のもの)。
ほとんど直感的な動作になっているが /
による層を期待しているような場合(例えば表の最後のケース)にだけ直感的な動きになっていない点に注意。
*
が単に0文字以上の文字、なので、区切りとして想定されている /
を含むため、このような挙動になっている。