摘要
下面的terraform配置创建了aws_glue_catalog_database和aws_glue_catalog_table资源,但没有定义在Athena上下文中使用这些资源所需的s3存储桶输出位置。我可以通过AWS控制台手动添加s3输出位置,但需要使用terraform进行编程。
详细信息
创建aws-glue数据库和表的最小示例terraform配置:
resource "aws_glue_catalog_database" "GlueDB" {
name = "gluedb"
}
resource "aws_glue_catalog_table" "GlueTable" {
name = "gluetable"
database_name = aws_glue_catalog_database.gluedb.name
table_type = "EXTERNAL_TABLE"
parameters = {
EXTERNAL = "TRUE"
}
storage_descriptor {
location = var.GLUE_SOURCE_S3_LOCATION
input_format = "org.apache.hadoop.mapred.TextInputFormat"
output_format = "org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat"
ser_de_info {
name = "jsonserde"
serialization_library = "org.openx.data.jsonserde.JsonSerDe"
parameters = {
"serialization.format" = "1"
}
}
columns {
name = "messageId"
type = "string"
comment = ""
}
}
}
目的是能够通过Athena查询编辑器(AWS控制台(或使用python-boto3库(boto3.client('athena')
(访问该表。
然而,在任何一种情况下,在Athena访问工作之前,我都需要为查询定义一个输出位置。这在AWS控制台中很容易做到(Amazon Athena->查询编辑器->管理设置->查询结果的位置(,但我需要通过terraform来做到这一点,这样整个AWS基础设施堆栈就可以一次性设置。
有一个名为aws_athena_workgroup的地形资源具有output_location属性,但尚不清楚单独的aws_atherna_workgroup资源与已经定义的aws_glue_catalog_database之间的关系(似乎没有任何方法可以链接这两个资源(。
这个答案建议将现有的主工作组导入到terraform中并对其进行修改。但我需要的是一个terraform实现,它可以一次性从头开始设置所有内容。
如果有任何关于如何在地形中连接s3输出位置的建议,以便在雅典娜的背景下使用上述胶水资源,我们将不胜感激!
AWS Glue和Athena是两个独立的服务。Glue根本不需要知道Athena查询输出位置配置。它只是存储在Athena中运行的查询结果。
您只需在Glue resources旁边为aws_athena_workgroup创建一个新资源,并定义结果配置bucket。
resource "aws_athena_workgroup" "example" {
name = "example"
configuration {
enforce_workgroup_configuration = true
publish_cloudwatch_metrics_enabled = true
result_configuration {
output_location = "s3://${aws_s3_bucket.example.bucket}/output/"
encryption_configuration {
encryption_option = "SSE_KMS"
kms_key_arn = aws_kms_key.example.arn
}
}
}
}