Amazon web services Go AWS Lambda返回[]*bytes.Buffer作为空对象的片[{}]
我正在开发一个step函数,它处理一些文件,将它们上传到S3(Lambda),并将处理过的文件传递给另一个Lambda(Lambda B),后者将处理这些数据,并执行其他不相关的操作 从lambda中,我返回一个具有字符串字段和[]*bytes.Buffer的结构。问题是当Lambda完成时,缓冲区数组总是空的。我在代码的某些部分添加了一些fmt.Println命令,我意识到logic.go实现方法正确地填充了这个数组 如何将文件内容作为缓冲区的一部分返回 我尝试了很多不同的方法试图弄清楚发生了什么,但我认为这是lambda处理器的问题 逻辑。开始Amazon web services Go AWS Lambda返回[]*bytes.Buffer作为空对象的片[{}],amazon-web-services,go,aws-lambda,Amazon Web Services,Go,Aws Lambda,我正在开发一个step函数,它处理一些文件,将它们上传到S3(Lambda),并将处理过的文件传递给另一个Lambda(Lambda B),后者将处理这些数据,并执行其他不相关的操作 从lambda中,我返回一个具有字符串字段和[]*bytes.Buffer的结构。问题是当Lambda完成时,缓冲区数组总是空的。我在代码的某些部分添加了一些fmt.Println命令,我意识到logic.go实现方法正确地填充了这个数组 如何将文件内容作为缓冲区的一部分返回 我尝试了很多不同的方法试图弄清楚发生了
func (srv transferFileService) TransferFiles() ([]*bytes.Buffer, error) {
bufferArray := []*bytes.Buffer{}
dir, err := srv.sftpService.CurrentDirectory()
if err != nil {
srv.lgr.Fatal("error get CurrentDirectory", err)
return nil, err
}
files, err := srv.sftpService.ReadDir(dir)
if err != nil {
srv.lgr.Fatal("error ReadDir ", err)
return nil, err
}
defer srv.sftpService.Close()
for _, f := range files {
if f.IsDir() == true {
continue
}
srcFile, err := srv.sftpService.Open(f.Name())
if err != nil {
log.Fatal("error client open")
srv.lgr.Error("error client open", err)
return nil, err
}
defer srcFile.Close()
bytesReaded, err := ioutil.ReadAll(srcFile)
bytesBuffer := bytes.NewBuffer(bytesReaded)
if err != nil {
fmt.Println("error Copy", err)
return nil, err
}
_, err = srv.s3manager.PutObject(srv.bucketName, f.Name(), srcFile)
if err != nil {
fmt.Println("error put object S3", err)
return nil, err
}
bufferArray = append(bufferArray, bytesBuffer)
}
fmt.Println("bufferArray", bufferArray)
return bufferArray, nil
}
//Handler aws handler method
func (hs handlerService) Handler() (*model.Response, error) {
bytesReaded, err := hs.transferFileSrv.TransferFiles()
if err != nil {
return nil, err
}
return &model.Response{
Files: bytesReaded,
Title: "aaa",
}, nil
}
package model
import "bytes"
type Response struct {
Files []*bytes.Buffer
Title string
}
handler.go
func (srv transferFileService) TransferFiles() ([]*bytes.Buffer, error) {
bufferArray := []*bytes.Buffer{}
dir, err := srv.sftpService.CurrentDirectory()
if err != nil {
srv.lgr.Fatal("error get CurrentDirectory", err)
return nil, err
}
files, err := srv.sftpService.ReadDir(dir)
if err != nil {
srv.lgr.Fatal("error ReadDir ", err)
return nil, err
}
defer srv.sftpService.Close()
for _, f := range files {
if f.IsDir() == true {
continue
}
srcFile, err := srv.sftpService.Open(f.Name())
if err != nil {
log.Fatal("error client open")
srv.lgr.Error("error client open", err)
return nil, err
}
defer srcFile.Close()
bytesReaded, err := ioutil.ReadAll(srcFile)
bytesBuffer := bytes.NewBuffer(bytesReaded)
if err != nil {
fmt.Println("error Copy", err)
return nil, err
}
_, err = srv.s3manager.PutObject(srv.bucketName, f.Name(), srcFile)
if err != nil {
fmt.Println("error put object S3", err)
return nil, err
}
bufferArray = append(bufferArray, bytesBuffer)
}
fmt.Println("bufferArray", bufferArray)
return bufferArray, nil
}
//Handler aws handler method
func (hs handlerService) Handler() (*model.Response, error) {
bytesReaded, err := hs.transferFileSrv.TransferFiles()
if err != nil {
return nil, err
}
return &model.Response{
Files: bytesReaded,
Title: "aaa",
}, nil
}
package model
import "bytes"
type Response struct {
Files []*bytes.Buffer
Title string
}
型号。开始
func (srv transferFileService) TransferFiles() ([]*bytes.Buffer, error) {
bufferArray := []*bytes.Buffer{}
dir, err := srv.sftpService.CurrentDirectory()
if err != nil {
srv.lgr.Fatal("error get CurrentDirectory", err)
return nil, err
}
files, err := srv.sftpService.ReadDir(dir)
if err != nil {
srv.lgr.Fatal("error ReadDir ", err)
return nil, err
}
defer srv.sftpService.Close()
for _, f := range files {
if f.IsDir() == true {
continue
}
srcFile, err := srv.sftpService.Open(f.Name())
if err != nil {
log.Fatal("error client open")
srv.lgr.Error("error client open", err)
return nil, err
}
defer srcFile.Close()
bytesReaded, err := ioutil.ReadAll(srcFile)
bytesBuffer := bytes.NewBuffer(bytesReaded)
if err != nil {
fmt.Println("error Copy", err)
return nil, err
}
_, err = srv.s3manager.PutObject(srv.bucketName, f.Name(), srcFile)
if err != nil {
fmt.Println("error put object S3", err)
return nil, err
}
bufferArray = append(bufferArray, bytesBuffer)
}
fmt.Println("bufferArray", bufferArray)
return bufferArray, nil
}
//Handler aws handler method
func (hs handlerService) Handler() (*model.Response, error) {
bytesReaded, err := hs.transferFileSrv.TransferFiles()
if err != nil {
return nil, err
}
return &model.Response{
Files: bytesReaded,
Title: "aaa",
}, nil
}
package model
import "bytes"
type Response struct {
Files []*bytes.Buffer
Title string
}
当我的logic.go方法完成后,将打印数组值。正如您所看到的,当lambda完成并返回值时,数组为空
START RequestId: fb057c9d-a4bf-1d7b-6172-4b541c3adb2c Version: $LATEST
bufferArray [78007840120050671420200505000000001]
END RequestId: fb057c9d-a4bf-1d7b-6172-4b541c3adb2c
REPORT RequestId: fb057c9d-a4bf-1d7b-6172-4b541c3adb2c Init Duration: 7567.80 ms Duration: 12049.72 ms Billed Duration: 12100 ms Memory Size: 128 MBMax Memory Used: 42 MB
{"Files":[{}],"Title":"aaa"}
我一直在搜索AWS lambda的官方文档。我发现这个链接说调用负载(请求和响应)在异步调用上有256kb的限制。我在这里没有看到任何试图将
字节.Buffer
序列化为json的内容。对于字节。Buffer
,没有json表示,您希望它返回什么?我想在我的step函数中将此缓冲区数组传递给下一个lambda。我认为问题在于调用负载响应。为什么标题字段输出正确,而另一个字段输出不正确?title
是一个字符串,可以封送为json*bytes.Buffer
是一种Go结构,它是有状态的,没有导出字段,封送到json没有任何意义。Files
字段被输出,并且有一个值,恰好是一个空对象。谢谢您的回答。我想这是对我问题的回应,我做了一个变通办法,将s3密钥作为数组返回,下一个lambda负责从s3获取文件并处理itI,我一直在AWS lambda官方文档中搜索。我发现这个链接说调用负载(请求和响应)在异步调用上有256kb的限制。我在这里没有看到任何试图将字节.Buffer
序列化为json的内容。对于字节。Buffer
,没有json表示,您希望它返回什么?我想在我的step函数中将此缓冲区数组传递给下一个lambda。我认为问题在于调用负载响应。为什么标题字段输出正确,而另一个字段输出不正确?title
是一个字符串,可以封送为json*bytes.Buffer
是一种Go结构,它是有状态的,没有导出字段,封送到json没有任何意义。Files
字段被输出,并且有一个值,恰好是一个空对象。谢谢您的回答。我想这是对我的问题的回应,我做了一个变通方法,将s3键作为数组返回,下一个lambda负责从s3获取文件并处理它