2025.08.29
Laravelで空判定にif文を使うとハマる理由
2023.03.09
インフラCloudFront+Lambda@EdgeでHTTPリダイレクト

– サイトの移設を行う際に、パスの構造が変わる部分についてリダイレクトをする
– 移設後のサイトはCloudFrontでキャッシュしているため、CloudFront側でリダイレクトを行う必要がある
– 当初CloudFrontFunctionsで対応していたが、コード量10KBまでしか扱えないため、およそ100件を超えるようなに対応できない→Lambda@Edgeで実現する
CloudFront Functionsでの方法
https://dev.classmethod.jp/articles/http-redirect-using-cloudfrontfunctions/
Lambda@Edgeでの方法
https://qiita.com/kooohei/items/7fcbc3602f7b7026b5a8
比較
https://qiita.com/hirai-11/items/c9339c88820d01fe0acb
※Lambda@edgeで利用する関数はバージニア北部(us-east-1)である必要があります。東京リージョンで作るとCloudFrontにアタッチする際に以下のようなエラーとなる。
The function must be in region ‘us-east-1’. ARN: arn:aws:lambda:ap-northeast-1:xxxxxxx:function:関数名
[Lambda]-[関数]-[関数の作成]
関数名
なんか適当につけて
ランタイム
Python3.9
コードに以下を張り付けて[Deploy]
def lambda_handler(event, context):
    dic = {
		'/path/to/old/' : 'https://domain/path_to_new/',
		'/path/to/old1/index.html' : 'https://domain/path_to_new2/hogehoge.html',
		'/path_to_old/?n=xxxx' : 'https://other_domain/path_to_new3/fugafuga.html'
    }
    request = event['Records'][0]['cf']['request']
    uri = request['uri']
    querystring = request['querystring']
    if querystring:
        uri += '?' + querystring
    if uri not in dic:
        return request
    response = {
        'status': '302',
        'statusDescription': 'Found',
        'headers': {
            'location': [{
                'key': 'Location',
                'value': dic[uri]
            }]
        }
    }
    return response
テンプレート:CloudFron-tAccess-request-in-response
          "uri": "/path/to/old/",
          "querystring": "n=xxxx",
          "method": "GET"
この辺書き換えてテストを実施。
問題なければバージョンを発行する
[新しいバージョンを発行]
→生成されたARNを以下の作業で利用するのでコピーしておく
Lambda@Edgeを利用するためにはIAMロールの信頼関係を以下のように修正する必要があります。
[Lambda]-[関数]-[関数名]-[アクセス権限]-[実行ロール]
該当のロール-[信頼関係]を以下のように修正
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "edgelambda.amazonaws.com",
          "lambda.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
[CloudFront]-[ディストリビューション]-対象ID-[ビヘイビア]-[編集]
パスパターン設定の「関数の関連付け」で
ビューワーリクエスト
関数タイプ:Lambda@Edge
関数:上記で取得したARN
として
[変更を保存]
※CloudFrontのデプロイには少し時間がかかるのでお待ちください
【記事への感想募集中!】
記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!【テクノデジタルではエンジニア/デザイナーを積極採用中です!】
下記項目に1つでも当てはまる方は是非、詳細ページへ!Qangaroo(カンガルー)
【テクノデジタルのインフラサービス】
当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。
最近の記事
1
2025.08.29
Laravelで空判定にif文を使うとハマる理由
2

2025.08.29
Git SSH接続でfetch/pullができなくなった時の対処法
3

2025.08.28
【体験談】Amazon Linux 2でMySQLインストール時のOpenSSL・GPG key エラーにハマった話
4
2025.08.28
【AWS】SSMポートフォワーディングとInstance Connectを利用したプライベートEC2へのSSH接続手順
5
2025.07.24
Log::info()が使えない!?Laravel.logのPermission denied エラーを解決する(Docker環境)
タグ検索