38
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

HTTPプロトコルのAPI GatewayをCloudFront経由のリクエストのみに制限してみた

Last updated at Posted at 2025-12-14

1. はじめに

アドベントカレンダー15日目の記事です。
ネタやポエムを書くのが苦手なのでガチのテック記事にしました。

背景

CloudFrontとAPI Gatewayを組み合わせた構成で、API Gatewayのエンドポイントに直接アクセスさせない情報はたくさんありますが、どれもREST APIプロトコル用のものでHTTP APIプロトコルの場合の情報は無いようです。

何が嬉しいの?

serverless-express-lambdaを使いたいけど、API Gatewayに直接アクセスさせたくない理由だけでREST APIを使ってる方に喜んでもらえると思います。
タイパ重視の方向けにハンズオン形式で説明しています。

採用する手法

CloudFrontの「オリジンカスタムヘッダー」とAPI Gatewayの「Authorizer」を使用します。

API Gatewayの設定で「Default endpoint」を無効にするとCloudFrontからのアクセスが出来なくなります。
私はこれでお客様に怒られました(汗)

2. 仕組み

image.png

  • CloudFrontが設定したカスタムヘッダーに正しい秘密鍵(トークン)がセットされている場合のみアクセスを成功させる仕組みです
  • 秘密鍵の検証にはLambdaを使います

3. 設定手順

※ 本記事は2025年12月時点の情報です。AWSマネジメントコンソール画面のレイアウトは変更されることがあります。

Step 1: 秘密の文字列(トークン)を生成する

  • UUIDなどの推測されにくい文字列を用意します
  • トークンジェネレーターなどのサイトを利用しても良いでしょう
  • opensslコマンドが使える環境がある場合は以下で生成出来ます
openssl rand -hex 32

Step 2: CloudFrontにカスタムヘッダーを追加する設定を行います

  • CloudFrontのコンソール画面からディストリビューションを選択します
    image.png
  • 「オリジン」タブを開いて設定するオリジンを選択し[Edit]を押下します
    image.png
  • Custom Headerを追加します
    Header nameに「authorization」と入力します(Step 3でLambda関数に設定する名前と同じであれば何でもOKです)
    Value にStep 1で作ったトークンを入力します
    image.png

Step 3: 秘密鍵を検証するLambda関数を作成します

  • LambdaのFunctions画面にある[Create function]を押下します
    image.png

  • Create function画面で以下の内容で関数を作成します
    関数名は「HTTPAPIAuthorizer」、Runtimeは「node.js」とします
    image.png

  • ソースはたったの6行です(笑)
    image.png

exports.handler = async(event) => {
  const response = event.headers.authorization === "(トークン)"
    ? {"isAuthorized": true}
    : {"isAuthorized": false}
  return response;
};
  • ソースを更新したらデプロイを行って下さい

Step 4: API Gateway側の設定

  • API GatewayのAPIs画面から設定を行うHTTP APIを選択します
    image.png
  • Routes画面の[Attach authorization]ボタンを押下します
    image.png
  • 「LambdaAuthorizer」を選択して[Attach authorization]ボタンを押下します
    image.png

*設定保存しただけでは動きません!最後にデプロイボタンを押してください!

API Gatewayの内容を変更したらデプロイを実行しないと反映されないことに注意してください。

4. 動作確認

  • ケース1:CloudFront経由(成功)
    image.png

  • ケース2:API Gateway直接(失敗)
    image.png

5. 注意点

  • セキュリティ強度: この方法は「ヘッダーを知っていればアクセスできる」ため、より厳密にするならWAFを使う方法や、署名付きリクエスト(SigV4)を使う方法がありますが今回は手軽で一般的な手法を紹介しました。

6.最後に

serverless-express-lambda+HTTP APIの組み合わせでインフラ構築を楽にしましょう。

38
3
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
38
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?