JavaScriptを有効にしてください

CloudFront Functionsをリダイレクトに利用してみた

 ·  ☕ 3 分で読めます

CloudFront Functions を業務で少し利用したので、簡単に紹介したいと思います。

実現したいこと

事業部の方からとあるドメインが繋がらないと相談を受けました。

DNS 自体は自社で管理していたのですが、サービスについてはホスティングサービスを利用しており、その他諸々の事情で DNS で直接対象のサーバー/IP を設定することができなかったため、リダイレクトで対応することにしました。

リダイレクト方法

自社では AWS を利用していることもあり、リダイレクトについては、下記の方法が考えられます。

  • EC2 を立てて、nginx 等を動かす
  • API Gateway + Lambda
  • [email protected]
  • CloudFront Functions

あまり構築や運用に手間をかけたくなかったので、今回は [email protected] か CloudFront Functions で対応することにしました。

[email protected] と CloudFront Functions

[email protected] と CloudFront Functions は両方とも Edge Location で稼働します。(Amazon Web Services ブログより)

lambda@edgeとCloudFront Functions

違いとしては、上記の通り [email protected] は Region の Edge Location で稼働し、CloudFront Functions の CloudFront と同じ Edge Location で稼働します。その他にも下記のように実行できるランタイムなどの制限の違いがあります。(AWS Web Services ブログより)

lambda@edgeとCloudFront Functionsのスペック

リダイレクト処理のみのため、最大実行時間、メモリは問題にならず、また無料利用枠があることから、今回は CloudFront Functions を利用することにしました。

実際には CloudFront Functions は毎回実行されるのに対して、[email protected] では CloudFront 側でキャッシュが効くため、ユースケースによっては実行回数が抑えられる場合がありますので、単純には料金比較はできないのですが、今回のケースではそこまでアクセスがあるわけではなかったため、CloudFront Functions にしています。

CloudFront Functions の設定

チュートリアルの通り、設定自体は簡単で CloudFront 作成後、メニューの 関数 から作成することができます。

create_function

関数コード にてコードを記述していきます。

現在サポートされているランタイムは ECMA Script 5.1 準拠ということで、少々古く感じますが、一部 6~9 の機能や独自機能もサポートされており、そこまで困ることはないかと思います。

function

テスト から事前に記述したコードをテストすることができます。

test

テストは変更したコードである Development と現在公開されているバージョンである live の 2 つをテストすることができます。

test

テストして問題がなければ、 公開 から最新バージョンとして公開することができます。

publish

公開後、既存の CloudFront の behavior に関連付けを行います。この操作により、CloudFront にアクセスがあった場合に CloudFront Functions が実行されるようになります。

assosiation

terraform でも CloudFront Functions はサポートされているので、下記のように設定することができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
resource "aws_cloudfront_distribution" "main" {
    ...
     function_association {
      event_type   = "viewer-request"
      function_arn = aws_cloudfront_function.main.arn
    }
    ...
}

resource "aws_cloudfront_function" "main" {
  name    = "function"
  runtime = "cloudfront-js-1.0"
  comment = "redirect"
  publish = true
  code    = file("./function.js")
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function handler(event) {
    var response = {
        statusCode: 301,
        statusDescription: 'Moved Permanently',
        headers: {
            'location': { value: 'https://example.com' }
        }
    };
    return response;
}

まとめ

実際に利用してみて、思ったより簡単に設定できるなと感じました。
CloudFront 上で実行されるため、運用負荷も少なく、簡易な処理であれば、どんどん使っていきたいと思いました。

Edge 上で動くため、様々な制限はあるものの、活用できる場面は多いかなと思うので、これからも適材適所で利用していきたいと思います。

最後に

SheepMedical では AWS の各種サービスを利用したデリバリー改善、サービスの安定性向上、DevSecOps のライフサイクル改善、自動化等に興味がある方を絶賛募集しています。(時期によっては募集を停止していることがあります。)

共有

Shinichi Morimoto
著者
Shinichi Morimoto
Software Developer