OpenMetadata Athena 连接器配置指南:从 IAM 权限到元数据摄取实战
【免费下载链接】OpenMetadataThe Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMetadata
导读
本文聚焦 OpenMetadata 项目中 Athena 数据库连接器的完整配置与使用。你将了解连接 Athena 所需的 AWS IAM 权限模型(Athena、Glue、Lake Formation 三大服务权限)、连接详情中每一个配置字段的语义与注意事项,以及如何通过 YAML 工作流或 UI 完成元数据、血缘与 Usage 摄取。结合仓库内 Athena 连接器源码 与 示例工作流,本文会深入到 JDBC URL 的构建逻辑、测试连接的诊断能力等底层细节,帮助你一次性把 Athena 连接器配通、配稳。
一、Athena 连接器概览
OpenMetadata 的 Athena 连接器通过JDBC 连接摄取元数据(见 连接器文档)。从 service_spec.py 可以看出,Athena 属于默认数据库服务规格(DefaultDatabaseSpec),同时注册了四类能力:
- 元数据摄取:
AthenaSource(metadata.py) - 血缘摄取:
AthenaLineageSource(lineage.py) - Usage 摄取:
AthenaUsageSource(usage.py) - 数据剖析:
AthenaProfilerInterface(位于ingestion/src/metadata/profiler/interface/sqlalchemy/athena/)
这意味着,一个 Athena 数据服务可以同时跑元数据、血缘、Usage 和 Profiler 四条管道。
二、前置要求:IAM 权限模型
Athena 连接器通过 JDBC/ODBC 驱动访问 Athena,因此 IAM 权限策略必须覆盖 Athena 及其下游依赖服务。AWS 官方文档明确要求:使用 JDBC 或 ODBC 驱动时,IAM 权限策略需要包含 AWS managed policy: AWSQuicksightAthenaAccess 中列出的所有操作。
2.1 三大权限域
该策略聚合了三类服务的权限,对应 Athena 摄取链路的三个环节:
| 权限域 | 作用 |
|---|---|
athena | 允许主体在 Athena 资源上运行查询,是元数据与 Usage 摄取的基础 |
glue | 允许访问 AWS Glue 数据库、表与分区;Athena 依赖 Glue Data Catalog 做元数据存储,此权限必须授予 |
lakeformation | 允许主体为已注册到 Lake Formation 的数据湖位置申请临时凭证 |
2.2 推荐的最小权限策略
原文档给出的策略可直接作为 JSON 粘贴到 IAM:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "athena:GetTableMetadata", "athena:ListDatabases", "athena:ListTableMetadata", "athena:GetQueryExecution", "athena:StartQueryExecution", "athena:GetQueryResults", "glue:GetDatabases", "glue:GetTables", "glue:GetTable", "lakeformation:GetDataAccess" ], "Resource": [ "*" ] } ] }提示:如果你除了 Glue 之外还使用外部服务(如 S3 Tables、Federated Query 指向的外部数据源)并遇到权限问题,请把相应操作补充进上述 Action 列表。
2.3 权限不足时的表现(源码视角)
从 connection.py 的ATHENA_ERRORS诊断包可以看到,权限问题在测试连接阶段就会被精准识别:
AccessDeniedException/AccessDenied或错误信息包含 "not authorized" → 诊断为Not authorized,修复建议即为授予athena:*与glue:*相关权限;- 错误信息包含
workgroup与is not found→ 诊断为Workgroup not found,提示核对工作组的账户与地域; - 错误信息包含
output location→Query result location not configured,要求设置可写的s3StagingDir或在工作组上配置查询结果位置; - 错误信息包含
unable to verify/create output bucket→Query result bucket not usable,检查桶是否存在以及s3:ListBucket、s3:GetBucketLocation权限; - 错误信息包含
writing to location→Cannot write query results,需要s3:PutObject权限,加密桶则需工作组启用服务端加密。
另外,AthenaChecks.get_tables的实现还揭示了一个隐蔽坑:AWS Lake Formation 在主体缺少授权时会静默返回空表列表(而非报错)。因此测试连接时若出现 "no readable tables" 提示,应检查 Lake Formation 的 DESCRIBE/SELECT 授权,而不是误判为目录为空。
三、Connection Details 全字段解析
连接器在 UI 表单中暴露了以下字段(对应AthenaConnection模型),按功能可分为认证相关、会话相关、查询相关、层次结构相关、过滤相关五组。
3.1 连接驱动:Scheme
驱动类型,选择连接到 Athena 的驱动。默认值为awsathena+rest(PyAthena),底层对应 connection.py 中_get_connection_url的 URL scheme 前缀。
3.2 AWS 静态凭证
AWS Access Key ID:AWS 安全凭证的第一部分(示例:AKIAIOSFODNN7EXAMPLE)。访问密钥由两部分组成:访问密钥 ID 与秘密访问密钥,两者必须同时使用才能完成请求认证。可在 AWS IAM 控制台的 Security Credentials 中管理。
AWS Secret Access Key:凭证的第二部分(示例:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY)。
AWS Region:AWS 在每个地理区域部署独立的服务实例,连接器必须知道目标服务所在的区域。值得注意的是,Region 是连接配置中唯一必填的 AWS 参数——其余 AWS 配置(凭证来源等)在编程访问时可以通过 boto3 的标准凭证链自动解析。
AWS Session Token:使用临时凭证访问服务时,除 Access Key ID 与 Secret Access Key 外还必须提供 Session Token。
3.3 会话与角色
Endpoint URL:AWS SDK 与 CLI 默认使用各服务在当前区域的默认端点,但当需要指向替代端点(如 VPC Endpoint、兼容 AWS API 的自建服务)时可在此指定。
Profile Name:AWS CLI 的命名配置文件(named profile),保存了一组可复用的设置与凭证。配置了多个 profile 时,可在此指定使用default之外的 profile。
Assume Role ARN:用于同账号或跨账号的AssumeRole场景。在此填写目标账号角色的 ARN;跨账号访问时,目标账号管理员必须为调用方附加允许对该 ARN 执行AssumeRole的策略。只有当你确实要使用 AssumeRole 时,此字段才是必填的。
从源码看,当配置了assumeRoleArn时,连接策略会切换为AthenaAssumeRoleStrategy(connection.py):
- 通过
AWSClient.create_session()创建可自动刷新凭证的 Boto3 会话; - 若此时又在
connectionArguments中手写了session参数,会直接抛出ValueError提示冲突; - 会话凭证来自 STS 的 AssumeRole 结果,而非静态密钥。
Assume Role Session Name:被假定角色会话的标识符,用于区分同一角色被不同主体或出于不同原因被假定时的会话。默认值为OpenMetadataSession。
Assume Role Source Identity:调用AssumeRole操作的主体指定的源身份(Source Identity),可借助它在 CloudTrail 日志中追踪是谁通过该角色执行了操作。
3.4 查询执行相关
S3Staging Dir:Athena 会自动把每次查询的结果与元数据信息保存到 S3 的查询结果位置。首次使用时可通过 Athena 控制台指定查询结果位置;此目录必须可写(参考 2.3 节的诊断信息)。在 示例工作流 中写作:
s3StagingDir: https://s3-directory-for-datasource.com该值会经quote_plus编码后拼入 JDBC URL 的s3_staging_dir参数(见_get_connection_url)。
Workgroup:Athena 工作组用于隔离用户、团队、应用或工作负载。在此选择摄取流程应使用的工作组。配置后,JDBC URL 会附加&work_group=<name>参数。工作组也承担查询结果位置、加密与权限的集中管理,因此当s3StagingDir未配置时,工作组上配置的查询结果位置会被 Athena 作为兜底。
Catalog ID:Athena 的 Catalog 标识,在以下场景必须显式配置:
- S3 Tables:格式为
s3tablescatalog/<bucket-name>(例如s3tablescatalog/my-table-bucket); - 跨账号 Catalog:填写拥有 Glue Data Catalog 的 AWS 账号 ID。
不填写时默认使用调用方自身的 AWS 账号。从 metadata.py 的prepare()与query_table_names_and_types()可见,catalogId会以CatalogId参数传给 Glue 分页器;在连接层它被编码为 JDBC URL 的catalog_name参数。
3.5 层次结构与数据湖定位
Database Name:OpenMetadata 的数据库服务层次为Database Service > Database > Schema > Table。Athena 本身没有传统意义上的 Database 概念,若希望数据挂在名为default之外的数据库下,可在此指定名称。示例配置中为databaseName: database_name。
Bucket Name:数据湖中用于组织、存储数据对象的唯一标识,类似"对象存储版的文件夹名"。
Prefix:数据路径的首段,用于在容器内组织、归类数据,帮助用户快速定位数据对象。
3.6 连接定制
Connection Options:附加的连接选项,用于构建发送给服务的连接 URL。
Connection Arguments:附加的连接参数(如安全或协议配置),会直接传给底层驱动。注意:当启用 AssumeRole 时,不得在此定义session键(源码会校验并抛错)。
3.7 过滤模式(Filter Pattern)
| 字段 | 说明 |
|---|---|
| Default Database Filter Pattern | 正则表达式,仅包含/排除匹配的数据库 |
| Default Schema Filter Pattern | 正则表达式,仅包含/排除匹配的 Schema |
| Default Table Filter Pattern | 正则表达式,仅包含/排除匹配的表 |
这些过滤器在摄取层(filter_by_schema等工具函数)与测试连接层(AthenaChecks会按schemaFilterPattern计算目标 Schema 列表)同时生效。测试连接时最多探测 100 个 Schema(MAX_SCHEMAS_TO_PROBE),以避免大 Catalog 拖垮测试连接超时。
四、实战:三种工作流 YAML 配置
4.1 元数据摄取
基于仓库内的 athena.yaml(认证字段请替换为真实值):
source: type: athena serviceName: local_athena serviceConnection: config: type: Athena databaseName: database_name awsConfig: awsAccessKeyId: access key id awsSecretAccessKey: access secret key awsRegion: us-east-1 s3StagingDir: https://s3-directory-for-datasource.com workgroup: workgroup name sourceConfig: config: type: DatabaseMetadata sink: type: metadata-rest config: {} workflowConfig: loggerLevel: INFO # DEBUG, INFO, WARN or ERROR openMetadataServerConfig: hostPort: http://localhost:8585/api authProvider: openmetadata securityConfig: jwtToken: "<JWT_TOKEN>"仓库还提供了 athena_lineage.yaml(血缘)与 athena_usage.yaml(Usage)两份参考配置,可在ingestion/src/metadata/examples/workflows/目录下查看完整内容。
4.2 摄取流程中的核心逻辑(源码级)
- 表类型识别:
query_table_names_and_types()优先走 Glue API(带分页),根据表参数中的table_type == "ICEBERG"判定为 Iceberg 表,否则标记为 External 表(见 metadata.py);Glue 不可用时回退到 JDBC inspector 的表名列表。 - Schema 描述:
prepare()阶段通过 Glueget_databases分页拉取数据库描述,存入schema_description_map,供get_schema_description()使用——因此 Athena 下 Schema 的描述直接来自 Glue Data Catalog。 - 分区信息:
get_table_partition_details()读取分区列,并按列类型映射分区区间类型(ATHENA_INTERVAL_TYPE_MAP):字符串/枚举映射为COLUMN_VALUE,整型映射为INTEGER_RANGE,日期/时间戳映射为TIME_UNIT。 - 表位置:
get_table_description()在读取表注释的同时,从表选项(awsathena_location)提取外部位置,供外部表血缘(ExternalTableLineageMixin)使用。 - Lake Formation 标签:
yield_tag()与yield_table_tags()通过AthenaLakeFormationClient拉取库级、表级与列级 LF 标签,转换为 OpenMetadata 的标签与分类实体。 - Iceberg 自定义属性:当启用
includeCustomProperties时,通过查询 Athena 的<table>$properties元表读取 Iceberg 原生属性,并注册为表实体上的字符串型自定义属性;非法字符会被替换为__,超长键名回退为 MD5 摘要。
4.3 Usage 与血缘摄取
Usage:AthenaUsageSource(usage.py)从 Athena 查询执行记录中提取成功状态(SUCCEEDED)的查询,记录提交/完成时间、执行时长、是否被取消(CANCELLED),并过滤掉 dbt 与 OpenMetadata 自身产生的查询,最终写入TableQueries实体,供 OpenMetadata 的 Usage 与数据洞察分析使用。
血缘:AthenaLineageSource(lineage.py)结合查询解析器(AthenaQueryParserSource,见 query_parser.py)从 SQL 中提取表级血缘,并借助ExternalTableLineageMixin补齐外部表(S3 位置)的血缘信息。
4.4 测试连接(Test Connection)
测试连接由 connection.py 中的AthenaChecks驱动,依次执行:
- CheckAccess:执行
SELECT 1,验证 JDBC 连接与 AWS 凭证有效性(走 HTTPS over botocore,而非 TCP 探测); - GetSchemas:列出 Schema(对应
athena:ListDatabases); - GetTables:探测目标 Schema 中表的可读性(对应
athena:ListTableMetadata),空列表会给出 Lake Formation 授权相关的非阻塞提示; - GetViews:探测视图可见性,非必检项,视图缺失不视为失败。
该设计让权限、工作组、查询结果位置等问题在正式摄取前即可暴露,并给出可执行的修复建议。
五、常见问题与排障速查
| 现象 | 可能原因 | 处置 |
|---|---|---|
| 测试连接报 "Not authorized" | IAM 缺少 Athena/Glue 权限 | 按 2.2 节策略授予权限 |
| "Workgroup not found" | 工作组不存在或区域不匹配 | 核对工作组名称、账号与awsRegion |
| "Query result location not configured" | 未配置s3StagingDir,工作组也无查询结果位置 | 设置可写 S3 路径或在工作组配置结果位置 |
| "Query result bucket not usable" | 桶不存在或缺少s3:ListBucket/s3:GetBucketLocation | 核对桶与区域,补权限 |
| "Cannot write query results" | 缺少s3:PutObject或加密策略不匹配 | 授予写权限,或让工作组启用服务端加密 |
| 摄取 0 张表且无报错 | Lake Formation 未授权(静默返回空列表) | 授予 Lake Formation DESCRIBE/SELECT 权限 |
| 跨账号/S3 Tables 元数据为空 | 未配置catalogId | 按 3.4 节设置s3tablescatalog/<bucket>或账号 ID |
| AssumeRole 配置后连接失败 | connectionArguments中冲突定义了session | 移除session键,由连接器自动管理会话 |
六、延伸阅读
- 连接器 UI 文案与字段说明原稿:Athena.md
- Athena 连接器源码:连接构建与测试连接见 connection.py,元数据摄取见 metadata.py,Usage 见 usage.py
- 工作流示例:athena.yaml、athena_lineage.yaml、athena_usage.yaml
- 单元测试与拓扑测试:test_connection.py、test_athena.py
掌握上述权限模型与字段语义后,你可以在 UI 中快速创建一个 Athena 数据服务,或直接套用 YAML 工作流启动元数据、血缘与 Usage 三条管道,让 Athena 之上的数据资产在 OpenMetadata 中"活"起来。
【免费下载链接】OpenMetadataThe Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMetadata
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考