mTLS が設定されている API Gateway の前段に CloudFront を置くと双方の間でクライアント認証を通すことができない
概要
よくよく考えると当たる前のことな気がするけれど、せっかく試したのでメモる。
mTLS が設定されている API Gateway に対して、別のドメインでアクセスしたい場合、前段に CloudFront を置いて、CNAME を設定してあげれば良いんじゃないかなと思った。
この構成の場合、クライアント証明書を指定しての HTTP リクエストはまず CloudFront へ投げることになる。ここでクライアントと CloudFront 間はクライアント認証しないので、指定したクライアント証明書は使用されない。その後、CloudFront から API Gateway に対して、HTTP ヘッダー、ボディを受け流すことは可能だが、前段で指定したクライアント証明書までも受け継いでくれるわけではないので、ここで認証エラーが発生する。
実際にこの構成を用意して、CloudFront に curl でリクエストを投げたら 502 エラーが発生した。
また、上記のリクエストによって API Gateway 側では何もログが残らず。直接 API Gateway に対してクライアント証明書を指定せずにリクエストした場合もログが残らなかったので、同じ挙動という理解に至った。