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. AWS

    CloudFormationを効果的に使うための6つのルール

    あなたはAWSでEC2を作成する時にAWSコンソールから作っていますか…

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

    AWS

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

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

  3. AWSで安全なネットワーク設計を行うポイント

    AWS

    AWSで安全なネットワーク設計を行うポイント

    今回は、AWSにおいて安全なネットワーク設計を行いポイントについて…

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

    AWS

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

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

  5. AWS

    AWSでLinuxサーバ上のログを自動的にS3に保存する方法

    AWSでLinuxサーバ上のApacheのアクセスログやアプリケーショ…

  6. AWS

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

    今回はAWSで作成したEC2インスタンスのOSの脆弱性対策をする方…

最近の記事

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

    AWS

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

    AWSでLinuxサーバ上のログを自動的にS3に保存する方法
  3. PCI DSSの12要件とAWSにおける対応方法

    AWS

    PCI DSSの12要件とAWSにおける対応方法
  4. AWS

    AWSでS3を安全に使うための2つのポイント
  5. PCI DSS準拠するためにAWSのセキュリティグループを使うためのポイント

    AWS

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