@wpkyoto/aws-cdk-cloudfront-s3 廃止のお知らせと移行ガイド

この度、@wpkyoto/aws-cdk-cloudfront-s3 ライブラリを正式に廃止することを決定しました。本ライブラリは AWS CDK v1(v1.47.0)をベースに構築されており、Origin Access Identity(OAI)を採用していましたが、現在では両技術ともにレガシーとなっています。

廃止に至った理由は複数あります。まず AWS CDK v1 自体がメンテナンスモードに移行しており、重大なバグ修正のみが提供される状態となっています。さらに深刻な問題として、OAI は新しい S3 リージョンでは動作しません。AWS は OAI に代わる新技術として Origin Access Control(OAC)を推奨しており、本ライブラリが依存する CloudFront API(CloudFrontWebDistribution)も非推奨となりました。

加えて、Node.js 12 ランタイムはサポート終了を迎えており、依存パッケージの古さに起因するセキュリティ上の脆弱性も懸念されます。これらの状況を総合的に判断し、ライブラリの継続的なメンテナンスを行わないことを決定しました。

推奨する移行先

移行先として最も推奨するのは、AWS が公式に提供している AWS Solutions Constructs の @aws-solutions-constructs/aws-cloudfront-s3 です。このコンストラクトは Well-Architected なベストプラクティスに準拠しており、本ライブラリが提供していた機能を上回る性能とセキュリティを実現できます。

インストールは以下のコマンドで行います。

npm install @aws-solutions-constructs/aws-cloudfront-s3

基本的な使用方法を見てみましょう。

import { CloudFrontToS3 } from '@aws-solutions-constructs/aws-cloudfront-s3';
import * as cdk from 'aws-cdk-lib';

const app = new cdk.App();
const stack = new cdk.Stack(app, 'MyStack');

new CloudFrontToS3(stack, 'CloudFrontToS3', {
  // 設定なしでも以下が自動的に構成されます
});

このコンストラクトを使用することで、OAC による最新のセキュリティ標準が自動的に適用されます。全ての S3 リージョンで動作し、SSE-KMS 暗号化にも対応しています。CloudFront と S3 のアクセスログが組み込みで提供されるため、コンプライアンス要件への対応も容易になるでしょう。データ保護の観点では、暗号化とバージョニングがデフォルトで有効化され、パブリックアクセスは自動的にブロックされます。

具体的な移行手順

既存のコードから新しいコンストラクトへの移行は比較的単純です。以下に、一般的なユースケースごとの移行例を示します。

カスタムドメインを使用している場合

本ライブラリで以下のように記述していたコードがあるとします。

import { CloudfrontS3 } from '@wpkyoto/aws-cdk-cloudfront-s3';

new CloudfrontS3(stack, 'MyConstruct', {
  name: 'example',
  acmCertificationARN: 'arn:aws:acm:...',
  domains: ['example.com']
});

これを AWS Solutions Constructs に移行する場合、次のように書き換えることになります。

import { CloudFrontToS3 } from '@aws-solutions-constructs/aws-cloudfront-s3';
import { Certificate } from 'aws-cdk-lib/aws-certificatemanager';

new CloudFrontToS3(stack, 'CloudFrontToS3', {
  cloudFrontDistributionProps: {
    certificate: Certificate.fromCertificateArn(
      stack,
      'Certificate',
      'arn:aws:acm:...'
    ),
    domainNames: ['example.com'],
  }
});

既存の S3 バケットを使用している場合

既存のバケットを指定する方法も同様にシンプルです。

import { CloudFrontToS3 } from '@aws-solutions-constructs/aws-cloudfront-s3';
import { Bucket } from 'aws-cdk-lib/aws-s3';

const existingBucket = Bucket.fromBucketName(stack, 'Bucket', 'my-bucket');

new CloudFrontToS3(stack, 'CloudFrontToS3', {
  existingBucketObj: existingBucket,
});

ネイティブ CDK v2 コンストラクトという選択肢

より細かな制御が必要な場合は、AWS Solutions Constructs を使わずにネイティブの CDK v2 コンストラクトを直接使用することも可能です。この方法では柔軟性が高まる一方、設定を自分で行う必要があります。

import { Distribution } from 'aws-cdk-lib/aws-cloudfront';
import { S3BucketOrigin } from 'aws-cdk-lib/aws-cloudfront-origins';
import { Bucket } from 'aws-cdk-lib/aws-s3';

const bucket = new Bucket(stack, 'WebsiteBucket');

const distribution = new Distribution(stack, 'Distribution', {
  defaultBehavior: {
    origin: S3BucketOrigin.withOriginAccessControl(bucket),
  },
  defaultRootObject: 'index.html',
});

Lambda@Edge から CloudFront Functions への移行

本ライブラリでは URL リライト(/ から /index.html への変換など)に Lambda@Edge を使用していました。現在では CloudFront Functions への移行を強く推奨します。

import { Function, FunctionCode, FunctionEventType } from 'aws-cdk-lib/aws-cloudfront';

const urlRewriteFunction = new Function(stack, 'UrlRewrite', {
  code: FunctionCode.fromInline(`
    function handler(event) {
      var request = event.request;
      var uri = request.uri;
      if (uri.endsWith('/')) {
        request.uri += 'index.html';
      } else if (!uri.includes('.')) {
        request.uri += '/index.html';
      }
      return request;
    }
  `),
});

new Distribution(stack, 'Distribution', {
  defaultBehavior: {
    origin: S3BucketOrigin.withOriginAccessControl(bucket),
    functionAssociations: [{
      function: urlRewriteFunction,
      eventType: FunctionEventType.VIEWER_REQUEST,
    }],
  },
});

参考リソース

移行作業を進める上で、以下の公式ドキュメントが参考になります。AWS Solutions Constructs の CloudFrontToS3 に関する詳細は https://docs.aws.amazon.com/solutions/latest/constructs/aws-cloudfront-s3.html で確認できます。CDK v2 の CloudFront モジュールについては https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_cloudfront-readme.html が参考になるでしょう。また、OAC に関する CDK L2 コンストラクトの詳細については、AWS DevOps ブログの記事(https://aws.amazon.com/blogs/devops/a-new-aws-cdk-l2-construct-for-amazon-cloudfront-origin-access-control-oac/)をご覧ください。

本ライブラリを利用していただいた皆様には、ご不便をおかけして申し訳ありません。AWS Solutions Constructs への移行により、より安全で保守性の高いインフラストラクチャを構築できるようになります。移行に関してご質問がありましたら、GitHub リポジトリの Issue でお気軽にお問い合わせください。

Hidetaka Okamoto profile photo

Hidetaka Okamoto

ビジネスデベロップメント

DigitalCubeのBizDev。EC ASPの開発やStripeのDeveloper Advocateとしての経験を元に、SaaSやECサイトの収益を増やすための方法・生成AIを使った効率化や新しい事業モデルの模索などに挑戦する。

関連記事