1
1

CloudFrontでAPI Gatewayをオリジンに指定する場合の注意

Last updated at Posted at 2023-12-23

はじめに

CloudFront経由でAPI Gatewayを叩いてみたくなったので叩きました。
その際のつまづきをメモしておきます。

cap1.png

1.HOSTヘッダーをオリジンAPI Gatewayにリクエストしてエラー

エラー内容
< HTTP/1.1 403 Forbidden
~(略)~
{"message":"Forbidden"}

ステータス403で上記レスポンスが返却されました。

エラー原因

↑記事でも詳しくまとめられていますが、API Gatewayがオリジンの場合、Origin Request PolicyでHostをオリジンへリクエストするよう設定すると、このエラーが発生するようです。

cap2.PNG

CloudFrontの設定画面でも、API GatewayへのOrigin Request PolicyはAllViewerExceptHostHeader(HOSTヘッダー以外をオリジンへリクエストするOrigin Request Policy)が推奨されています。

cap3.PNG

2.オリジンパスとオリジンへのリスエストパスの関係を誤解してエラー

エラー内容
< HTTP/1.1 403 Forbidden
~(略)~
{"message":"Missing Authentication Token"}
エラー原因

CloudFrontはパスパターンを確認した後、そのパス部分をすべて含むリクエストをオリジンに送信する仕様でした。(そりゃそうか)

パスパターン設定とcloudfrontからオリジンへのリクエストパスの関係は以下の通りとなります。

パスパターン設定

cap4.PNG

リクエストパス

// デフォルトパスパターンに一致するケース
https://XXXXX.cloudfront.net/aaa
  → 〇:https://expressEC2instace/aaa // 想定通りの挙動

// パスパターン	/api/* に一致するケース
https://XXXXX.cloudfront.net/api/example
    // なんとなくパスパターン以降がパスとなると想定していた
  → ☓:https://apigateway_dev/example
    // オリジンへはパスパターン込みでリクエストされる
  → 〇:https://apigateway_dev/api/example

つまり、API Gatewayのメソッドを以下のように作成する必要があります。

cap5.PNG

API Gatewayのパス設計がCloudFrontのパスパターンを考慮しないといけないのはなんか微妙ですね・・・

おわりに

単純なエラーだったので良かったですが、API Gateway周りは微妙に不親切なことが多いように思います。
これからも触れる機会を作っていき、慣れていきたいです。

また、見聞きしたことのあるようなよくある構成でも、実際にやってみないと分からないことは多くあると強く思いました。
少しでも気になったら手を動かす癖がつけばいいなと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1