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コンソール用の安全なユーザーの作成方法

    AWS

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

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

  2. AWS

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

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

  3. AWS

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

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

  4. AWS

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

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

  5. AWS

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

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

  6. AWS

    AWSでS3を安全に使うための2つのポイント

    今回は、AWSのS3(ストレージサービス)を安全に使うためのポイン…

最近の記事

  1. AWS

    AWSでS3を安全に使うための2つのポイント
  2. AWS

    AWSでCloudFrontを使った方が良い理由
  3. PCI DSS

    PCI DSSに準拠するためにまず最初にやるきべこと
  4. PCI DSS

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

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