You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:54:04