AWS CDK公式の機能でACMとCloudFrontのクロスリージョン参照を実装する

AWS CDKの公式機能でクロスリージョン参照が可能になりました(exprementalな機能です)。ACMとCloudFrontをクロスリージョン参照して構築してみたので、ソースを共有します。
2023.10.05

AWS CDKでクロスリージョン参照できなくて、悔しい思いをしたことはありませんか? 私はよくあります。

そんなときはcdk-remote-stackパッケージを利用すると解決できており、以前ブログも書きました。

ところが、いつの間にかAWS CDK公式でクロスリージョン参照できるようになっていました!(2023/10/05時点では、まだexperimentalな機能です)

以前のブログ同様、次の図のようなCloudFront+S3の環境を東京(ap-northeast-1)リージョンで構築して、 CloudFrontにカスタムドメインをつける場合、CloudFrontの仕様上バージニア(us-east-1)リージョンでACMを構築する必要があります。

今回、公式の機能を使ってクロスリージョン参照ができるようになっていたので、実際にこの環境をAWS CDKで作ってみました。

サンプルコード

今回cdkで構築する環境のサンプルコードは以下に保存しています。細部が気になる方はこちらを御覧ください。

前提条件

AWS CDKはv2を使用しています。

$ cdk --version
2.99.1 (build b2a895e)

Version 2.50.0で追加された機能なので、それより新しければ動くと思います。

Route 53のパブリックホストゾーンを事前に作成しています。

解説

主なファイル構成はこんな感じです。

  • bin/
    • cdk-cloudfront-cross-region-sample.ts
  • lib/
    • acm-for-cloudfront-stack.ts
    • cloudfront-stack.ts
    • s3/
      • index.html

bin/cdk-cloudfront-cross-region-sample.ts

#!/usr/bin/env node
import "source-map-support/register"
import * as cdk from "aws-cdk-lib"
import { AcmForCloudfrontStack } from "../lib/acm-for-cloudfront-stack"
import { CloudfrontStack } from "../lib/cloudfront-stack"

const account = "<<YOUR_AWS_ACCOUNT_NO>>"
const domainName = "<<YOUR_PUBLIC_DOMAIN_NAME>>"
const hostName = "cf-cross"

const envJP: cdk.Environment = {
  account,
  region: "ap-northeast-1",
}

const envUS: cdk.Environment = {
  account,
  region: "us-east-1",
}

const app = new cdk.App()

const acmForCloudfront = new AcmForCloudfrontStack(
  app,
  "AcmForCloudfrontStack",
  {
    env: envUS,
    crossRegionReferences: true,
    domainName,
    hostName,
  },
)

const cloudfront = new CloudfrontStack(app, "CloudFrontStack", {
  env: envJP,
  crossRegionReferences: true,
  domainName,
  hostName,
  certificate: acmForCloudfront.certificate,
})

自分で使用するときは、環境に合わせて <<YOUR_AWS_ACCOUNT_NO>><<YOUR_PUBLIC_DOMAIN_NAME>> を書き換えてください。

まず最初に23行目でバージニアリージョンのACMを作成しています。

この時、スタックプロパティに crossRegionReferences: true を設定することで、異なるリージョン間であっても リソースの受け渡しができるようになります。

34行目でバージニアリージョンのACMを受け渡しつつ、東京リージョンでCloudFront+S3を作成しています。

同様に、スタックプロパティに crossRegionReferences: true を設定しています。

たったこれだけで、クロスリージョン参照ができるようになります。簡単ですね!

受け渡しさえできれば、あとは普通にCloudFrontを構築するだけです。

CloudFrontのAWS CDKでの書き方は、こちらのブログをご覧ください。

実際のプログラムはこちらです。

cdk-cloudfront-cross-region-sample/cloudfront-stack.ts at main · rednes/cdk-cloudfront-cross-region-sample

このcdkをデプロイすると、S3を東京リージョンに配置しながらカスタムドメインのCloudFrontが構築できます。

終わりに

AWS CDKでのクロスリージョンの参照が更に簡単になりました。 現時点ではexprementalな機能ですが、正式に取り入れられると良いですね。 いろいろなパターンで使えそうなので、クロスリージョン参照で困っている方はぜひ試してみてください。