Amazon web services Golang AWS API网关无效字符';e';寻找价值的起点

Amazon web services Golang AWS API网关无效字符';e';寻找价值的起点,amazon-web-services,go,amazon-s3,aws-lambda,aws-api-gateway,Amazon Web Services,Go,Amazon S3,Aws Lambda,Aws Api Gateway,我试图创建一个连接到lambda的API网关,lambda解析带有handlebar的HTML模板,然后返回它,但是当我在本地运行它时,甚至在使用AWS的测试url上运行它时,我遇到了这个错误 { “errorMessage”:“查找值开头的字符“e”无效”, “errorType”:“SyntaxError” } 这是我的山姆模板 AWSTemplateFormatVersion:“2010-09-09” 转换:AWS::Serverless-2016-10-31 描述:数据模板渲染器 参数

我试图创建一个连接到lambda的API网关,lambda解析带有handlebar的HTML模板,然后返回它,但是当我在本地运行它时,甚至在使用AWS的测试url上运行它时,我遇到了这个错误

{
“errorMessage”:“查找值开头的字符“e”无效”,
“errorType”:“SyntaxError”
}
这是我的山姆模板

AWSTemplateFormatVersion:“2010-09-09”
转换:AWS::Serverless-2016-10-31
描述:数据模板渲染器
参数:
阶段:
类型:字符串
允许值:
-发展
-登台
-生产
说明:环境价值观
资源:
#在这里定义API资源意味着我们可以定义阶段名称,而不是
#总是被强制使用staging/prod。这也意味着我们可以使用
#如果需要,请将其发送到此模板中的API网关。不幸的是有副作用
#它创建了一个名为“stage”的stage。这是一个已知的bug,问题可能是
#发现于https://github.com/awslabs/serverless-application-model/issues/191
DataTemplateRendererApi:
类型:AWS::Serverless::Api
特性:
姓名:!子“${Stage}-数据模板呈现程序”
舞台剧:!参考阶段
定义机构:
昂首阔步:“2.0”
基本路径:!子“/${Stage}”
信息:
标题:!子“${Stage}-数据模板呈现程序”
版本:“1.0”
消耗:
-应用程序/json
生产:
-应用程序/json
-文本/纯文本
-申请表格/pdf
路径:
/呈现:
职位:
x-amazon-apigateway-integration:
uri:
“Fn::Sub:“arn:aws:apigateway:${aws::Region}:lambda:path/2015-03-31/functions/${RenderTemplate.arn}/invocations”
httpMethod:POST
类型:aws_代理
x-amazon-apigateway-binary-media-types:
- "*/*"
RenderTemplate:
类型:AWS::Serverless::Function
特性:
环境:
变量:
环境:!参考阶段
运行时:go1.x
CodeUri:构建
处理程序:渲染模板
函数名:!子'render_template-${Stage}'
超时时间:30
跟踪:活动
活动:
RenderTemplateEndpoint:
类型:Api
特性:
RestApiId:!Ref DataTemplateRendererApi
路径:/render
方法:邮寄
政策:
- !参考S3AccessPolicy
-CloudWatchPutMetricPolicy:{}
S3访问策略:
类型:AWS::IAM::ManagedPolicy
特性:
ManagedPolicyName:data-template-renderer-s3-policy
政策文件:
版本:“2012-10-17”
声明:
-效果:允许
操作:s3:GetObject
资源:!子“arn:aws:s3::*”
-效果:允许
操作:s3:PutObject
资源:!子“arn:aws:s3::*”
下面是我用于Lambda的代码。请原谅,这可能不是您见过的最好的Golang代码,但我是Golang的初学者,因为我主要是一名PHP开发人员,但我工作的公司正在创建许多Golang Lambda,所以我开始学习它

