如何通过AWS CDK使用AthenaJdbcConnector创建连接MySQL数据库的Athena JDBC数据源
用AWS CDK实现Athena MySQL JDBC数据源完整指南
刚好我之前折腾过这个场景,给你梳理下完整的实现步骤——核心是先通过SAM应用部署JDBC Connector Lambda,再把它和Glue数据目录关联,Athena就能通过Glue识别这个Federated数据源了。
1. 用CDK部署Athena JDBC Connector(基于Serverless Repository的SAM应用)
你说的用CfnApplication是对的,直接复用AWS官方的AthenaJdbcConnector应用就行。这里给个TypeScript的CDK代码示例,你可以根据自己常用的语言(比如Python/Java)调整:
import * as cdk from 'aws-cdk-lib'; import { CfnApplication } from 'aws-cdk-lib/aws-sam'; export class AthenaMysqlConnectorStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); // 部署官方的Athena JDBC Connector SAM应用 const mysqlConnector = new CfnApplication(this, 'AthenaMysqlConnector', { location: { // 官方应用的ARN,注意替换成你所在区域的示例为us-east-1 applicationId: 'arn:aws:serverlessrepo:us-east-1:292517598671:applications/AthenaJdbcConnector', semanticVersion: '2024.2.1' // 建议用最新版本,去Serverless Repo查询即可 }, parameters: { ConnectionName: 'mysql-athena-connector', // 自定义连接器名称 // MySQL连接串,强烈建议用Secrets Manager存密码,别明文写 ConnectionString: 'jdbc:mysql://your-mysql-endpoint:3306/your-db-name?user=your-username&password=your-password', LambdaFunctionName: 'AthenaMysqlConnectorFunc', // 自定义Lambda名称 SpillBucket: 'your-spill-bucket-name', // 必须是同区域的S3桶,用于存储查询溢出数据 SpillPrefix: 'athena-spill/', // 如果MySQL在VPC内,配置对应的安全组和子网 SecurityGroupIds: 'sg-xxxxxx', SubnetIds: 'subnet-xxxxxx,subnet-yyyyyy' }, // 必须声明这些权限,因为SAM应用会自动创建IAM角色 capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'] }); } }
⚠️ 重要提示:别把密码明文写在连接串里!可以用Secrets Manager存储MySQL的账号密码,然后在参数里配置SecretArn代替直接写密码,这样更安全合规。
2. 关联Glue数据目录和Connector Lambda
Athena是通过Glue数据目录来管理数据源的,所以我们需要创建一个Glue数据库,把它的位置URI指向刚才部署的Connector Lambda的ARN。这样Athena查询这个Glue库时,就会自动触发Lambda去MySQL拉取数据。
继续在CDK里添加Glue数据库的代码:
import { Database } from 'aws-cdk-lib/aws-glue'; // 创建关联Connector的Glue数据库 const federatedDb = new Database(this, 'MysqlFederatedDb', { databaseName: 'mysql_federated_db', // 自定义数据库名称 // 关键配置:用lambda:ARN的格式指定数据源位置 locationUri: `lambda:${mysqlConnector.getAtt('Outputs.LambdaFunctionArn').toString()}` });
3. 补全权限配置
这里有两个核心权限必须搞定:
- Athena的服务角色必须拥有调用这个Connector Lambda的权限
- Connector Lambda的执行角色必须能访问MySQL、S3溢出桶、CloudWatch Logs如果用了Secrets Manager还要添加对应权限
给Athena角色加权限的示例:
import { Role, ServicePrincipal, PolicyStatement } from 'aws-cdk-lib/aws-iam'; // 假设你已经有Athena的服务角色,替换成你的角色ARN const athenaExecutionRole = Role.fromRoleArn(this, 'AthenaRole', 'arn:aws:iam::123456789012:role/AthenaExecutionRole'); // 给Athena角色添加调用Connector Lambda的权限 athenaExecutionRole.addToPolicy(new PolicyStatement({ actions: ['lambda:InvokeFunction'], resources: [mysqlConnector.getAtt('Outputs.LambdaFunctionArn').toString()] }));
4. 验证连接
部署完CDK栈后,去Athena控制台验证:
- 切换到对应的工作组如果有自定义工作组的话
- 在查询编辑器的数据库下拉框里选择刚创建的
mysql_federated_db - 执行
SHOW TABLES;,应该能看到MySQL里的表列表 - 试查一条数据:
SELECT * FROM mysql_federated_db.your_table LIMIT 10;,如果能正常返回数据就说明配置成功了!
常见坑点提醒
- 如果连接超时:检查Lambda的VPC配置,安全组要允许 outbound 3306端口,子网要能正常访问MySQL端点
- 如果权限报错:先检查Lambda执行角色和Athena角色的权限,尤其是S3读写、Lambda调用、MySQL访问的权限
- Spill Bucket必须和Lambda、Athena在同一个AWS区域,不然会出现跨区域访问报错
内容的提问来源于stack exchange,提问作者CosmicVarion




