设置一个glue爬虫作业以从s3存储桶中读取数据并创建一个glue目录数据库。创建资源后,我如何触发它。我可以将它与 s3 对象创建挂钩吗?另外,爬虫是否可以检测数据之间的关系并相应地创建表,类似于关系数据库中的表,使用外键来链接表之间?例如,一个文件包含产品名称,其他文件包含产品详细信息。
[{ "id" : 1,
"product" : "Tablet",
},
{ "id" : 2,
"product" : "headphones"
}]
文件2。 [{“名称”:“平板电脑”,“价格”:350 ...},{}]
resource "aws_glue_crawler" "example" {
database_name = aws_glue_catalog_database.example.name
name = "example"
role = aws_iam_role.example.arn
s3_target {
path = "s3://${aws_s3_bucket.example.bucket}"
}
}
您无法在创建 S3 对象时直接触发 Glue Crawler。 您可以通过多种不同的方法来实现这一目标,总结如下:
1- 使用 Lambda(或 Step Functions):创建一个由 s3 触发的 Lambda 函数(您可以指定您的首选路径),并且在 Lambda 函数内部您可以添加如下代码来触发您的爬虫(您可以按照与 Step Functions 的方法相同):
glue = boto3.client(service_name='glue',region_name='your-region-name',endpoint_url='your-endpoint-url')
try:
glue.start_crawler(Name='your-crawler-name')
except Exception as error:
print(error)
print('Failed to start crawler')
raise error
2- 使用 EventBridge(CloudWatch 或 CloudTrail):创建侦听 S3 对象上传事件的规则。将规则目标设置为您的爬网程序。一般来说,您的规则配置将如下所示:
{
"source": ["aws.s3"],
"detail-type": ["Object Access:PutObject"],
"detail": {
"eventSource": ["s3.amazonaws.com"],
"eventName": ["PutObject"],
"requestParameters": {
"bucketName": ["<your-bucket-name>"]
}
}}
最后,您需要设置一个触发器:
{
"Name": "<your-trigger-name>",
"WorkflowName": "<your-workflow-name>",
"Type": "event",
"EventBatchingCondition": {
"BatchSize": 1
},
"Actions": [
{
"CrawlerName": "<your-crawler-name>"
}
]
}
您可以根据需要更改配置,例如上面的配置
"BatchSize": 1
意味着它将在1个文件上传到s3后触发,您可以根据您的需要增加此配置。