我很难让SelectObjectContent
人返回任何细节.令人沮丧的是,查询在控制台中工作.
我的测试对象是一个存储在测试存储桶中的简单JSON文件:
{
"Name": "Kevin",
"Role": "engineer",
"Color": "blue"
}
我的问题也同样简单:
SELECT * FROM s3object LIMIT 5
下面是我为一个特定用例组装的函数:
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
...如果这些是不正确的,我会得到一个"找不到".
我已经确认我有权访问存储桶,因为我能够使用ListObjectsV2
打印对象列表
我已经确认代码正在读取某些内容,因为如果我指向文件的非GZIP版本,它会抱怨文件没有压缩.
我的Sandbox 存储桶是私有的,并且具有最低存储桶策略:
{
"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