Membangun default 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.

Membangun default dengan AWS SAM

Untuk membangun aplikasi nirserver Anda, gunakan perintah sam build. Perintah ini juga mengumpulkan artefak bangunan dependensi aplikasi Anda dan menempatkannya dalam format dan lokasi yang tepat untuk langkah berikutnya, seperti pengujian lokal, pengemasan, dan deployment.

Anda menentukan dependensi aplikasi dalam file manifes, seperti requirements.txt (Python) atau package.json (Node.js), atau dengan menggunakan properti Layers dari sumber daya fungsi. Properti Layers berisi daftar sumber daya lapisan AWS Lambda yang fungsi Lambda-nya bergantung pada lapisan tersebut.

Format artefak bangunan aplikasi Anda bergantung pada setiap fungsi properti PackageType. Opsi untuk properti ini adalah:

  • Zip - Arsip file .zip yang berisi kode aplikasi Anda dan dependensinya. Jika Anda mengemas kode Anda sebagai arsip file .zip, Anda harus menentukan waktu aktif Lambda untuk fungsi Anda.

  • Image – Citra kontainer termasuk sistem operasi dasar, waktu aktif, dan ekstensi, selain kode aplikasi Anda dan dependensinya.

Untuk informasi selengkapnya tentang tipe paket Lambda, lihat Paket deployment Lambda di Panduan Developer AWS Lambda .

Membangun arsip file .zip

Untuk membangun aplikasi nirserver Anda sebagai arsip file .zip, nyatakan PackageType: Zip untuk fungsi nirserver Anda.

AWS SAM membangun aplikasi Anda untuk arsitektur yang Anda tentukan. Jika Anda tidak menentukan arsitektur, AWS SAM gunakan secara x86_64 default.

Jika fungsi Lambda Anda bergantung pada paket yang telah dikompilasi secara native, gunakan bendera --use-container. Bendera ini secara lokal mengkompilasi fungsi Anda dalam wadah Docker yang berperilaku seperti lingkungan Lambda, sehingga mereka berada dalam format yang tepat saat Anda menerapkannya ke Cloud. AWS

Saat Anda menggunakan --use-container opsi, secara default AWS SAM menarik gambar kontainer dari Amazon ECR Public. Jika Anda ingin menarik gambar kontainer dari repositori lain, misalnya DockerHub, Anda dapat menggunakan --build-image opsi dan memberikan URI gambar kontainer alternatif. Berikut ini adalah dua contoh perintah untuk membangun aplikasi menggunakan gambar kontainer dari DockerHub repositori:

# Build a Node.js 20 application using a container image pulled from DockerHub sam build --use-container --build-image amazon/aws-sam-cli-build-image-nodejs20.x # Build a function resource using the Python 3.12 container image pulled from DockerHub sam build --use-container --build-image Function1=amazon/aws-sam-cli-build-image-python3.12

Untuk daftar URI yang dapat Anda gunakan--build-image, lihat URI Repositori citra mana yang berisi DockerHub URI untuk sejumlah runtime yang didukung.

Untuk contoh tambahan membangun aplikasi arsip file .zip, nanti Anda dapat melihatnya di bagian Contoh dalam topik ini.

Membangun citra kontainer

Untuk membangun aplikasi nirserver Anda sebagai citra kontainer, nyatakan PackageType: Image untuk fungsi nirserver Anda. Anda juga harus menyatakan atribut sumber daya Metadata dengan entri berikut:

Dockerfile

Nama Dockerfile yang berkaitan dengan fungsi Lambda.

DockerContext

Lokasi Dockerfile.

DockerTag

(Opsional) tanda untuk diterapkan pada citra yang dibangun.

DockerBuildArgs

Bangun argumen untuk bangunan tersebut.

Berikut ini adalah contoh bagian atribut sumber daya Metadata:

Metadata: Dockerfile: Dockerfile DockerContext: ./hello_world DockerTag: v1

Untuk mengunduh aplikasi sampel yang dikonfigurasi dengan tipe paket Image, lihat Tutorial: Menyebarkan aplikasi Hello World di Tutorial: Men-deploy aplikasi Hello World. Saat prompt mempertanyakan tipe paket yang ingin Anda instal, pilih Image.

catatan

Jika Anda menentukan image dasar multi-arsitektur di Dockerfile Anda, AWS SAM buat image container Anda untuk arsitektur mesin host Anda. Untuk membangun arsitektur yang berbeda, tentukan gambar dasar yang menggunakan arsitektur target tertentu.

File variabel lingkungan kontainer

Untuk menyediakan file JSON yang berisi variabel lingkungan untuk kontainer bangunan, gunakan argumen --container-env-var-file dengan perintah sam build. Anda dapat memberikan variabel lingkungan tunggal yang berlaku untuk semua sumber daya nirserver, atau variabel lingkungan yang berbeda untuk setiap sumber daya.

format

Format untuk meneruskan variabel lingkungan ke kontainer bangunan tergantung pada berapa banyak variabel lingkungan yang Anda berikan untuk sumber daya Anda.

Untuk menyediakan variabel lingkungan tunggal pada semua sumber daya, tentukan objek Parameters seperti berikut:

