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. 仕組み
- CloudFrontが設定したカスタムヘッダーに正しい秘密鍵(トークン)がセットされている場合のみアクセスを成功させる仕組みです
- 秘密鍵の検証にはLambdaを使います
3. 設定手順
※ 本記事は2025年12月時点の情報です。AWSマネジメントコンソール画面のレイアウトは変更されることがあります。
Step 1: 秘密の文字列(トークン)を生成する
- UUIDなどの推測されにくい文字列を用意します
- トークンジェネレーターなどのサイトを利用しても良いでしょう
- opensslコマンドが使える環境がある場合は以下で生成出来ます
openssl rand -hex 32
Step 2: CloudFrontにカスタムヘッダーを追加する設定を行います
- CloudFrontのコンソール画面からディストリビューションを選択します
- 「オリジン」タブを開いて設定するオリジンを選択し[Edit]を押下します
- Custom Headerを追加します
Header nameに「authorization」と入力します(Step 3でLambda関数に設定する名前と同じであれば何でもOKです)
Value にStep 1で作ったトークンを入力します
Step 3: 秘密鍵を検証するLambda関数を作成します
exports.handler = async(event) => {
const response = event.headers.authorization === "(トークン)"
? {"isAuthorized": true}
: {"isAuthorized": false}
return response;
};
- ソースを更新したらデプロイを行って下さい
Step 4: API Gateway側の設定
- API GatewayのAPIs画面から設定を行うHTTP APIを選択します
- Routes画面の[Attach authorization]ボタンを押下します
- 「LambdaAuthorizer」を選択して[Attach authorization]ボタンを押下します
*設定保存しただけでは動きません!最後にデプロイボタンを押してください!
API Gatewayの内容を変更したらデプロイを実行しないと反映されないことに注意してください。
4. 動作確認
5. 注意点
- セキュリティ強度: この方法は「ヘッダーを知っていればアクセスできる」ため、より厳密にするならWAFを使う方法や、署名付きリクエスト(SigV4)を使う方法がありますが今回は手軽で一般的な手法を紹介しました。
6.最後に
serverless-express-lambda+HTTP APIの組み合わせでインフラ構築を楽にしましょう。





