文件上传到 S3 存储桶后基于事件的 AWS Glue Crawler 触发器?
Event based trigger of AWS Glue Crawler after a file is uploaded into a S3 Bucket?
是否可以在上传到 S3 存储桶的新文件上触发 AWS Glue 爬虫,前提是该爬虫 "pointed" 到该存储桶?换句话说:文件上传会生成一个事件,导致 AWS Glue 爬虫对其进行分析。我知道有基于时间表的抓取,但从未找到基于事件的抓取。
不,目前没有直接的方法来调用 AWS Glue 爬虫来响应上传到 S3 存储桶。 S3 事件通知只能发送至:
- 社交网络
- SQS
- 拉姆达
但是,编写一小段 Lambda 代码以使用相关语言 SDK 以编程方式调用 Glue 爬虫是微不足道的。
作为快速入门,这里详细介绍了如何在 Python 中创建 Lambda 来执行此操作。这是我第一次创建 Lambda 所以 YMMV。
- 为了节省时间,select 'Create function' 然后点击 'Blueprints'。 Select 示例名为 's3-get-object-python' 并单击 'Configure'
- 填写 Lambda 名称并创建一个新角色,除非您已有角色。
- 向导会同时设置 S3 触发器
- 创建后,您需要找到它创建的角色并通过包含以下内容的策略添加新权限:
"Action": "glue:StartCrawler", "Resource": "*"
- 将代码更改为:
from __future__ import print_function
import json
import boto3
print('Loading function')
glue = boto3.client(service_name='glue', region_name='ap-southeast-2',
endpoint_url='https://glue.ap-southeast-2.amazonaws.com')
def lambda_handler(event, context):
#print("Received event: " + json.dumps(event, indent=2))
try:
glue.start_crawler(Name='my-glue-crawler')
except Exception as e:
print(e)
print('Error starting crawler')
raise e
最后,假设您 select 认为在开发时应禁用触发器,单击设计器面板中的 S3 触发器并确保它已启用(您可能需要在进行此更改后保存 lambda)
就是这样,但请注意,如果爬虫已经 运行,则会抛出异常,因此如果您频繁上传或长时间爬行,您将需要处理该异常。参见:https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-crawling.html#aws-glue-api-crawler-crawling-StartCrawler
编辑:
这帮助我处理了异常(来自 AWS Glue):https://github.com/boto/boto3/issues/1606#issuecomment-401423567
这是一个类似架构的分步指南(link 下面)。 (架构参考上图)
是否可以在上传到 S3 存储桶的新文件上触发 AWS Glue 爬虫,前提是该爬虫 "pointed" 到该存储桶?换句话说:文件上传会生成一个事件,导致 AWS Glue 爬虫对其进行分析。我知道有基于时间表的抓取,但从未找到基于事件的抓取。
不,目前没有直接的方法来调用 AWS Glue 爬虫来响应上传到 S3 存储桶。 S3 事件通知只能发送至:
- 社交网络
- SQS
- 拉姆达
但是,编写一小段 Lambda 代码以使用相关语言 SDK 以编程方式调用 Glue 爬虫是微不足道的。
作为快速入门,这里详细介绍了如何在 Python 中创建 Lambda 来执行此操作。这是我第一次创建 Lambda 所以 YMMV。
- 为了节省时间,select 'Create function' 然后点击 'Blueprints'。 Select 示例名为 's3-get-object-python' 并单击 'Configure'
- 填写 Lambda 名称并创建一个新角色,除非您已有角色。
- 向导会同时设置 S3 触发器
- 创建后,您需要找到它创建的角色并通过包含以下内容的策略添加新权限:
"Action": "glue:StartCrawler", "Resource": "*"
- 将代码更改为:
from __future__ import print_function
import json
import boto3
print('Loading function')
glue = boto3.client(service_name='glue', region_name='ap-southeast-2',
endpoint_url='https://glue.ap-southeast-2.amazonaws.com')
def lambda_handler(event, context):
#print("Received event: " + json.dumps(event, indent=2))
try:
glue.start_crawler(Name='my-glue-crawler')
except Exception as e:
print(e)
print('Error starting crawler')
raise e
最后,假设您 select 认为在开发时应禁用触发器,单击设计器面板中的 S3 触发器并确保它已启用(您可能需要在进行此更改后保存 lambda)
就是这样,但请注意,如果爬虫已经 运行,则会抛出异常,因此如果您频繁上传或长时间爬行,您将需要处理该异常。参见:https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-crawling.html#aws-glue-api-crawler-crawling-StartCrawler
编辑:
这帮助我处理了异常(来自 AWS Glue):https://github.com/boto/boto3/issues/1606#issuecomment-401423567