{ "Parameters": { "GITHUB_TOKEN": "TOKEN_GLOBAL" } }

Untuk menyediakan variabel lingkungan yang berbeda pada setiap sumber daya, tentukan objek untuk setiap sumber daya seperti berikut:

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

Simpan variabel lingkungan Anda sebagai file, misalnya, dengan nama env.json. Perintah berikut ini menggunakan file ini untuk meneruskan variabel lingkungan Anda ke kontainer bangunan:

sam build --use-container --container-env-var-file env.json

Precedence

  • Variabel lingkungan yang Anda berikan untuk sumber daya tertentu lebih diutamakan daripada variabel lingkungan tunggal untuk semua sumber daya.

  • Variabel lingkungan yang Anda berikan pada baris perintah lebih diutamakan daripada variabel lingkungan dalam sebuah file.

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.

Contoh

Contoh 1: Arsip file .zip

Perintah sam build berikut membangun arsip file .zip:

# Build all functions and layers, and their dependencies sam build # Run the build process inside a Docker container that functions like a Lambda environment sam build --use-container # Build a Node.js 20 application using a container image pulled from DockerHub sam build --use-container --build-image amazon/aws-sam-cli-build-image-nodejs20.x # Build a function resource using the Python 3.12 container image pulled from DockerHub sam build --use-container --build-image Function1=amazon/aws-sam-cli-build-image-python3.12 # Build and run your functions locally sam build && sam local invoke # For more options sam build --help

Contoh 2: Citra kontainer

AWS SAM Template berikut dibangun sebagai gambar kontainer:

Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: PackageType: Image ImageConfig: Command: ["app.lambda_handler"] Metadata: Dockerfile: Dockerfile DockerContext: ./hello_world DockerTag: v1

Berikut ini adalah contoh Dockerfile:

FROM public.ecr.aws/lambda/python:3.12 COPY app.py requirements.txt ./ RUN python3.12 -m pip install -r requirements.txt # Overwrite the command by providing a different command directly in the template. CMD ["app.lambda_handler"]

Contoh 3: npm ci

Untuk aplikasi Node.js, Anda dapat menggunakan npm ci alih-alih npm install menginstal dependensi. Untuk menggunakannpm ci, tentukan UseNpmCi: True BuildProperties di bawah atribut Metadata sumber daya fungsi Lambda Anda. Untuk menggunakannyanpm ci, aplikasi Anda harus memiliki npm-shrinkwrap.json file package-lock.json atau yang ada di fungsi CodeUri untuk Lambda Anda.

Contoh berikut digunakan npm ci untuk menginstal dependensi saat Anda menjalankan: sam build

Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello-world/ Handler: app.handler Runtime: nodejs20.x Architectures: - x86_64 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get Metadata: BuildProperties: UseNpmCi: True

Membangun fungsi di luar AWS SAM

Secara default, saat Anda menjalankansam build, AWS SAM membangun semua sumber daya fungsi Anda. Pilihan lain termasuk:

  • Membangun semua sumber daya fungsi di luar AWS SAM — Jika Anda membangun semua sumber daya fungsi Anda secara manual atau melalui alat lain, tidak sam build diperlukan. Anda dapat melewati sam build dan melanjutkan ke langkah berikutnya dalam proses Anda, seperti melakukan pengujian lokal atau menerapkan aplikasi Anda.

  • Bangun beberapa sumber daya fungsi di luar AWS SAM — Jika Anda AWS SAM ingin membangun beberapa sumber daya fungsi Anda sambil memiliki sumber daya fungsi lain yang dibangun di luar AWS SAM, Anda dapat menentukan ini di AWS SAM template Anda.

Membangun beberapa sumber daya fungsi di luar AWS SAM

Untuk AWS SAM melewatkan fungsi saat menggunakansam build, konfigurasikan yang berikut ini di AWS SAM template Anda:

  1. Tambahkan properti SkipBuild: True metadata ke fungsi Anda.

  2. Tentukan jalur ke sumber daya fungsi bawaan Anda.

Berikut adalah contoh, dengan TestFunction dikonfigurasi untuk dilewati. Sumber daya yang dibangun terletak dibuilt-resources/TestFunction.zip.

TestFunction: Type: AWS::Serverless::Function Properties: CodeUri: built-resources/TestFunction.zip Handler: TimeHandler::handleRequest Runtime: java11 Metadata: SkipBuild: True

Sekarang, ketika Anda menjalankansam build, AWS SAM akan melakukan hal berikut:

  1. AWS SAM akan melewati fungsi yang dikonfigurasi denganSkipBuild: True.

  2. AWS SAM akan membangun semua sumber daya fungsi lainnya dan menyimpannya di direktori .aws-sam build.

  3. Untuk fungsi yang dilewati, templatnya di direktori .aws-sam build akan diperbarui secara otomatis untuk mereferensikan jalur yang ditentukan ke sumber daya fungsi bawaan Anda.

    Berikut adalah contoh template cache untuk TestFunction di direktori .aws-sam build:

    TestFunction: Type: AWS::Serverless::Function Properties: CodeUri: ../../built-resources/TestFunction.zip Handler: TimeHandler::handleRequest Runtime: java11 Metadata: SkipBuild: True