CloudFrontでキャッシュを削除する時は、特定文字に注意!

CloudFrontでキャッシュを削除するために、AWS SDK for PHPのCreateInvalidationメソッドを使ったところ、エラーが出てしまった。

[Aws\CloudFront\Exception\CloudFrontException]
Error executing "CreateInvalidation" on "https://cloudfront.amazonaws.com/2017-10-30/distribution/{distribution id}/invalidation"; AWS HTTP error: Client error: `POST https://cloudfront.amazonaws.com/2017-10-30
/distribution/{distribution id}/invalidation` resulted in a `400 Bad Request` response:
<!--?xml version="1.0"?-->
Sender< (truncated...)
InvalidArgument (client): Your request contains one or more invalid invalidation paths. - <!--?xml version="1.0"?-->
Sender<code>InvalidArgument</code>Your request contains one or more invalid invalidation paths.< /Error>{request id}[GuzzleHttp\Exception\ClientException] Client error: `POST https://cloudfront.amazonaws.com/2017-10-30/distribution/{distribution id}/invalidation` resulted in a `400 Bad Request` response: <!--?xml version="1.0"?--> Sender< (truncated...)

ファイル名に「test[1].html」を使っていたが、文字列「[]」がまずいようだ。

角括弧、ブラケット(bracket)である。

パスの ASCII 以外の文字または安全でない文字
パスに ASCII 以外の文字が含まれるか、RFC 1783 (http://www.ietf.org/rfc/rfc1738.txt) に規定された安全でない文字が含まれる場合、その文字を URL エンコードします。パスに含まれる他の文字を URL エンコードしないでください。URL エンコードした場合、CloudFront は、更新されたオブジェクトの旧バージョンを無効にしません。

CloudFront / オブジェクトの無効化 (ウェブディストリビューションのみ)

RFCとは、インターネット関連技術の標準化団体であるIETF(Internet Engineering Task Force)によって発行される提案書のことである。

Other characters are unsafe because gateways and other transport agents are known to sometimes modify such characters. These characters are “{“, “}”, “|”, “\”, “^”, “~”, “[“, “]”, and “`”.

RFC 1783

ここに記載されているように、「[]」は「安全でない = unsafe」な文字のため、URLエンコードしなければならない。

「[」と「]」をそれぞれ「%5b」「%5d」にエンコードすることで、エラーなくCloudFrontキャッシュを削除できた。