You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CDK完成BucketDeployment后如何获取对象键并配置CloudFront默认根对象?

在AWS CDK中获取BucketDeployment上传的哈希文件名并配置CloudFront默认根对象

当你用BucketDeployment上传带内容哈希的文件(比如something-[id].js)时,不需要硬编码文件名,通过以下步骤就能动态获取对象键并配置CloudFront:

步骤1:部署文件到S3

先正常定义你的S3桶和BucketDeployment,默认情况下内容哈希是开启的,会自动给文件名加上唯一哈希后缀:

import * as s3 from 'aws-cdk-lib/aws-s3';
import * as s3deploy from 'aws-cdk-lib/aws-s3-deployment';
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import * as origins from 'aws-cdk-lib/aws-cloudfront-origins';
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class MyStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const myBucket = new s3.Bucket(this, 'MyStaticBucket');

    // 部署本地dist目录下的文件到S3
    const fileDeployment = new s3deploy.BucketDeployment(this, 'DeployStaticFiles', {
      sources: [s3deploy.Source.asset('./dist')],
      destinationBucket: myBucket,
    });

步骤2:动态匹配目标文件的对象键

利用BucketDeployment的objectKeys属性,它会返回所有已上传文件的实际对象键(包含哈希后缀)。用正则筛选出你需要的something-[id].js格式文件:

// 筛选出符合something-xxx.js格式的文件
    const targetJsFile = fileDeployment.objectKeys.find(key => {
      return /^something-.+\.js$/.test(key);
    });

    if (!targetJsFile) {
      throw new Error('未找到匹配格式的目标JS文件,请检查本地文件目录');
    }

步骤3:配置CloudFront默认根对象

把获取到的targetJsFile直接传给CloudFront分发的defaultRootObject参数:

// 创建CloudFront分发
    new cloudfront.Distribution(this, 'MyCloudFrontDist', {
      defaultBehavior: {
        origin: new origins.S3Origin(myBucket),
      },
      defaultRootObject: targetJsFile, // 使用动态获取的带哈希的文件名
    });
  }
}

注意事项

  • objectKeys是BucketDeployment的内置属性,会自动追踪上传后的实际文件名,不需要额外配置。
  • 如果你的目录下有多个符合格式的文件,需要调整正则或添加额外逻辑(比如匹配更精确的前缀)来确保只选中目标文件。
  • 确保本地./dist目录下确实存在符合格式的文件,否则会抛出错误中断部署。

内容的提问来源于stack exchange,提问作者Satyaki Das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:42:20