AWS SDK v2 for Go中SelectObjectContent无返回结果求助
S3 SelectObjectContent接口无返回结果,但控制台/CLI可正常执行
我在调用S3的SelectObjectContent接口时无法获取返回结果,但相同的查询在AWS控制台和CLI中都能正常运行,这让我很困惑。
测试对象
测试对象是存储在私有测试桶中的一个简单JSON文件(已GZIP压缩):
{ "Name": "Kevin", "Role": "engineer", "Color": "blue" }
查询语句
使用的查询语句非常简单:
SELECT * FROM s3object LIMIT 5
调用代码
以下是我编写的Go语言调用函数:
func S3SelectObjectContent(bucket, region, objectKey, expression string) (*s3.SelectObjectContentOutput, error) { client := s3.NewFromConfig(Config, func(o *s3.Options) { o.Region = region }) input := &s3.SelectObjectContentInput{ Bucket: &bucket, Key: &objectKey, Expression: &expression, ExpressionType: types.ExpressionTypeSql, InputSerialization: &types.InputSerialization{ JSON: &types.JSONInput{ Type: types.JSONTypeDocument, // Type: types.JSONTypeLines }, CompressionType: types.CompressionTypeGzip, }, OutputSerialization: &types.OutputSerialization{ JSON: &types.JSONOutput{ RecordDelimiter: aws.String("\n"), }, }, } result, err := client.SelectObjectContent(context.TODO(), input) if err != nil { return nil, err } return result, nil }
已排查事项
- 调整过bucket和objectKey参数,参数错误时会返回“not found”提示,说明当前参数正确
- 确认拥有存储桶访问权限,可通过ListObjectsV2接口列出桶内对象
- 确认代码能读取文件内容:指向非GZIP压缩的文件时,会收到“文件未压缩”的提示
- 存储桶为私有桶,配置了最小化策略(如下)
存储桶策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::kkevin-testbucket", "arn:aws:s3:::kkevin-testbucket/*" ], "Condition": { "StringEquals": { "aws:PrincipalAccount": "123456789064" } } } ] }
补充说明
以下CLI命令可以正常运行并生成正确输出:
aws s3api select-object-content \ --bucket kkevin-testbucket \ --key testfile.json.gz \ --expression "select * from s3object limit 5" \ --expression-type 'SQL' \ --input-serialization '{"JSON": {"Type": "Document"}, "CompressionType": "GZIP"}' \ --output-serialization '{"JSON": {}}' "output.json" \ --profile sandbox
内容的提问来源于stack exchange,提问作者Kkevin
相关产品推荐
相关产品推荐