主程序包
进口(
“字节”
“上下文”
“编码/base64”
“编码/json”
“fmt”
“字符串”
“时间”
“github.com/aymerick/raymond”
“github.com/aws/aws lambda go/events”
“github.com/aws/aws lambda go/lambda”
“github.com/SebastiaanKlippert/go-wkhtmltoppdf”
“github.com/aws/aws sdk go/aws”
“github.com/aws/aws sdk go/aws/session”
“github.com/aws/aws sdk go/service/s3”
)
var sess*session.session
func init(){
//设置AWS S3会话(构建一次使用每个函数)
sess=session.Must(session.NewSession(&aws.Config{
地区:aws.String(“us-east-1”),
}))
}
func main(){
lambda.Start(HandlerRequest)
}
类型TemplateRenderRequest结构{
模板字符串`json:“模板”`
Bucket字符串`json:“Bucket”`
类型字符串`json:“类型”`
数据映射[字符串]接口{}`json:“数据”`
}
键入EmailResponse结构{
电子邮件字符串`json:“电子邮件”`
}
func HandlerRequest(ctx context.context,请求事件.APIGatewayProxyRequest)(events.APIGatewayProxyResponse,错误){
//将json请求主体解组到模仿json负载的TemplateRenderRequest结构中
requestData:=TemplateRenderRequest{}
err:=json.Unmarshal([]字节(request.Body),&requestData)
如果错误!=零{
return events.APIGatewayProxyResponse{
正文:fmt.Errorf(“错误:%s”,err.Error()).Error(),
状态代码:400,
标题:映射[字符串]字符串{
“内容类型”:“文本/普通”,
},
},呃
}
//从S3获取模板对象
结果,err:=s3.New(sess.GetObject)(&s3.GetObjectInput){
Bucket:aws.String(requestData.Bucket),
关键字:aws.String(requestData.Template),
})
如果错误!=零{
return events.APIGatewayProxyResponse{
正文:fmt.Errorf(“错误:%s”,err.Error()).Error(),
状态代码:400,
标题:映射[字符串]字符串{
“内容类型”:“文本/普通”,
},
},呃
}
延迟结果。Body.Close()
//S3对象主体的类型为io.ReadCloser
//下面我们创建一个字节缓冲区,然后将其转换为字符串,以便以后使用
buf:=新(字节.缓冲区)
buf.ReadFrom(结果体)
templateString:=buf.String()
//通过Handlebar库解析模板
parsedTemplate,err:=parseTemplate(templateString,requestData)
如果错误!=零{
return events.APIGatewayProxyResponse{
正文:fmt.Errorf(“错误:%s”,err.Error()).Error(),
状态代码:400,
标题:映射[字符串]字符串{
“内容类型”:“文本/普通”,
},
},呃
}
开关请求数据类型{
案例
// Unmarshal json request body into a TemplateRendererRequest struct that mimics the json payload
    requestData := TemplateRendererRequest{}
    err := json.Unmarshal([]byte(request.Body), &requestData)
    if err != nil {
        return events.APIGatewayProxyResponse{
            Body: fmt.Errorf("Error: %s ", err.Error()).Error(),
            StatusCode: 400,
            Headers: map[string]string{
                "Content-Type": "text/plain",
            },
        }, err
    }
// Unmarshal json request body into a TemplateRendererRequest struct that mimics the json payload
    requestData := TemplateRendererRequest{}

    b64String, _ := base64.StdEncoding.DecodeString(request.Body)
    rawIn := json.RawMessage(b64String)
    bodyBytes, err := rawIn.MarshalJSON()
    if err != nil {
        return events.APIGatewayProxyResponse{
            Body: fmt.Errorf("Error: %s ", err.Error()).Error(),
            StatusCode: 400,
            Headers: map[string]string{
                "Content-Type": "text/plain",
            },
        }, err
    }

    jsonMarshalErr := json.Unmarshal(bodyBytes, &requestData)
    if jsonMarshalErr != nil {
        return events.APIGatewayProxyResponse{
            Body: fmt.Errorf("Error: %s ", jsonMarshalErr.Error()).Error(),
            StatusCode: 400,
            Headers: map[string]string{
                "Content-Type": "text/plain",
            },
        }, jsonMarshalErr
    }
rawIn := json.RawMessage(b64String)
bodyBytes, err := rawIn.MarshalJSON()
[]byte(b64String)