Amazon web services &引用;id为X的堆栈不存在“;成功删除sls后的所有sls命令

Amazon web services &引用;id为X的堆栈不存在“;成功删除sls后的所有sls命令,amazon-web-services,amazon-cloudformation,serverless-framework,Amazon Web Services,Amazon Cloudformation,Serverless Framework,成功后sls removeallsls命令失败 id为X的堆栈不存在 检查是否已删除堆栈、其他堆栈和S3部署桶。尝试删除.serverless/,但没有任何帮助。结果发现,在我的serverless.yml中,有问题的部分是${cf:${self:service}-${self:provider.stage}.ServiceEndpoint}。显然,${cf:…}如果主堆栈不存在(即您尚未部署),serverless.yml中的东西(或至少在特定情况下)将失败 我无法确定这是sls错误还是我应该

成功后
sls remove
all
sls
命令失败

id为X的堆栈不存在


检查是否已删除堆栈、其他堆栈和S3部署桶。尝试删除
.serverless/
,但没有任何帮助。

结果发现,在我的
serverless.yml
中,有问题的部分是
${cf:${self:service}-${self:provider.stage}.ServiceEndpoint}
。显然,
${cf:…}
如果主堆栈不存在(即您尚未部署),serverless.yml中的东西(或至少在特定情况下)将失败


我无法确定这是sls错误还是我应该知道得更清楚。

问题是
${cf:…}
语法需要现有CloudFormation堆栈的输出,当您尚未部署项目时,该堆栈及其输出还不存在

如果您需要从“当前”堆栈内部访问该输出,您应该了解Serverless是如何定义该输出的(此示例来自我的一个项目):

您可以使用相同的语法在需要的地方在自己的堆栈中“生成”该值,将动态部分替换为无服务器变量,如
${self:provider.region}
${self:provider.stage}
,或者项目选择使用的任何变量。例如,要将其添加到Lambda环境中,请执行以下操作:

provider:
  environment:
    SERVICE_ENDPOINT: {"Fn::Join":["", [
      "https://",
      {"Ref":"ApiGatewayRestApi"},
      ".execute-api.${self:provider.region}.",
      {"Ref":"AWS::URLSuffix"},
      "/${self:provider.stage}"]]}

在我的例子中,我手动删除了cloudformation堆栈,并运行了
slsdeploy-s--force
,它成功了

provider:
  environment:
    SERVICE_ENDPOINT: {"Fn::Join":["", [
      "https://",
      {"Ref":"ApiGatewayRestApi"},
      ".execute-api.${self:provider.region}.",
      {"Ref":"AWS::URLSuffix"},
      "/${self:provider.stage}"]]}