使用Athena V2引擎的联合查询Federated Query从RDS中检索数据

一、背景

Athena在2021年5月正式升级到V2引擎(含中国区),新增特性之一是通过联合查询 Federated Query 特性从RDS、DynamoDB等AWS服务中检索数据。本文描述如何使用配置并启用联合查询。

二、RDS数据库配置

RDS数据库需要为使用的安全组增加一条配置。首先查询RDS使用的安全规则组的名称和ID,将ID复制下来。然后增加一条规则如下:

  • 入栈协议:所有TCP
  • 端口范围:0~65535
  • 源地址:本安全规则ID
  • 备注:任意填写

安全规则组填写如下截图。

image-20210607221823369

此外,还需要RDS如下信息:

  • 访问RDS的Endpoint和端口
  • RDS所在的VPC子网ID(如果多个,请提供多个)
  • RDS所使用的安全规则组ID
  • RDS的用户名和密码

后续配置中将需要这些参数。

三、从SAM中部署Lambda Application应用

1、部署Lambda

进入Athena界面,点击页面上方标签Data sources,点击下方Connect data source按钮。如下截图。

image-20210607213258279

点击Connect后进入向导,选择Query a darta source,从下方的的数据源中选择MySQL,然后点击右下角的Next下一步继续。如下截图。

image-20210607213321803

在向导第二步骤,点击Lambda Function下方的Configure new Amazon Lambda function按钮,将打开新页面。

image-20210607213426716

在页面跳转到Lambda的Serverless Application Repository,页面跳转到AthenaJdbcConnector中。如下截图。

image-20210607213556219

将页面向下滚动,找到右下角的参数配置对话框,并添加参数。如下截图。

image-20210607214021815

有关参数填写如下:

  • 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按钮。如下截图。image-20210607215325370

点击Deploy后,等待几分钟可以从Deployments标签页下看到绿色的部署完成。如下截图。image-20210607215951386

注意:在以上配置中,数据库的用户名和密码被直接写入Lambda环境变量中。如果是生产环境,可以通过Secrect Manager服务对密码进行保护,而无需明文写入密码。

2、设置Lambda环境变量

进入Lambda控制台中,点击左侧菜单的函数,从中找到刚才新建的函数mysql。如下截图。image-20210607220358291

点击页面左下方的环境变量Environment variables,点击右侧的Edit按钮。如下截图。image-20210607220503343

在编辑页面,Key位置输入mysql_connection_string,在右侧的Value部分,输入与第一项default相同的的值。然后点击右下角的Save按钮。如下截图。image-20210607220724511

Lambda设置完成。

四、使用Athena查询

1、Athena Data Source配置

进入上一步Athena界面的向导,点击Lambda function右侧的刷新按钮,从下拉框中找到刚才配置的函数mysql。在Catalog name位置填写数据库名称abc,下一步查询时候将使用lambda:mysql表示查询这个库。描述部分可选输入,最后点击右下角Connect按钮。如下截图。image-20210607221339781

添加数据源完成。如下截图。image-20210607221401848

数据源配置完成。

2、通过Athena查询

点击Athena左上角第一个标签页Query editor,进入查询界面。在左侧Data source下拉框中,选择mysql数据库。从Database下拉框中选择RDS MySQL上的数据库mysql(注意这里必须要填写为和lambda一样的名字),页面左下方即可加载出来数据库中的表。如下截图。image-20210607221456135

输入查询语句:

SELECT * FROM "mysql"."abc"."athena_fed_query" limit 10;

如果不是在查询当前库,则可以在库名前加 lambda: 表示查询特定库。

SELECT * FROM "lambda:mysql"."abc"."athena_fed_query" limit 10;

即可通过Athena查询到MySQL数据库中的内容。如下截图。image-20210607221635035

至此操作完成。

五、参考资料

参考文档:

https://aws.amazon.com/blogs/big-data/extracting-and-joining-data-from-multiple-data-sources-with-athena-federated-query/?sc_channel=EL&sc_campaign=Demo_Deep_Dive_2020_vid&sc_medium=YouTube&sc_content=Video8490&sc_detail=ANALYTICS&sc_country=US

配置视频:

https://www.youtube.com/watch?v=HyM5d0TmwAQ