如何使用CDK在亚马逊S3桶中创建Amplify上传所需的文件夹
答案
完全可以通过CDK的相关模块实现该需求。
S3本身没有实体文件夹的概念,所有目录结构本质是对象的Key前缀,你要的三个Amplify规范目录,只需要在CDK中生成对应前缀的零字节占位对象即可,S3控制台会自动将这些前缀识别为文件夹。
实现步骤
你需要先引入CDK官方提供的s3-deployment模块,该模块用于向S3桶批量上传资源,无需额外第三方依赖。以下是完整代码示例:
import { BucketDeployment, Source } from 'aws-cdk-lib/aws-s3-deployment'; import * as cdk from 'aws-cdk-lib'; import * as s3 from 'aws-cdk-lib/aws-s3'; // 你原有桶的创建逻辑保持不变 const test_bucket = new s3.Bucket(this, 'assets-bucket-id', { bucketName: 'assets-bucket-name', cors: [ { allowedHeaders: ["*"], allowedMethods: [ s3.HttpMethods.POST, s3.HttpMethods.PUT, s3.HttpMethods.GET, ], allowedOrigins: ["*"], exposedHeaders: [ 'x-amz-server-side-encryption', 'x-amz-request-id', 'x-amz-id-2', 'ETag' ], } ], }); // 新增:创建Amplify要求的三个目录占位符 new BucketDeployment(this, 'AmplifyStorageFolders', { destinationBucket: test_bucket, // 上传三个零字节的占位文件,对应三个目录前缀 sources: [ Source.data('public/.keep', ''), Source.data('protected/.keep', ''), Source.data('private/.keep', '') ], // 可选配置:设置占位文件缓存策略,避免不必要的重复部署 cacheControl: [cdk.aws_s3_deployment.CacheControl.maxAge(cdk.Duration.days(365))] });
注意事项
- 代码中的
.keep是无实际业务作用的占位文件,你后续可以手动删除,只要桶内存在对应前缀的对象,S3就会显示对应的目录,不会影响Amplify的正常使用。 - 如果你的业务场景中Amplify客户端会自动上传对应前缀的文件,也可以不用主动创建占位目录,只要桶的权限配置符合Amplify的要求即可,客户端首次上传时会自动生成对应前缀。
- 如果你需要同时配置Cognito身份池对这三个目录的访问权限,也可以直接在CDK中编写IAM策略绑定到对应身份角色,无需手动操作控制台。
内容的提问来源于stack exchange,提问作者unacorn
相关产品推荐
相关产品推荐

