目錄
這將是一個兩部分的系列:
Go運行時的上下文
問題
解決方案
秘密?
可以更好嗎?
首頁 後端開發 Golang 使用 AWS SAM 和 Go 建置 API

使用 AWS SAM 和 Go 建置 API

Jan 20, 2025 pm 12:05 PM

Building an API with AWS SAM and Go

AWS SAM是透過基礎架構即程式碼(IAC)部署Web應用程式的絕佳方式。我最近嘗試在我的工作項目中使用它,但遇到了一個嚴峻的現實…

Go是AWS的醜小鴨 ?

AWS SAM文件中專門介紹Go的部分非常簡短且含糊不清,建議大量重複我們的原始碼!每個lambda函數都有一個go.mod、go.sum和實用函數?!

我寫這篇文章是為了像我一樣迷惘的你?‍?。讓我們一起解決這個問題!

這將是一個兩部分的系列:

  1. 文件結構(本文)
  2. SAM配置

Go運行時的上下文

目前,lambda的Go運行時不受支援。這意味著AWS lambda沒有特定選項來指定您的程式碼是用Go編寫的。相反,AWS提供2個通用運行時?:

  • al2(Amazon Linux 2)
  • al2023(Amazon Linux 2023)

這指的是lambda將要運作的作業系統。建議使用al2023,因為它更新,並且與AWS Graviton處理器相容,後者可以以更低的價格提供更好的性能。

無論如何,這些運行時要求我們提供一個可執行檔(通常命名為bootstrap),該檔將在每個lambda函數中執行。 因此,我們不是向lambda交付程式碼,而是交付我們之前用Go編譯的可執行檔。很簡單,對吧?

這也消除了像JS這樣的語言需要使用lambda層的必要性,因為所有常見的依賴項都將打包在已編譯的可執行檔中?。

問題

那麼,我們要如何建立該執行檔呢? AWS建議我們每個lambda都應該儲存在一個資料夾中,以及它的go.mod和go.sum,他們提供的範本如下所示:

<code>.
├── hello-world/
│   ├── go.mod
│   ├── go.sum
│   └── main.go
├── events/
│   └── ...
├── samconfig.toml
└── template.yaml</code>
登入後複製
登入後複製

這是template.yaml中的函數定義

<code>  HelloWorldFunction:
    Type: AWS::Serverless::Function 
    Metadata:
      BuildMethod: go1.x
    Properties:
      CodeUri: hello-world/
      Handler: bootstrap
      Runtime: provided.al2023
      Architectures:
        - x86_64
      Events:
        CatchAll:
          Type: Api
          Properties:
            Path: /hello
            Method: GET</code>
登入後複製
登入後複製

如果我們查看Lambda定義,我們會了解到:

  1. BuildMethod: go1.x 我們使用AWS內建的Go建構器來為我們建立執行檔
  2. CodeUri: hello-world/ lambda程式碼將專門儲存在這個目錄中。
  3. Handler: bootstrap 執行檔的名稱將是bootstrap
  4. Runtime: provided.al2023 這將是運行時。

你看到問題了嗎?目前我們需要第二個lambda,我們必須創建一個帶有自己go.mod、go.sum和依賴項的新目錄,如果我們想在兩個lambda之間共享一個實用函數怎麼辦?太糟糕了?!你必須將相同的檔案複製到新的lambda資料夾中。留下一個看起來像這樣的文件結構:

<code>.
├── function1/
│   ├── go.mod
│   ├── go.sum
│   ├── main.go
│   └── SHAREDFUNC.go
├── function2/
│   ├── go.mod
│   ├── go.sum
│   ├── main.go
│   └── SHAREDFUNC.go
├── events/
│   └── ...
├── samconfig.toml
└── template.yaml</code>
登入後複製

這太糟糕了?! 有很多重複的程式碼! 並且隨著我們添加的lambda越多,它會變得更糟。一定有更好的方法!

解決方案

由於我想透過所有lambda共享go.mod、go.sum和實用程式程式碼,我想出了這個結構:

<code>.
├── hello-world/
│   ├── go.mod
│   ├── go.sum
│   └── main.go
├── events/
│   └── ...
├── samconfig.toml
└── template.yaml</code>
登入後複製
登入後複製
  1. 我將所有公用程式碼分解到internal/資料夾中,
  2. 將go.mod和go.sum檔放在根目錄中
  3. 將所有lambda入口點移到/cmd(在Go中存在這種約定,每當專案產生多個可執行檔時,入口點都放在cmd目錄中)

現在我只需要通知AWS SAM這個新的結構?!我只是透過調整CodeUri和Handler的值找到了解決方案。

秘密?

似乎如果你

  • 將go.mod和go.sum移到根資料夾
  • 將CodeUri設定為函數入口點所在的任何資料夾。

SAM將自動偵測它並使用根依賴項和internal/程式碼進行建構? ? ?

<code>  HelloWorldFunction:
    Type: AWS::Serverless::Function 
    Metadata:
      BuildMethod: go1.x
    Properties:
      CodeUri: hello-world/
      Handler: bootstrap
      Runtime: provided.al2023
      Architectures:
        - x86_64
      Events:
        CatchAll:
          Type: Api
          Properties:
            Path: /hello
            Method: GET</code>
登入後複製
登入後複製

可以更好嗎?

是的✨,我們將在下一篇文章中討論更多自訂Go編譯的方法!

以上是使用 AWS SAM 和 Go 建置 API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1655
14
CakePHP 教程
1414
52
Laravel 教程
1307
25
PHP教程
1253
29
C# 教程
1227
24
Golang的目的:建立高效且可擴展的系統 Golang的目的:建立高效且可擴展的系統 Apr 09, 2025 pm 05:17 PM

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

Golang和C:並發與原始速度 Golang和C:並發與原始速度 Apr 21, 2025 am 12:16 AM

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。

Golang vs. Python:主要差異和相似之處 Golang vs. Python:主要差異和相似之處 Apr 17, 2025 am 12:15 AM

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。Golang以其并发模型和高效性能著称,Python则以简洁语法和丰富库生态系统著称。

Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

表演競賽:Golang vs.C 表演競賽:Golang vs.C Apr 16, 2025 am 12:07 AM

Golang和C 在性能競賽中的表現各有優勢:1)Golang適合高並發和快速開發,2)C 提供更高性能和細粒度控制。選擇應基於項目需求和團隊技術棧。

Golang的影響:速度,效率和簡單性 Golang的影響:速度,效率和簡單性 Apr 14, 2025 am 12:11 AM

goimpactsdevelopmentpositationality throughspeed,效率和模擬性。 1)速度:gocompilesquicklyandrunseff,IdealforlargeProjects.2)效率:效率:ITScomprehenSevestAndardArdardArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增強的Depleflovelmentimency.3)簡單性。

C和Golang:表演至關重要時 C和Golang:表演至關重要時 Apr 13, 2025 am 12:11 AM

C 更適合需要直接控制硬件資源和高性能優化的場景,而Golang更適合需要快速開發和高並發處理的場景。 1.C 的優勢在於其接近硬件的特性和高度的優化能力,適合遊戲開發等高性能需求。 2.Golang的優勢在於其簡潔的語法和天然的並發支持,適合高並發服務開發。

Golang和C:性能的權衡 Golang和C:性能的權衡 Apr 17, 2025 am 12:18 AM

Golang和C 在性能上的差異主要體現在內存管理、編譯優化和運行時效率等方面。 1)Golang的垃圾回收機制方便但可能影響性能,2)C 的手動內存管理和編譯器優化在遞歸計算中表現更為高效。

See all articles