Pengantar bangunan dengan AWS SAM - AWS Serverless Application Model

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Pengantar bangunan dengan AWS SAM

Gunakan AWS Serverless Application Model perintah Command Line Interface (AWS SAMCLI) sam build untuk mempersiapkan aplikasi tanpa server Anda untuk langkah-langkah selanjutnya dalam alur kerja pengembangan Anda, seperti pengujian lokal atau penerapan ke file. AWS Cloud Perintah ini membuat .aws-sam direktori yang menyusun aplikasi Anda dalam format dan lokasi yang sam local sam deploy dibutuhkan.

catatan

Menggunakan sam build mengharuskan Anda memulai dengan komponen dasar aplikasi tanpa server pada mesin pengembangan Anda. Ini termasuk AWS SAM template, kode AWS Lambda fungsi, dan file dan dependensi khusus bahasa apa pun. Untuk mempelajari selengkapnya, lihat Buat aplikasi Anda di AWS SAM.

Membangun aplikasi dengan sam build

Sebelum menggunakansam build, pertimbangkan untuk mengonfigurasi hal berikut:

  1. Fungsi dan lapisan Lambdasam build Perintah dapat membangun fungsi dan lapisan Lambda. Untuk mempelajari lebih lanjut tentang lapisan Lambda, lihat. Membangun lapisan Lambda di AWS SAM

  2. Lambda runtimeRuntime menyediakan lingkungan khusus bahasa yang menjalankan fungsi Anda di lingkungan eksekusi saat dipanggil. Anda dapat mengonfigurasi runtime asli dan kustom.

    1. Runtime asli - Buat fungsi Lambda Anda dalam runtime Lambda yang didukung dan buat fungsi Anda untuk menggunakan runtime Lambda asli di. AWS Cloud

    2. Custom runtime - Buat fungsi Lambda Anda menggunakan bahasa pemrograman apa pun dan buat runtime Anda menggunakan proses kustom yang ditentukan dalam pembuat atau pihak ketiga makefile seperti. esbuild Untuk mempelajari selengkapnya, lihat Membangun fungsi Lambda dengan runtime khusus di AWS SAM.

  3. Jenis paket Lambda - Fungsi Lambda dapat dikemas dalam jenis paket penyebaran Lambda berikut:

    1. .zip file archive - Berisi kode aplikasi Anda dan dependensinya.

    2. Gambar kontainer - Berisi sistem operasi dasar, runtime, ekstensi Lambda, kode aplikasi Anda dan dependensinya.

Pengaturan aplikasi ini dapat dikonfigurasi saat menginisialisasi aplikasi menggunakansam init.

