如何在SAM模板中解决"Transform AWS::Include failed with: The specified S3 object's content should be valid Y



我正试图将OpenApi规范包含到我的AWS::Serverless::ApiDefinitionBody中,如下所示:

MyApi:
Type: "AWS::Serverless::Api"
Properties:
StageName: 'dev'
Domain:
DomainName: 'mydomain.com'
CertificateArn: 'my-arn'
EndpointConfiguration: REGIONAL
Route53:
HostedZoneId: 'HOSTEDZONEID'
BasePath:
- /api
DefinitionBody:
'Fn::Transform':
Name: 'AWS::Include'
Parameters:
Location: !Sub 'open-api.yml'

我使用Fn:Transform来确保我的速记符号得到评估。我在open-api.yml中使用了一些AWS API网关扩展,如下所示:

...
x-amazon-apigateway-integration:
uri: !Sub 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${FunctionName}/invocations'
responses:
default:
statusCode: "200"
passthroughBehavior: "when_no_templates"
httpMethod: "GET"
type: "aws_proxy"

当我运行sam deploy --debug时,我得到以下错误:

转换AWS::Include失败,原因是:指定的S3对象的内容应该是有效的Yaml/JSON

您之所以出现此错误,是因为您在YAML代码段中使用了简写符号。在撰写本文时,不支持通过AWS::Include转换包含的YAML片段的速记符号。

这意味着:

uri: !Sub 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${FunctionName}/invocations'

你必须这样做:

uri:
Fn::Sub:
- 'arn:aws:apigateway:${AWSRegion}:lambda:path/2015-03-31/functions/${FunctionArn}/invocations'
- AWSRegion:
Ref: AWS::Region
AWSAccountId:
Ref: AWS::AccountId
FunctionArn:
Fn::GetAtt: [UserServicesFunction, Arn]

有关更多信息,请参阅AWS::Include transform。

最新更新