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
相关产品推荐
相关产品推荐

