首页 > 解决方案 > 无法在 Lambda 中创建 AWS 胶水爬虫,Lambda 由 Step 函数触发

问题描述

这是我的场景:

  1. API 网关/Lambda 触发 Step 函数。step 函数的有效负载是在现有 Athena 表上运行的 SQL 查询

  2. Step 函数的 Task-1 调用 Athena 上的 StartQueryExecution API。查询成功运行并在给定的 S 存储桶中生成结果

  3. Task-2 调用 Lambda,它根据 Task-2 的结果创建 AWS 爬虫(Task-2 获取 S3 文件位置作为 Task-1 的输入)

  4. 任务 3 调用运行在任务 2 中创建的爬虫的 Lambda

在此处输入图像描述

要在 Lambda 中创建 AWS 爬虫,以下是我在 Lambda (NodeJS) 中的代码:

  exports.handler = async(event) => {
    const awsglue = new aws.Glue();

    const uuid = event.QueryExecutionID
    var path = event.OutputPath

    var params = {
        Name: uuid,
        Role: <Role ARN>,
        DatabaseName: <Database name>,
        Targets: {
            S3Targets: [{
                Path: path
            }]
        }
    }

   var request = await awsglue.createCrawler(params, (err, data) => {
   if (err) console.log(err, err.stack);
   else console.log(data);
    })
  
    const response = {
        statusCode: 200,
        body: JSON.stringify(uuid),
    };
    return response;
};

问题 createCrawler是异步调用,Lambda 甚至在创建爬虫之前返回 SUCCESS。因此,应该运行爬虫的 Task-3 失败了。

为了解决这个问题,我尝试在同一个 Lambda 函数中组合createCrawlerstartCrawler,但这也不起作用。

我错过了什么吗?是否无法在由 Step 函数触发的 Lambda 函数中创建 AWS Glue 爬虫?

标签: node.jsaws-lambdaaws-glueamazon-athenaaws-step-functions

解决方案


Glue 爬虫应使用 Infra 管理的 Step Functions 的状态机作为代码创建,如 CloudFormation、Terraform 和 AWS CDK。

然后 lambda func 启动爬虫并检索爬虫运行的结果。

请参阅类似的示例代码,

Lambda Func 启动爬虫,https://github.com/awslabs/realtime-fraud-detection-with-gnn-on-dgl/blob/61b341eb1fed1b1b471c9fdccce0c348ff7f343f/src/lambda.d/crawl-data-catalog/index.ts# L24-L37

通过 CDK 创建爬虫,https://github.com/awslabs/realtime-fraud-detection-with-gnn-on-dgl/blob/61b341eb1fed1b1b471c9fdccce0c348ff7f343f/src/lib/etl-glue.ts#L78-L95


推荐阅读