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

使用@aws-sdk/client-amplify从S3桶部署到Amplify分支时遇BadRequestException错误

@aws-sdk/client-amplify从S3桶部署到Amplify分支时遇BadRequestException错误

我之前也碰到过一模一样的问题!当时对着文档翻了好久才搞清楚问题出在参数传递的时机上,给你捋捋解决方案:

问题根源

你当前的流程是在StartDeploymentCommand里指定S3源信息,但Amplify需要在初始化部署的阶段就知道部署源在哪里——也就是CreateDeploymentCommand这一步。如果只传appId和branchName调用CreateDeployment,Amplify会默认认为你要通过上传文件的方式部署,所以到StartDeployment时就会报错说“未上传部署文件”。

修正后的正确流程

  1. 调用CreateDeploymentCommand时就指定S3源
    除了必填的appId和branchName,还要加上sourceUrl(你的S3桶路径,格式类似s3://your-deploy-bucket/frontend-dist)和sourceUrlType: "BUCKET_PREFIX",告诉Amplify这次部署直接从S3拉取文件,不用你上传。

  2. 调用StartDeploymentCommand启动部署
    这一步只需要传入appId、branchName,以及CreateDeployment返回的jobId即可,不需要再重复传S3相关参数。

  3. 轮询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 08:35:30