如何通过AWS SDK实现Amazon Athena仅允许SELECT查询的执行校验
方案1:优先推荐:IAM权限精细化控制(无代码侵入,零额外开发)
这是可靠性最高的实现方式,完全不需要修改业务代码,也无需引入任何额外依赖,直接通过限制调用Athena的IAM身份的权限即可实现:
- 给调用SDK使用的IAM角色/用户仅配置
athena:StartQueryExecution权限,同时添加条件约束仅允许SELECT类语句执行,参考权限策略示例如下:
{ "Effect": "Allow", "Action": "athena:StartQueryExecution", "Resource": "arn:aws:athena:<你的区域>:<你的账号ID>:workgroup/<你的工作组名>", "Condition": { "StringEqualsIgnoreCase": { "athena:QueryText": "SELECT*" } } }
- 该策略会自动忽略SQL开头的空白字符、注释内容,不会被
/*注释*/ INSERT、换行开头的非SELECT语句绕过,是AWS官方原生支持的校验逻辑。
方案2:代码层基于AWS SDK原生能力校验
如果你需要在业务代码中做校验逻辑,无需解析EXPLAIN结果,也不需要引入第三方SQL解析依赖,直接用Athena SDK原生返回的语句类型字段即可实现:
- 第一步:调用
StartQueryExecution提交待执行的原始SQL,获取返回的queryExecutionId - 第二步:立刻调用
GetQueryExecution接口,从返回的QueryExecution对象中调用getStatementType()方法,获取AWS官方识别出的语句类型 - 第三步:判断返回值是否为
SELECT,如果不是则立即调用StopQueryExecution终止查询,返回校验失败;如果是SELECT类型,再继续等待查询执行完成获取结果
注意:该方案存在毫秒级的时间差,极端情况下非SELECT语句可能已经开始执行,建议搭配IAM权限做双层校验规避风险。
方案3:EXPLAIN查询解析方案(不推荐)
如果你坚持使用EXPLAIN方案实现,不需要解析复杂的执行计划,按以下逻辑判断即可:
- 拼接待校验SQL为
EXPLAIN <你的原始SQL>格式后提交查询 - 等待EXPLAIN查询执行完成后,调用
GetQueryResults获取返回的执行计划文本 - 取执行计划的首行内容,判断根节点类型:只有SELECT语句的执行计划根节点为
Output,DROP、INSERT等语句的根节点为DropTable、Insert、CreateTable等其他类型,匹配根节点类型即可完成校验
该方案需要额外发起一次EXPLAIN查询,会增加请求耗时,可靠性不如上述两种方案。
避坑提示
不要自行写正则匹配SQL开头判断是否为SELECT,非常容易被注释、换行、大小写、特殊字符等方式绕过,可靠性极低。
内容的提问来源于stack exchange,提问作者Cloud224
相关产品推荐
相关产品推荐

