メニューを閉じる

テクノデジタルグループ

メニューを開く

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

【詳細】

1)Lambda関数の作成

※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

2)[テスト]タブでテスト

テンプレート:CloudFron-tAccess-request-in-response

          "uri": "/path/to/old/",
          "querystring": "n=xxxx",
          "method": "GET"

この辺書き換えてテストを実施。
問題なければバージョンを発行する

[新しいバージョンを発行]
→生成されたARNを以下の作業で利用するのでコピーしておく

3)IAMロールの修正

Lambda@Edgeを利用するためにはIAMロールの信頼関係を以下のように修正する必要があります。
[Lambda]-[関数]-[関数名]-[アクセス権限]-[実行ロール]
該当のロール-[信頼関係]を以下のように修正

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "edgelambda.amazonaws.com",
          "lambda.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

4)CloudFrontにアタッチ

[CloudFront]-[ディストリビューション]-対象ID-[ビヘイビア]-[編集]

パスパターン設定の「関数の関連付け」で
ビューワーリクエスト
関数タイプ:Lambda@Edge
関数:上記で取得したARN

として
[変更を保存]

※CloudFrontのデプロイには少し時間がかかるのでお待ちください


【記事への感想募集中!】

記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!
  • こんな記事が読んでみたい、こんなことが知りたい、調べてほしい!という意見も募集中!
  • いただいた感想は今後の記事に活かしたいと思います!

感想フォームはこちら


【テクノデジタルではエンジニア/デザイナーを積極採用中です!】

下記項目に1つでも当てはまる方は是非、詳細ページへ!
  • 自分でアプリを作ってみたい
  • ITで世の中にワクワクを生み出したい
  • 使いやすさ、デザインにこだわったWebサイトを開発したい

採用情報の詳細はこちら


Qangaroo(カンガルー)

  • 徹底した見やすさと優れた操作性で、テストの「見える化」を実現。
  • テストの進捗が見える。開発がスマートに進む。
  • クラウド型テスト管理ツール『Qangaroo(カンガルー)』

【テクノデジタルのインフラサービス】

当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。

https://www.tcdigital.jp/infrastructure/

最近の記事