CloudFormation堆栈资源依赖问题:API Gateway部署+使用计划

3
我正在处理一个 CloudFormation 模板,以部署 API 网关资源,并且在 Deployment (AWS::ApiGateway::Deployment) 和 UsagePlan 资源方面遇到了问题。这是一种鸡生蛋或蛋生鸡的情况。
在 UsagePlan 中,我指定了 ApiStage 的配置,这意味着我需要先创建 Deployment 资源。但是,当我尝试删除堆栈时,UsagePlan 会失败,因为相应的阶段仍然连接到 UsagePlan。
我对 UsagePlan 进行了 DependsOn 声明(UsagePlan 依赖于 deployment)。这允许堆栈无问题地创建。但由于此 DependsOn 声明,它会强制删除操作中首先删除 UsagePlan。这导致错误。
请参见下面相关的代码摘录。
有人解决了这个问题吗?我不可能是第一个遇到这个问题的人!
谢谢!
"UppRestApiDeployment": {
  "Type": "AWS::ApiGateway::Deployment",
  "Properties": {
    "Description": "Upp Rest API Deployment",
    "RestApiId": {
      "Ref": "UppRestApi"
    },
    "StageName": {
      "Ref": "StackIdentifier"
    },
    "StageDescription": {
      "CacheClusterEnabled": false,
      "CacheClusterSize": "0.5",
      "CacheDataEncrypted": false,
      "CacheTtlInSeconds": 10,
      "CachingEnabled": false,
      "DataTraceEnabled": false,
      "LoggingLevel": "ERROR",
      "MetricsEnabled": true,
      "StageName": {
        "Ref": "StackIdentifier"
      },
      "Description": {
        "Fn::Sub": "${StackIdentifier} Stage"
      },
      "ThrottlingBurstLimit": 2000,
      "ThrottlingRateLimit": 1000,
      "Variables": {
        "lambdaAlias": {
          "Ref": "StackIdentifier"
        }
      }
    }
  }
},
"UppApiUsagePlan": {
  "Type": "AWS::ApiGateway::UsagePlan",
  "Properties": {
    "ApiStages": [
      {
        "ApiId": {
          "Ref": "UppRestApi"
        },
        "Stage": {
          "Ref": "StackIdentifier"
        }
      }
    ],
    "Description": "Upp Rest API Usage Plan to Prevent Overage Charges",
    "Quota": {
      "Limit": 5000,
      "Period": "MONTH"
    },
    "Throttle": {
      "BurstLimit": 200,
      "RateLimit": 100
    },
    "UsagePlanName": {
        "Fn::Sub": "${StackIdentifier}_UppApiUsagePlan"
    }
  },
  "DependsOn": [
    "UppRestApiDeployment"
  ]
}

你有点自相矛盾。如果你包含一个你的部署和使用计划资源的代码片段(如果阶段作为单独的资源创建,则也包括阶段),我相信我们一定能够帮你解决问题。 - lebryant
谢谢您的查看。我添加了脚本的摘录。 - theoneandonly2
1个回答

3

UsagePlan可以在多个API中重复使用。因此,我们建议您为每个API和一个不同的UsagePlans创建不同的CloudFormation堆栈。这样,您可以删除一个API而不删除UsagePlan,也不会遇到依赖问题。


我明白你的意思,但我认为这有点棘手。即使我为使用计划创建不同的模板,我仍需要在具有API部署的堆栈之后创建该堆栈。然后,我需要按相反的顺序删除它们。这使得我无法自动化该过程。一个简单的解决方法是能够在部署中指定UsagePlan,而不是在UsagePlan中指定部署(如果AWS的任何人在听!)。 - theoneandonly2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接