簡體   English   中英

API 網關 - 如何在不同的 terraform 部署中拆分嵌套的 REST 資源

[英]API gateway - how to split nested REST resources across different terraform deployments

我正在 AWS 中制作 HTTP API。 我的大部分邏輯都是在 lambda 函數中處理的。 我使用 terraform 來描述和部署我的基礎設施。 到目前為止,一切進展順利。

我有一個項目有用於 CRUD 操作的 lambda

GET /journal
POST /journal
GET /journal/{id}
PUT /journal/{id}
DELETE /journal/{id}

代碼和基礎設施目前都在一個 monorepo 中。

現在是時候為嵌套資源添加端點了

例如...

/journals/{id}/sentence/{id} 

/journals/{id}/sentence/{id}/correction

我真的希望將這些子資源的代碼和 terraform 放在一個單獨的項目中,因為它會變得非常非常大。

我真的很難弄清楚如何為存在於多個單獨部署的項目中的 API 網關制作子資源。

我想避免導出 api-gateway 資源的 ARN 並在其他項目中使用它們,因為我認為在單獨的部署之間創建依賴關系不是一個好主意。

我真的很感激聽到任何關於如何管理的建議,因為我相信很多人都遇到過這個問題。

是否可以使用 route53 將域上的所有 API 調用路由到許多單獨的 API 網關? 如果這是可能的,那么這會讓生活變得更輕松。 除了創建具有單一資源端點的 API 之外,我真的很難找到能夠解釋任何內容的文檔或文獻。

編輯:我有另一個想法,也許我所有的 lambda 項目都可以完全不知道 api 網關,只是將它們的 ARN 作為輸出導出。 然后我可以有一個完全獨立的項目,它定義了整個 api 網關並創建了 lambda 集成,它只使用其他項目中 function 導出的 function ARN。 這將防止每個 lambda 項目需要引用相應父資源的 api_gateway_resource。 我覺得這可能不是一個好主意。

我想避免導出 api-gateway 資源的 ARN 並在其他項目中使用它們,因為我認為在單獨的部署之間創建依賴關系不是一個好主意。

我不確定該聲明。 獨立於您 go 的方式,無論如何您將在創建 API GW 的項目和 lambda 子項目之間具有依賴關系。

到目前為止,我理解的問題是您應該在哪個方向上創建這種依賴關系:

  • 導出 apiw 並在 lambda 項目中重復使用
  • 導出 lambda 並在 apigw 項目中重復使用

我認為將 lambda 視為您的 terraform 項目中獨立的基礎設施部分並且不在其中創建任何類型的 apigw 相關資源是有意義的。 首先,因為在這種情況下,它已經對您的 lambda 的使用產生了強烈的隱式依賴和約束。其次,您可以這樣想:如果您的項目越來越大,您需要向您的項目中添加越來越多的 lambda 怎么辦? API。在這種情況下,您可能不想每次都創建新的方法/資源,使用 terraform 中的for_each之類的東西並一次性編寫代碼並在添加新的 lambda 時自動創建新的集成可能更方便。

因此,我會避免第一個選擇和 go 作為第二個選項,從架構的角度來看,它更清晰。 處理 API GW 的所有內容都保留在同一個項目中。 您的編輯指出了正確的方向。 您可以為“基礎架構”(隨意稱呼)和一個“Lambda”存儲庫。 您可以將 output lambda ARN 作為列表(或帶有其他關鍵參數的自定義 map)並使用 apigw 項目中的遠程 state 循環遍歷您的 lambda 並使用 for_each 在一個位置創建所需的資源。

例如,使用 apigw 項目中的遠程 state:

data "terraform_remote_state" "lambda" {
  backend = "s3"
  config = {
    bucket = "my-bucket"
    key    = "my/key/state/for/lambda"
    region = "region"
  }
}

並使用這樣的輸出:

resource "aws_api_gateway_integration" "lambda" {
  for_each = data.terraform_remote_state.lambda.outputs.lambdas
  ...
  uri = each.value
}

是否可以使用 route53 將域上的所有 API 調用路由到許多單獨的 API 網關? 如果這是可能的,那么這會讓生活變得更輕松。 .

抱歉,我不確定是否理解這一點,但我仍會嘗試詳細說明該主題。 “鏈接”API 網關讓您可以調用您的 api 只是一個 DNS。當您創建一個 API 時,AWS 在幕后會在 us-east-1 區域為您創建一個 CloudFront 分配。 您無權通過控制台訪問它,因為它由 AWS 管理。 當您將 map 和 API 指向一個域名時,您實際上將 map 域指向了您的 API 的 CloudFront 分配。當您向 API 添加方法或資源時(這就是您對 lambda 所做的),您實際上並沒有創建新的每次API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM