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)によって発行される提案書のことである。
RFC 1783
ここに記載されているように、「[]」は「安全でない = unsafe」な文字のため、URLエンコードしなければならない。
「[」と「]」をそれぞれ「%5b」「%5d」にエンコードすることで、エラーなくCloudFrontキャッシュを削除できた。