あんパン

こしあん派

CloudFront FunctionsでカスタムドメインへのHTTPリクエストを自分のdotfilesのリソースにリダイレクトする

タイトルだけだとどういうことか分かりづらいのだけど

$ bash -c "$(curl -fsSL https://dot.masawada.me/install)"

のように1コマンドでdotfilesをインストールしたい。この install ファイル自体もdotfilesに含めたものを利用したい、という話。自分の場合 install ファイルは以下に置いている。

github.com

https://github.com/masawada/dotfiles/blob/main/install のrawファイルは https://raw.githubusercontent.com/masawada/dotfiles/main/install で配信されるので dot.masawada.me/$PATHraw.githubusercontent.com/masawada/dotfiles/main/$PATH にリダイレクトできればいい。これをCloudFront Functionsで実現する。

いくつか方法を考えたところ、カスタムドメインが絡んでいる(証明書を設定できる必要がある)ので、実現方法は以下のいずれかになろうと思う。いずれもCertificate Managerで証明書を取る前提。

  • ALBのListenerでリダイレクトを仕込む
  • API Gateway経由のLambdaでリダイレクトを仕込む
  • CloudFront Functionsでリダイレクトを仕込む(この記事の方法)
    • 亜種としてLambda@Edgeもあるけどあまりに素朴なJavaScriptで済むのでわざわざ採用する理由がない

ALBはやりたいことに対してお金がかかりすぎる。API Gateway + Lambda案も考えたけど /install だけでなく /scripts/os_install みたいなエンドポイントでもリダイレクトしてほしいので、ちまちまマッピングするのはだるそうだなあと思い、CloudFront Functionsで済ませることにした。というか単純にCloudFront Functions使ったことなかったので純粋な興味というのが大きな理由ではある。

ちなみにこれまではCloudFrontのoriginをS3に設定して、S3側でリダイレクトを設定していた。S3にはリダイレクトを仕込む機能があり、これで無理矢理GitHubにリダイレクトすることができる。

docs.aws.amazon.com

CloudFront Functionsがある今はこんな無理矢理なことをしなくても実現できるのでそうする。具体的には以下のような感じでStackとCloudFront Functionsの定義を書く。

gist.github.com

CloudFront Functionsで渡ってくるeventの構造は以下のページに詳細が書いてある。のでこれを読みながらちまちま書いていけば完成する。

docs.aws.amazon.com

CloudFrontなのでoriginは必ず設定する必要があって、ここでは空のS3 bucketをoriginとしている。CloudFront Functionsで全てのリクエストが捻じ曲げられるのでS3に何かを置いても特に意味はない。

あと注意点としては、このStackを初期化する際に渡すCertificate Managerの証明書はus-east-1にある必要がある。CDKは(というかCloudFormationでは)素のままではクロスリージョンで参照を渡すことができないので、証明書もCDKで発行する場合はこのStackもus-east-1で構築する必要がある。

とはいえひととおりをCDKで素朴に組めて結構便利だと思う。