如何通过AWS CDK BucketDeployment获取已上传文件的对象键?
问题原因
你看到的this:cdk.out/asset.{315...一串数字}.zip是CDK为Source.asset()生成的临时压缩包键。当使用Source.asset()上传本地文件/目录时,CDK会自动将目标内容打包成zip,先上传到CDK的临时存储桶,再在部署阶段解压到你的目标BucketA中。因此uploadObject.objectKeys返回的是这个zip包的键,而非解压后的text1.txt。
解决方案
方案一:单个文件上传用Source.data()替代Source.asset()
如果只是上传单个文件text1.txt,改用Source.data()可以直接将文件内容上传到目标桶,此时objectKeys会直接返回你指定的文件名:
const fs = require('fs'); const uploadObject = new s3Deployment.BucketDeployment( this, `text1`, { sources: [s3Deployment.Source.data('text1.txt', fs.readFileSync(VALID_METADATA_PATH))], destinationBucket: bucketA, retainOnDelete: false, role: deploymentRole } ); // 此时输出的就是text1.txt new CfnOutput(this, 'fileKey', { value: Fn.select(0, uploadObject.objectKeys) });
方案二:目录上传时直接构造文件键
如果是上传包含text1.txt的目录,解压后文件会直接存放在BucketA的根目录(若未指定destinationKeyPrefix),此时可以直接硬编码输出目标键:
new CfnOutput(this, 'fileKey', { value: 'text1.txt' });
如果设置了destinationKeyPrefix(比如docs/),则键为前缀+文件名:
const uploadObject = new s3Deployment.BucketDeployment( this, `text1`, { sources: [s3Deployment.Source.asset(VALID_METADATA_PATH)], destinationBucket: bucketA, destinationKeyPrefix: 'docs/', // 指定前缀 retainOnDelete: false, role: deploymentRole } ); new CfnOutput(this, 'fileKey', { value: 'docs/text1.txt' });
方案三:动态获取解压后的文件列表(复杂场景)
如果需要动态获取解压后的所有文件键(比如目录下文件不固定),可以通过自定义资源调用AWS SDK的listObjectsV2接口查询BucketA中的文件。不过这种方式比较繁琐,仅推荐在文件列表不确定的复杂场景下使用。
内容的提问来源于stack exchange,提问作者Sean Liu
相关产品推荐
相关产品推荐

