如何在dbt测试完成后触发API调用启动AWS Glue任务?
在dbt测试完成后触发AWS Glue任务的可行方案
已尝试方案及阻塞点
- dbt → fal脚本(Python代码)→ 调用Glue任务
阻塞点:dbt Cloud并非直接运行Python,而是通过Github Actions执行,导致该流程无法按预期运作 - dbt → 借助on-run-end钩子调用Rest/POST API启动Glue任务
阻塞点:未找到从dbt发起API调用的有效实现方式(仅支持API调用dbt任务,反向调用不可行) - dbt生成新表 → SNS → Lambda函数 → 启动Glue任务
(未明确阻塞点,推测需调整触发逻辑)
可行解决方案
1. 基于Github Actions串联dbt与Glue任务
既然dbt Cloud通过Github Actions执行,直接在Workflow中扩展步骤:
- 在dbt测试完成的步骤后,新增调用AWS Glue的步骤
- 示例Workflow片段:
jobs: dbt-test-and-trigger-glue: runs-on: ubuntu-latest steps: - name: 拉取代码仓库 uses: actions/checkout@v4 - name: 执行dbt测试 run: dbt test --profiles-dir ./profiles - name: 配置AWS权限 uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: us-east-1 - name: 启动Glue任务 run: aws glue start-job-run --job-name YOUR_GLUE_JOB_NAME
- 优势:复用现有CI/CD流程,无额外工具依赖,权限通过Github Secrets安全管理
2. 用dbt的on-run-end钩子执行Shell命令
dbt钩子支持执行Shell命令,可直接通过AWS CLI或curl调用Glue API:
- 方式一:用AWS CLI(需运行环境已安装并配置权限)
在dbt_project.yml中添加:
on-run-end: - "aws glue start-job-run --job-name YOUR_GLUE_JOB_NAME"
- 方式二:用curl调用REST API(适合无法安装AWS CLI的环境)
on-run-end: - "curl -X POST 'https://glue.us-east-1.amazonaws.com/startJobRun' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer $(aws sts get-caller-identity --query Credentials.SessionToken --output text)' \ -d '{\"JobName\": \"YOUR_GLUE_JOB_NAME\"}'"
- 注意:dbt Cloud环境需配置AWS权限(可通过IAM角色或环境变量)
3. 基于CloudWatch Events监听dbt任务状态
- 开启dbt Cloud的CloudWatch事件推送,让dbt将任务状态事件发送到AWS CloudWatch
- 在CloudWatch中创建规则,匹配“dbt测试成功”的事件
- 绑定Lambda函数作为规则目标,函数内编写启动Glue任务的逻辑(调用
boto3.client('glue').start_job_run(JobName='xxx'))
4. 优化SNS+Lambda触发方案
调整原方案的触发逻辑,让dbt主动触发SNS消息:
- 在
dbt_project.yml中配置钩子,测试完成后向SNS主题发送消息
on-run-end: - "aws sns publish --topic-arn arn:aws:sns:us-east-1:YOUR_ACCOUNT_ID:YOUR_TOPIC_NAME --message 'dbt tests passed, trigger glue job'"
- 让Lambda订阅该SNS主题,收到消息后调用Glue API启动任务
内容的提问来源于stack exchange,提问作者Oj Sindher
相关产品推荐
相关产品推荐