Untuk membangun aplikasi
  1. cdke akar proyek Anda. Ini adalah lokasi yang sama dengan AWS SAM template Anda.

    $ cd sam-app
  2. Jalankan hal berikut:

    sam-app $ sam build <arguments> <options>
    catatan

    Opsi yang umum digunakan adalah--use-container. Untuk mempelajari selengkapnya, lihat Membangun fungsi Lambda di dalam wadah yang disediakan.

    Berikut ini adalah contoh dari AWS SAMCLI output:

    sam-app $ sam build Starting Build use cache Manifest file is changed (new hash: 3298f1304...d4d421) or dependency folder (.aws-sam/deps/4d3dfad6-a267-47a6-a6cd-e07d6fae318c) is missing for (HelloWorldFunction), downloading dependencies and copying/building source Building codeuri: /Users/.../sam-app/hello_world runtime: python3.12 metadata: {} architecture: x86_64 functions: HelloWorldFunction Running PythonPipBuilder:CleanUp Running PythonPipBuilder:ResolveDependencies Running PythonPipBuilder:CopySource Running PythonPipBuilder:CopySource Build Succeeded Built Artifacts : .aws-sam/build Built Template : .aws-sam/build/template.yaml Commands you can use next ========================= [*] Validate SAM template: sam validate [*] Invoke Function: sam local invoke [*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch [*] Deploy: sam deploy --guided
  3. AWS SAMCLIMembuat direktori .aws-sam build. Berikut adalah contohnya:

    .aws-sam
    ├── build
    │   ├── HelloWorldFunction
    │   │   ├── __init__.py
    │   │   ├── app.py
    │   │   └── requirements.txt
    │   └── template.yaml
    └── build.toml

Tergantung pada bagaimana aplikasi Anda dikonfigurasi, AWS SAMCLI melakukan hal berikut:

  1. Mengunduh, menginstal, dan mengatur dependensi di direktori. .aws-sam/build

  2. Siapkan kode Lambda Anda. Ini dapat mencakup kompilasi kode Anda, membuat binari yang dapat dieksekusi, dan membangun gambar kontainer.

  3. Salinan membangun artefak ke .aws-sam direktori. Formatnya akan bervariasi berdasarkan jenis paket aplikasi Anda.

    1. Untuk jenis paket.zip, artefak belum di-zip sehingga dapat digunakan untuk pengujian lokal. AWS SAMCLIRitsleting aplikasi Anda saat menggunakansam deploy.

    2. Untuk jenis paket gambar kontainer, gambar kontainer dibuat secara lokal dan direferensikan dalam file. .aws-sam/build.toml

  4. Salin AWS SAM template ke .aws-sam direktori dan memodifikasinya dengan jalur file baru bila diperlukan.

Berikut ini adalah komponen utama yang membentuk artefak build Anda di .aws-sam direktori:

  • Direktori build — Berisi fungsi dan lapisan Lambda Anda yang terstruktur secara independen satu sama lain. Ini menghasilkan struktur unik untuk setiap fungsi atau lapisan dalam .aws-sam/build direktori.

  • AWS SAM Template — Dimodifikasi dengan nilai yang diperbarui berdasarkan perubahan selama proses pembuatan.

  • File BUILD.TOLL — File konfigurasi yang berisi pengaturan build yang digunakan oleh file. AWS SAMCLI

Pengujian dan penyebaran lokal

Saat melakukan pengujian lokal dengan sam local atau penerapan dengansam deploy, AWS SAMCLI melakukan hal berikut:

  1. Ini pertama memeriksa untuk melihat apakah .aws-sam direktori ada dan apakah AWS SAM template terletak di dalam direktori itu. Jika kondisi ini terpenuhi, AWS SAMCLI menganggap ini sebagai direktori root aplikasi Anda.

  2. Jika kondisi ini tidak terpenuhi, AWS SAMCLI menganggap lokasi asli AWS SAM template Anda sebagai direktori root aplikasi Anda.

Saat mengembangkan, jika perubahan dilakukan pada file aplikasi asli Anda, jalankan sam build untuk memperbarui .aws-sam direktori sebelum menguji secara lokal.

Praktik terbaik

  • Jangan mengedit kode apa pun di bawah .aws-sam/build direktori. Sebagai gantinya, perbarui kode sumber asli Anda di folder proyek Anda dan jalankan sam build untuk memperbarui .aws-sam/build direktori.

  • Saat Anda memodifikasi file asli Anda, jalankan sam build untuk memperbarui .aws-sam/build direktori.

  • Anda mungkin AWS SAMCLI ingin mereferensikan direktori root asli proyek Anda alih-alih .aws-sam direktori, seperti saat mengembangkan dan menguji dengansam local. Hapus .aws-sam direktori atau AWS SAM template dalam .aws-sam direktori untuk AWS SAMCLI mengenali direktori proyek asli Anda sebagai direktori proyek root. Saat siap, jalankan sam build lagi untuk membuat .aws-sam direktori.

  • Ketika Anda menjalankansam build, .aws-sam/build direktori akan ditimpa setiap kali. .aws-samDirektori tidak. Jika Anda ingin menyimpan file, seperti log, simpan .aws-sam untuk mencegahnya ditimpa.

Opsi untuk sam build

Membangun sumber daya tunggal

Berikan ID logis sumber daya untuk hanya membangun sumber daya itu. Berikut adalah contohnya:

$ sam build HelloWorldFunction

Untuk membangun sumber daya aplikasi atau tumpukan bersarang, berikan ID logis aplikasi atau tumpukan bersama dengan ID logis sumber daya menggunakan format<stack-logical-id>/<resource-logical-id>:

$ sam build MyNestedStack/MyFunction

Membangun fungsi Lambda di dalam wadah yang disediakan

--use-containerOpsi mengunduh gambar kontainer dan menggunakannya untuk membangun fungsi Lambda Anda. Wadah lokal kemudian direferensikan dalam .aws-sam/build.toml file Anda.

Opsi ini Docker harus diinstal. Untuk petunjuk, lihat Menginstal Docker.

Berikut ini adalah contoh dari perintah ini:

$ sam build --use-container

Anda dapat menentukan gambar kontainer yang akan digunakan dengan --build-image opsi. Berikut adalah contohnya:

$ sam build --use-container --build-image amazon/aws-sam-cli-build-image-nodejs20.x

Untuk menentukan gambar kontainer yang akan digunakan untuk satu fungsi, berikan fungsi ID logis. Berikut adalah contohnya:

$ sam build --use-container --build-image Function1=amazon/aws-sam-cli-build-image-python3.12

Teruskan variabel lingkungan ke wadah build

Gunakan --container-env-var untuk meneruskan variabel lingkungan ke wadah build. Berikut adalah contohnya:

$ sam build --use-container --container-env-var Function1.GITHUB_TOKEN=<token1> --container-env-var GLOBAL_ENV_VAR=<global-token>

Untuk meneruskan variabel lingkungan dari file, gunakan --container-env-var-file opsi. Berikut adalah contohnya:

$ sam build --use-container --container-env-var-file <env.json>

Contoh env.json file:

{ "MyFunction1": { "GITHUB_TOKEN": "TOKEN1" }, "MyFunction2": { "GITHUB_TOKEN": "TOKEN2" } }

Mempercepat pembangunan aplikasi yang berisi banyak fungsi

Ketika Anda menjalankan sam build aplikasi dengan beberapa fungsi, AWS SAMCLI membangun setiap fungsi satu per satu. Untuk mempercepat proses pembuatan, gunakan --parallel opsi. Ini membangun semua fungsi dan lapisan Anda secara bersamaan.

Berikut ini adalah contoh dari perintah ini:

$ sam build —-parallel

Mempercepat waktu pembuatan dengan membangun proyek Anda di folder sumber

Untuk runtime dan metode build yang didukung, Anda dapat menggunakan --build-in-source opsi untuk membangun proyek secara langsung di folder sumber. Secara default, AWS SAM CLI build dalam direktori sementara, yang melibatkan penyalinan kode sumber dan file proyek. Dengan--build-in-source, AWS SAM CLI build langsung di folder sumber Anda, yang mempercepat proses pembuatan dengan menghapus kebutuhan untuk menyalin file ke direktori sementara.

Untuk daftar runtime dan metode build yang didukung, lihat--build-in-source.

Pemecahan Masalah

Untuk memecahkan masalah AWS SAMCLI, lihat. AWS SAMCLIpemecahan masalah

Contoh

Membangun aplikasi yang menggunakan runtime asli dan tipe paket.zip

Untuk contoh ini, lihatTutorial: Menyebarkan aplikasi Hello World dengan AWS SAM.

Membangun aplikasi yang menggunakan runtime asli dan tipe paket gambar

Pertama, kita jalankan sam init untuk menginisialisasi aplikasi baru. Selama aliran interaktif, kami memilih jenis Image paket. Berikut adalah contohnya:

$ sam init ... Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 Choose an AWS Quick Start application template 1 - Hello World Example 2 - Multi-step workflow 3 - Serverless API 4 - Scheduled task 5 - Standalone function 6 - Data processing 7 - Hello World Example With Powertools 8 - Infrastructure event management 9 - Serverless Connector Hello World Example 10 - Multi-step workflow with Connectors 11 - Lambda EFS example 12 - DynamoDB Example 13 - Machine Learning Template: 1 Use the most popular runtime and package type? (Python and zip) [y/N]: ENTER Which runtime would you like to use? ... 10 - java8 11 - nodejs20.x 12 - nodejs18.x 13 - nodejs16.x ... Runtime: 12 What package type would you like to use? 1 - Zip 2 - Image Package type: 2 Based on your selections, the only dependency manager available is npm. We will proceed copying the template using npm. Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: ENTER Would you like to enable monitoring using CloudWatch Application Insights? For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: ENTER Project name [sam-app]: ENTER Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment) ----------------------- Generating application: ----------------------- Name: sam-app Base Image: amazon/nodejs18.x-base Architectures: x86_64 Dependency Manager: npm Output Directory: . Configuration file: sam-app/samconfig.toml Next steps can be found in the README file at sam-app/README.md ...

