AWS Amplify构建完成后获取最新状态并触发带附件的自定义邮件
解决AWS Amplify构建完成后发送带附件的自定义状态邮件通知问题
核心思路
Amplify构建阶段内的脚本无法获取最终构建状态,必须脱离构建流程,通过外部服务监听构建完成事件来实现需求。以下是两种可行方案:
方案1:CloudWatch Events + Lambda + SES(推荐)
利用Amplify自动推送的构建状态事件,结合Lambda处理逻辑、SES发送带附件的自定义邮件。
步骤1:创建CloudWatch Event规则
- 触发源选择
AWS Amplify,事件类型为Amplify Deployment Status Change - 添加过滤条件,只监听最终状态(避免触发中间的
RUNNING状态):{ "source": ["aws.amplify"], "detail-type": ["Amplify Deployment Status Change"], "detail": { "status": ["SUCCEEDED", "FAILED", "CANCELLED"] } }
步骤2:编写Lambda处理函数
用Node.js示例实现,核心逻辑是获取构建详情、生成附件、调用SES发邮件:
const AWS = require('aws-sdk'); const amplify = new AWS.Amplify(); const ses = new AWS.SES({ region: '你的区域' }); exports.handler = async (event) => { const { appId, branchName, jobId, status } = event.detail; // 获取完整构建详情 const buildRes = await amplify.getJob({ appId, branchName, jobId }).promise(); // 生成附件(以JSON格式的构建详情为例) const attachmentBuffer = Buffer.from(JSON.stringify(buildRes, null, 2)); const base64Attachment = attachmentBuffer.toString('base64'); // 构造邮件参数 const emailParams = { Destination: { ToAddresses: ['收件邮箱'] }, Message: { Subject: { Data: `Amplify构建通知:${branchName} - ${status}` }, Body: { Text: { Data: `构建状态:${status}\n分支:${branchName}\n构建ID:${jobId}` } } }, Source: '发件邮箱(需在SES中验证)', Attachments: [{ Filename: `build-${jobId}-details.json`, Data: base64Attachment, ContentType: 'application/json' }] }; // 发送邮件 await ses.sendEmail(emailParams).promise(); return { statusCode: 200, body: '通知邮件已发送' }; };
步骤3:配置Lambda权限
- 添加
amplify:GetJob权限,允许读取构建详情 - 添加
ses:SendEmail权限,允许调用SES发送邮件 - 确保CloudWatch Events有触发该Lambda的权限
方案2:Amplify构建后触发外部Webhook
适合已有后端服务的场景,通过Webhook延迟查询构建状态:
- 在Amplify的
postBuild阶段,传递构建标识到外部Webhook:curl -X POST https://你的Webhook地址/amplify-notify \ -H "Content-Type: application/json" \ -d '{"appId":"'"$AWS_AMPLIFY_APP_ID"'","branchName":"'"$AWS_BRANCH"'","jobId":"'"$AWS_JOB_ID"'"}' - 外部Webhook服务接收请求后,设置10-15秒延迟(确保Amplify状态更新完成),调用Amplify API获取最终状态
- 生成附件后,通过SES或自有邮件服务发送自定义通知
为什么之前的方法无效?
- Amplify的
postDeploy属于构建流程环节,此时构建未完全结束,状态始终为RUNNING node-cron和sleep脚本会阻塞构建进程,且构建环境无法获取外部已更新的状态- SNS本身不支持直接添加附件,必须结合Lambda/SES处理附件逻辑
内容的提问来源于stack exchange,提问作者anuj gupta
相关产品推荐
相关产品推荐

