AWS

CloudFrontでLambda@Edgeを本番運用してわかった注意点

CloudFrontでLambda@Edgeを一年間運用しまして、気づいた注意点についてお話しします。

Lambdaはus-east-1(Virginia)リージョンに作る

Lambda@EdgeとしてCloudFrontに紐づけるためにはus-east-1リージョンに作る必要があります。

ただし、us-east-1に作ったとしても各リージョンに関数の複製が作成されるため、日本からアクセスした場合にも遅くなるということはありません。

各CloudFrontイベントに対して、設定できるLambda関数は1つだけ

Lambda@Edgeを設定できるCloudFrontは下記の4つがあります

  • ビューワーリクエスト
  • オリジンリクエスト
  • オリジンレスポンス
  • ビューワーレスポンス

これについてはAWSの公式のドキュメントにわかりやすい図があります。

Lambda@Edge

各イベントに設定できるLambda関数はそれぞれ1つだけですので、複数の処理を行いたい場合は、1つの関数にまとめる必要があります。

Lambda関数のエラー処理をしっかり行う

例えば、下記のようなLambda関数を作って、User-Agentに文字列を追加するとします。

exports.handler = function(event, context, callback) {
  var request = event.Records[0].cf.request;
  var user_agent = request.headers["user-agent"][0].value + " test string";
  request.headers["user-agent"] = [{"key": "User-Agent", "value":user_agent}];
  callback(null, request);
};

その場合、User-Agentがついていないリクエストが送られた場合、request.headers[“user-agent”]がundefinedとなり、ユーザーには500エラーが返されてしまいます。

私は実際に本番運用してからそのようなケースに気づきCloudFrontのアクセスログを確認したところx-edge-result-typeの項目にLambdaErrorと記録されていました。

User-Agentはほとんどのリクエストでついているため、そのようなケースは想定していなかったのですが、HTTP/1.1のRFCではUser-Agentヘッダーは必須となっていませんでした。

そのような場合は、下記のように関数を変更することで、エラーが起きないようにすることができます。

exports.handler = function(event, context, callback) {
  var request = event.Records[0].cf.request;
  if (request.headers["user-agent"]) {
    var user_agent = request.headers["user-agent"][0].value + " test string";
  } else {
    var user_agent = "test string";
  }
  request.headers["user-agent"] = [{"key": "User-Agent", "value":user_agent}];
  callback(null, request);
};

Lambdaの同時実行数の制限に気をつける

Lambda@Edge の制限

AWSアカウントにつき1000が同時実行数の制限があります。こちらはサポートに申請することで上限の緩和ができます。

関連記事

  1. PCI DSS準拠するためにAWSのセキュリティグループを使うためのポイント

    AWS

    PCI DSS準拠するためにAWSのセキュリティグループを使うためのポイント

    AWSでセキュリティグループはEC2やRDS(リレーショナルデータベー…

  2. AWSコンソール用の安全なユーザーの作成方法

    AWS

    AWSコンソール用の安全なユーザーの作成方法

    AWSに最初にアカウントを作るとルートユーザーというものが作られます。…

  3. AWSでS3の利用料を節約するためにやって置いた方がよいこと

    AWS

    AWSでS3の利用料を節約するためにやって置いた方がよいこと

    AWSでファイルや画像などを配置する場所として利用する場所はS3ですが…

  4. AWS

    AWSでEC2インスタンスを安全に使うための3つの注意点

    今回はAWSでEC2インスタンスを起動した際に、安全に使うために行った…

  5. AWS

    AWSでRDSに安全にデータを保存するための5つのポイント

    今回はAWSのRDSにデータを安全に保存する方法についてお話したい…

  6. AWS

    AWSで大規模障害発生時に被害を最小限にする方法

    先日、AWSで大規模障害が発生し、多くのサービスが影響を受けました。こ…

最近の記事

  1. AWS

    AWSを利用してPCI DSS準拠のシステムを構築する3つのメリット
  2. AWSでCloudFrontを導入する際に注意する点

    AWS

    AWSでCloudFrontを導入する際に注意する点
  3. PCI DSS

    PCI DSSでデータを暗号化して保存する際の4つのポイント
  4. AWS

    AWSでOSの脆弱性対策をする方法
  5. AWS

    AWSでEC2インスタンスを安全に使うための3つの注意点
PAGE TOP