AWS SAM ialah cara terbaik untuk menggunakan aplikasi web melalui Infrastruktur sebagai Kod (IAC). Saya baru-baru ini cuba menggunakannya dalam projek kerja saya dan menghadapi realiti yang nyata...
Pergi adalah anak itik hodoh AWS?
Bahagian dokumentasi AWS SAM yang didedikasikan untuk Go adalah sangat pendek dan samar-samar, mengesyorkan mengulang kod sumber kami secara meluas ! Setiap fungsi lambda mempunyai fungsi go.mod, go.sum dan utiliti?!
Saya tulis artikel ini untuk anda yang keliru seperti saya??. Mari kita selesaikan masalah ini bersama-sama!
Pada masa ini, lambda tidak disokong dalam masa jalan Go. Ini bermakna AWS lambda tidak mempunyai pilihan khusus untuk menentukan bahawa kod anda ditulis dalam Go. Sebaliknya, AWS menawarkan 2 masa jalan biasa?:
Ini merujuk kepada sistem pengendalian lambda akan dijalankan. Adalah disyorkan untuk menggunakan al2023 kerana ia lebih baharu dan serasi dengan pemproses AWS Graviton yang menawarkan prestasi yang lebih baik pada harga yang lebih rendah.
Apa pun, masa jalan ini memerlukan kami menyediakan fail boleh laku (biasanya dinamakan bootstrap) yang akan dilaksanakan dalam setiap fungsi lambda. Jadi, daripada menghantar kod kepada lambda, kami menghantar boleh laku yang sebelum ini kami susun dengan Go. Cukup mudah, bukan?
Ini juga menghapuskan keperluan untuk lapisan lambda untuk bahasa seperti JS, kerana semua kebergantungan biasa akan dibungkus dalam boleh laku yang disusun.
Jadi, bagaimana kita membina boleh laku ini? AWS mengesyorkan bahawa setiap lambda kami hendaklah disimpan dalam folder, bersama dengan go.mod dan go.sumnya, dan templat yang mereka sediakan kelihatan seperti ini:
<code>. ├── hello-world/ │ ├── go.mod │ ├── go.sum │ └── main.go ├── events/ │ └── ... ├── samconfig.toml └── template.yaml</code>
Ini ialah definisi fungsi dalam 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>
Jika kita melihat definisi Lambda, kita belajar:
Adakah anda nampak masalahnya? Pada masa ini kita memerlukan lambda kedua, kita perlu mencipta direktori baharu dengan go.mod, go.sum dan dependencies sendiri, bagaimana jika kita ingin berkongsi fungsi utiliti antara kedua-dua lambda itu? Sayang sekali?! Anda perlu menyalin fail yang sama ke dalam folder lambda baharu. Ini meninggalkan struktur fail yang kelihatan seperti ini:
Ini sangat teruk?!<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>
Dan ia menjadi lebih teruk apabila lebih banyak lambda yang kami tambah. Mesti ada cara yang lebih baik! Memandangkan saya ingin berkongsi go.mod, go.sum dan kod utiliti melalui semua lambda, saya menghasilkan struktur ini: Sekarang saya hanya perlu memberitahu AWS SAM tentang struktur baharu ini?! Saya dapati penyelesaiannya hanya dengan melaraskan nilai CodeUri dan Handler. Nampaknya jika anda SAM akan mengesannya secara automatik dan membina dengan kebergantungan akar dan dalaman/kod ? Ya✨, kami akan membincangkan lebih banyak cara untuk menyesuaikan kompilasi Go dalam artikel seterusnya! Penyelesaian
<code>.
├── hello-world/
│ ├── go.mod
│ ├── go.sum
│ └── main.go
├── events/
│ └── ...
├── samconfig.toml
└── template.yaml</code>
Rahsia?
<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>
Bolehkah ia menjadi lebih baik?
Atas ialah kandungan terperinci Membina API dengan AWS SAM dan Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!