AWS SAMCLIMenginisialisasi aplikasi dan membuat direktori proyek berikut:

sam-app
├── README.md
├── events
│   └── event.json
├── hello-world
│   ├── Dockerfile
│   ├── app.mjs
│   ├── package.json
│   └── tests
│       └── unit
│           └── test-handler.mjs
├── samconfig.toml
└── template.yaml

Selanjutnya, kami menjalankan sam build untuk membangun aplikasi kami:

sam-app $ sam build Building codeuri: /Users/.../build-demo/sam-app runtime: None metadata: {'DockerTag': 'nodejs18.x-v1', 'DockerContext': '/Users/.../build-demo/sam-app/hello-world', 'Dockerfile': 'Dockerfile'} architecture: arm64 functions: HelloWorldFunction Building image for HelloWorldFunction function Setting DockerBuildArgs: {} for HelloWorldFunction function Step 1/4 : FROM public.ecr.aws/lambda/nodejs:18 ---> f5b68038c080 Step 2/4 : COPY app.mjs package*.json ./ ---> Using cache ---> 834e565aae80 Step 3/4 : RUN npm install ---> Using cache ---> 31c2209dd7b5 Step 4/4 : CMD ["app.lambdaHandler"] ---> Using cache ---> 2ce2a438e89d Successfully built 2ce2a438e89d Successfully tagged helloworldfunction:nodejs18.x-v1 Build Succeeded Built Artifacts : .aws-sam/build Built Template : .aws-sam/build/template.yaml Commands you can use next ========================= [*] Validate SAM template: sam validate [*] Invoke Function: sam local invoke [*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch [*] Deploy: sam deploy --guided

Membangun aplikasi yang mencakup bahasa pemrograman yang dikompilasi

Dalam contoh ini, kita membangun sebuah aplikasi yang berisi fungsi Lambda menggunakan runtime. Go

Pertama, kami menginisialisasi aplikasi baru menggunakan sam init dan mengonfigurasi aplikasi kami untuk digunakanGo:

$ sam init ... Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 Choose an AWS Quick Start application template 1 - Hello World Example 2 - Multi-step workflow 3 - Serverless API ... Template: 1 Use the most popular runtime and package type? (Python and zip) [y/N]: ENTER Which runtime would you like to use? ... 4 - dotnetcore3.1 5 - go1.x 6 - go (provided.al2) ... Runtime: 5 What package type would you like to use? 1 - Zip 2 - Image Package type: 1 Based on your selections, the only dependency manager available is mod. We will proceed copying the template using mod. Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: ENTER Would you like to enable monitoring using CloudWatch Application Insights? For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: ENTER Project name [sam-app]: ENTER Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment) ----------------------- Generating application: ----------------------- Name: sam-app Runtime: go1.x Architectures: x86_64 Dependency Manager: mod Application Template: hello-world Output Directory: . Configuration file: sam-app/samconfig.toml Next steps can be found in the README file at sam-app-go/README.md ...

