使用@aws-sdk/client-amplify从S3桶部署到Amplify分支时遇BadRequestException错误
@aws-sdk/client-amplify从S3桶部署到Amplify分支时遇BadRequestException错误
我之前也碰到过一模一样的问题!当时对着文档翻了好久才搞清楚问题出在参数传递的时机上,给你捋捋解决方案:
问题根源
你当前的流程是在StartDeploymentCommand里指定S3源信息,但Amplify需要在初始化部署的阶段就知道部署源在哪里——也就是CreateDeploymentCommand这一步。如果只传appId和branchName调用CreateDeployment,Amplify会默认认为你要通过上传文件的方式部署,所以到StartDeployment时就会报错说“未上传部署文件”。
修正后的正确流程
调用
CreateDeploymentCommand时就指定S3源
除了必填的appId和branchName,还要加上sourceUrl(你的S3桶路径,格式类似s3://your-deploy-bucket/frontend-dist)和sourceUrlType: "BUCKET_PREFIX",告诉Amplify这次部署直接从S3拉取文件,不用你上传。调用
StartDeploymentCommand启动部署
这一步只需要传入appId、branchName,以及CreateDeployment返回的jobId即可,不需要再重复传S3相关参数。轮询
GetJobCommand等待部署完成
和你之前的流程一致,定期查询任务状态直到部署结束。
简化代码示例
import { AmplifyClient, CreateDeploymentCommand, StartDeploymentCommand, GetJobCommand } from "@aws-sdk/client-amplify"; // 初始化Amplify客户端 const amplifyClient = new AmplifyClient({ region: "你的AWS区域,比如us-east-1" }); async function deployFromS3() { const config = { appId: "你的Amplify应用ID", branchName: "要部署的分支名,比如main", s3SourcePath: "s3://你的部署桶名/前端构建产物路径" }; // 1. 初始化部署任务,指定S3源 const createDeployCmd = new CreateDeploymentCommand({ appId: config.appId, branchName: config.branchName, sourceUrl: config.s3SourcePath, sourceUrlType: "BUCKET_PREFIX" }); const createResp = await amplifyClient.send(createDeployCmd); const { jobId } = createResp; // 2. 启动部署 const startDeployCmd = new StartDeploymentCommand({ appId: config.appId, branchName: config.branchName, jobId: jobId }); await amplifyClient.send(startDeployCmd); // 3. 轮询部署状态 let jobStatus = "PENDING"; while (jobStatus === "PENDING" || jobStatus === "RUNNING") { const getJobCmd = new GetJobCommand({ appId: config.appId, branchName: config.branchName, jobId: jobId }); const jobResp = await amplifyClient.send(getJobCmd); jobStatus = jobResp.job.summary.status; // 每5秒查询一次,可根据需求调整间隔 await new Promise(resolve => setTimeout(resolve, 5000)); console.log(`当前部署状态:${jobStatus}`); } console.log(`部署完成!最终状态:${jobStatus}`); } // 执行部署 deployFromS3().catch(err => console.error("部署失败:", err));
额外注意事项
- S3权限检查:确保Amplify的服务角色有访问你的S3桶的权限,需要添加
s3:GetObject和s3:ListBucket权限。你可以在IAM控制台找到Amplify应用对应的角色(通常命名格式为amplify-<appId>-<branchName>-role-xxxx),给它附加如下策略:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::你的部署桶名", "arn:aws:s3:::你的部署桶名/*" ] } ] } - S3路径格式:
sourceUrl必须是标准的S3路径格式(s3://bucket-name/path),确保路径指向的是前端构建产物的根目录(包含index.html的目录)。
按照这个流程调整后,应该就能解决那个BadRequestException错误了!
备注:内容来源于stack exchange,提问作者jmarkyston
相关产品推荐
相关产品推荐

