You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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控制台验证:

  1. 切换到对应的工作组如果有自定义工作组的话
  2. 在查询编辑器的数据库下拉框里选择刚创建的mysql_federated_db
  3. 执行SHOW TABLES;,应该能看到MySQL里的表列表
  4. 试查一条数据: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

火山引擎 最新活动