AWS SAMCLIMenginisialisasi aplikasi. Berikut ini adalah contoh struktur direktori aplikasi:

sam-app
├── Makefile
├── README.md
├── events
│   └── event.json
├── hello-world
│   ├── go.mod
│   ├── go.sum
│   ├── main.go
│   └── main_test.go
├── samconfig.toml
└── template.yaml

Kami mereferensikan README.md file untuk persyaratan aplikasi ini.

...
## Requirements
* AWS CLI already configured with Administrator permission
* [Docker installed](https://www.docker.com/community-edition)
* [Golang](https://golang.org)
* SAM CLI - [Install the SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)
...

Selanjutnya, kita jalankan sam local invoke untuk menguji fungsi kita. Kesalahan perintah ini sejak Go tidak diinstal pada mesin lokal kami:

sam-app $ sam local invoke Invoking hello-world (go1.x) Local image was not found. Removing rapid images for repo public.ecr.aws/sam/emulation-go1.x Building image................................................................................................................................................................................................................................................. Using local image: public.ecr.aws/lambda/go:1-rapid-x86_64. Mounting /Users/.../Playground/build/sam-app/hello-world as /var/task:ro,delegated inside runtime container START RequestId: c6c5eddf-042b-4e1e-ba66-745f7c86dd31 Version: $LATEST fork/exec /var/task/hello-world: no such file or directory: PathError null END RequestId: c6c5eddf-042b-4e1e-ba66-745f7c86dd31 REPORT RequestId: c6c5eddf-042b-4e1e-ba66-745f7c86dd31 Init Duration: 0.88 ms Duration: 175.75 ms Billed Duration: 176 ms Memory Size: 128 MB Max Memory Used: 128 MB {"errorMessage":"fork/exec /var/task/hello-world: no such file or directory","errorType":"PathError"}%

Selanjutnya, kita jalankan sam build untuk membangun aplikasi kita. Kami menemukan kesalahan karena Go tidak diinstal pada mesin lokal kami:

sam-app $ sam build Starting Build use cache Cache is invalid, running build and copying resources for following functions (HelloWorldFunction) Building codeuri: /Users/.../Playground/build/sam-app/hello-world runtime: go1.x metadata: {} architecture: x86_64 functions: HelloWorldFunction Build Failed Error: GoModulesBuilder:Resolver - Path resolution for runtime: go1.x of binary: go was not successful

Meskipun kami dapat mengonfigurasi mesin lokal kami untuk membangun fungsi kami dengan benar, kami malah menggunakan --use-container opsi dengansam build. AWS SAMCLIDownload gambar kontainer, membangun fungsi kita menggunakan native GoModulesBuilder, dan menyalin biner yang dihasilkan ke .aws-sam/build/HelloWorldFunction direktori kita.

sam-app $ sam build --use-container Starting Build use cache Starting Build inside a container Cache is invalid, running build and copying resources for following functions (HelloWorldFunction) Building codeuri: /Users/.../build/sam-app/hello-world runtime: go1.x metadata: {} architecture: x86_64 functions: HelloWorldFunction Fetching public.ecr.aws/sam/build-go1.x:latest-x86_64 Docker container image..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... Mounting /Users/.../build/sam-app/hello-world as /tmp/samcli/source:ro,delegated inside runtime container Running GoModulesBuilder:Build Build Succeeded Built Artifacts : .aws-sam/build Built Template : .aws-sam/build/template.yaml Commands you can use next ========================= [*] Validate SAM template: sam validate [*] Invoke Function: sam local invoke [*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch [*] Deploy: sam deploy --guided

Berikut ini adalah contoh .aws-sam direktori:

.aws-sam
├── build
│   ├── HelloWorldFunction
│   │   └── hello-world
│   └── template.yaml
├── build.toml
├── cache
│   └── c860d011-4147-4010-addb-2eaa289f4d95
│       └── hello-world
└── deps

Selanjutnya, kita larisam local invoke. Fungsi kami berhasil dipanggil:

sam-app $ sam local invoke Invoking hello-world (go1.x) Local image is up-to-date Using local image: public.ecr.aws/lambda/go:1-rapid-x86_64. Mounting /Users/.../Playground/build/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container START RequestId: cfc8ffa8-29f2-49d4-b461-45e8c7c80479 Version: $LATEST END RequestId: cfc8ffa8-29f2-49d4-b461-45e8c7c80479 REPORT RequestId: cfc8ffa8-29f2-49d4-b461-45e8c7c80479 Init Duration: 1.20 ms Duration: 1782.46 ms Billed Duration: 1783 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode":200,"headers":null,"multiValueHeaders":null,"body":"Hello, 72.21.198.67\n"}%

Pelajari selengkapnya

Untuk mempelajari lebih lanjut tentang menggunakan sam build perintah, lihat berikut ini: