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でS3の利用料を節約するためにやって置いた方がよいこと

    AWS

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

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

  2. AWS

    AWSでコンプライアンスのための監査ログを取得する方法

    PCI DSSやIT内部統制などのコンプライアンスの観点でAWS上で監…

  3. AWS

    AWSでCloudFrontを使った方が良い理由

    今回はAWSでCloudFrontを使用する際に、設定しておいた方が良…

  4. AWS

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

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

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

    AWS

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

    今回は、AWSを使ってクレジットカード業界のセキュリティ基準であるPC…

  6. Amazon Linux2でOSS版tripwireを使って改ざん検知する方法

    AWS

    Amazon Linux2でOSS版tripwireを使って改ざん検知する方法

    改ざん検知はPCI DSSなどセキュリティを強化する際には、必ず必要に…

最近の記事

  1. AWSでCloudFrontを導入する際に注意する点

    AWS

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

    PCI DSSに準拠するためにまず最初にやるきべこと
  3. Amazon Linux2でOSS版tripwireを使って改ざん検知する方法

    AWS

    Amazon Linux2でOSS版tripwireを使って改ざん検知する方法
  4. AWS

    AWSで大規模障害発生時に被害を最小限にする方法
  5. AWSコンソール用の安全なユーザーの作成方法

    AWS

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