一、背景
Athena在2021年5月正式升级到V2引擎(含中国区),新增特性之一是通过联合查询 Federated Query 特性从RDS、DynamoDB等AWS服务中检索数据。本文描述如何使用配置并启用联合查询。
二、RDS数据库配置
RDS数据库需要为使用的安全组增加一条配置。首先查询RDS使用的安全规则组的名称和ID,将ID复制下来。然后增加一条规则如下:
- 入栈协议:所有TCP
- 端口范围:0~65535
- 源地址:本安全规则ID
- 备注:任意填写
安全规则组填写如下截图。
此外,还需要RDS如下信息:
- 访问RDS的Endpoint和端口
- RDS所在的VPC子网ID(如果多个,请提供多个)
- RDS所使用的安全规则组ID
- RDS的用户名和密码
后续配置中将需要这些参数。
三、从SAM中部署Lambda Application应用
1、部署Lambda
进入Athena界面,点击页面上方标签Data sources
,点击下方Connect data source
按钮。如下截图。
点击Connect
后进入向导,选择Query a darta source
,从下方的的数据源中选择MySQL
,然后点击右下角的Next
下一步继续。如下截图。
在向导第二步骤,点击Lambda Function
下方的Configure new Amazon Lambda function
按钮,将打开新页面。
在页面跳转到Lambda的Serverless Application Repository
,页面跳转到AthenaJdbcConnector
中。如下截图。
将页面向下滚动,找到右下角的参数配置对话框,并添加参数。如下截图。
有关参数填写如下:
- Application name:保持默认
AthenaJdbcConnector
- SecretNamePrefix:填写为
jdbc-*
- SpillBucket:填写用于存储查询大量数据的S3 Bucket(请事先创建好)
- DefaultConnectionString:JDBC连接字符串,请填写为
mysql://jdbc:mysql://database-1.cfvonviibzua.rds.cn-north-1.amazonaws.com.cn:3306/abc?user=admin&password=1qazxsw2
。其中开头的mysql、jdbc、mysql都是默认填写,endpoint请替换为实际环境,用户名在AWS的RDS上默认为admin,密码请替换为对应密码 - DisableSpillEncryption:默认为
False
- LambdaFunctionName:填写为
mysql
- LambdaMemory:默认为
3008
MB - LambdaTimeout:默认为
900
秒 - SecurityGroupIds:默认填写为MySQL
- SpillPrefix:保持默认
athena-spill
- SubnetIds:填写为可以访问VPC的子网ID,填写多个子网时候,中间用逗号隔开。
最后选中下方的I acknowledge that this app creates custom IAM roles.
的对话框,然后点击右下角的Deploy
按钮。如下截图。
点击Deploy
后,等待几分钟可以从Deployments
标签页下看到绿色的部署完成。如下截图。
注意:在以上配置中,数据库的用户名和密码被直接写入Lambda环境变量中。如果是生产环境,可以通过Secrect Manager服务对密码进行保护,而无需明文写入密码。
2、设置Lambda环境变量
进入Lambda控制台中,点击左侧菜单的函数,从中找到刚才新建的函数mysql
。如下截图。
点击页面左下方的环境变量Environment variables
,点击右侧的Edit
按钮。如下截图。
在编辑页面,Key
位置输入mysql_connection_string
,在右侧的Value
部分,输入与第一项default相同的的值。然后点击右下角的Save
按钮。如下截图。
Lambda设置完成。
四、使用Athena查询
1、Athena Data Source配置
进入上一步Athena界面的向导,点击Lambda function
右侧的刷新按钮,从下拉框中找到刚才配置的函数mysql
。在Catalog name
位置填写数据库名称abc
,下一步查询时候将使用lambda:mysql
表示查询这个库。描述部分可选输入,最后点击右下角Connect
按钮。如下截图。
添加数据源完成。如下截图。
数据源配置完成。
2、通过Athena查询
点击Athena左上角第一个标签页Query editor
,进入查询界面。在左侧Data source
下拉框中,选择mysql
数据库。从Database
下拉框中选择RDS MySQL上的数据库mysql
(注意这里必须要填写为和lambda一样的名字),页面左下方即可加载出来数据库中的表。如下截图。
输入查询语句:
SELECT * FROM "mysql"."abc"."athena_fed_query" limit 10;
如果不是在查询当前库,则可以在库名前加 lambda: 表示查询特定库。
SELECT * FROM "lambda:mysql"."abc"."athena_fed_query" limit 10;
即可通过Athena查询到MySQL数据库中的内容。如下截图。
至此操作完成。