

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

# Memulai dengan contoh aplikasi dan pola
<a name="example-apps"></a>

Sumber daya berikut dapat digunakan untuk membuat dan menyebarkan aplikasi tanpa server dengan cepat yang menerapkan beberapa kasus penggunaan Lambda umum. Untuk setiap contoh aplikasi, kami memberikan instruksi untuk membuat dan mengonfigurasi sumber daya secara manual menggunakan Konsol Manajemen AWS, atau menggunakan AWS Serverless Application Model untuk menyebarkan sumber daya menggunakan IAc. Ikuti intruksi konsol untuk mempelajari lebih lanjut tentang mengonfigurasi AWS sumber daya individual untuk setiap aplikasi, atau gunakan AWS SAM untuk menerapkan sumber daya dengan cepat seperti yang Anda lakukan di lingkungan produksi.

## Pemrosesan File
<a name="examples-apps-file"></a>
+ **[Aplikasi Enkripsi PDF](file-processing-app.md)**: Buat aplikasi tanpa server yang mengenkripsi file PDF saat diunggah ke bucket Amazon Simple Storage Service dan menyimpannya ke bucket lain, yang berguna untuk mengamankan dokumen sensitif saat diunggah.
+ **[Aplikasi Analisis Gambar](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-example-s3.html)**: Buat aplikasi tanpa server yang mengekstrak teks dari gambar menggunakan Amazon Rekognition, yang berguna untuk pemrosesan dokumen, moderasi konten, dan analisis gambar otomatis.

## Integrasi Database
<a name="examples-apps-database"></a>
+ **[Queue-to-Database Aplikasi](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-lambda-tutorial.html)**: Buat aplikasi tanpa server yang menulis pesan antrian ke database Amazon RDS, yang berguna untuk memproses pendaftaran pengguna dan menangani pengiriman pesanan.
+ **[Database Event Handler](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-example-ddb.html)**: Buat aplikasi tanpa server yang merespons perubahan tabel Amazon DynamoDB, yang berguna untuk pencatatan audit, replikasi data, dan alur kerja otomatis.

## Tugas Terjadwal
<a name="examples-apps-scheduled"></a>
+ **[Aplikasi Pemeliharaan Database](scheduled-task-app.md)**: Buat aplikasi tanpa server yang secara otomatis menghapus entri berusia lebih dari 12 bulan dari tabel Amazon DynamoDB menggunakan jadwal cron, yang berguna untuk pemeliharaan database otomatis dan manajemen siklus hidup data.
+ **[Buat aturan EventBridge terjadwal untuk fungsi Lambda](https://docs.aws.amazon.com/eventbridge/latest/userguide/run-lambda-schedule.html)**: Gunakan ekspresi terjadwal untuk aturan masuk EventBridge untuk memicu fungsi Lambda pada jadwal berjangka waktu. Format ini menggunakan sintaks cron dan dapat diatur dengan granularitas satu menit.

## Alur Kerja yang Berjalan Lama
<a name="examples-apps-workflows"></a>
+ **[Aplikasi Pemrosesan Pesanan](order-processing-app.md)**: Buat aplikasi tanpa server menggunakan Fungsi Tahan Lama yang menangani pemenuhan pesanan yang kompleks, termasuk pemrosesan pembayaran, pemeriksaan inventaris, dan koordinasi pengiriman. Contoh ini menunjukkan cara membangun alur kerja yang dapat berjalan untuk waktu yang lama sambil mempertahankan status.

## Sumber daya tambahan
<a name="examples-apps-additional-resources"></a>

Gunakan sumber daya berikut untuk mengeksplorasi Lambda dan pengembangan aplikasi tanpa server lebih lanjut:
+ **[Serverless Land](https://serverlessland.com/)**: pustaka ready-to-use pola untuk membangun aplikasi tanpa server. Ini membantu pengembang membuat aplikasi lebih cepat menggunakan AWS layanan seperti Lambda, API Gateway, dan. EventBridge Situs ini menawarkan solusi pra-bangun dan praktik terbaik, sehingga lebih mudah untuk mengembangkan sistem tanpa server.
+ **[Aplikasi sampel Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-samples.html)**: Aplikasi yang tersedia di GitHub repositori untuk panduan ini. Sampel ini menunjukkan penggunaan berbagai bahasa dan AWS layanan. Setiap aplikasi sampel menyertakan skrip untuk penyebaran dan pembersihan yang mudah serta sumber daya pendukung.
+ **[Contoh kode untuk Lambda menggunakan AWS SDKs](https://docs.aws.amazon.com/lambda/latest/dg/service_code_examples.html)**: Contoh yang menunjukkan cara menggunakan Lambda dengan kit pengembangan AWS perangkat lunak (). SDKs Contoh-contoh ini termasuk dasar-dasar, tindakan, skenario, dan kontribusi AWS komunitas. Contohnya mencakup operasi penting, fungsi layanan individu, dan tugas spesifik menggunakan beberapa fungsi atau AWS layanan.

# Membuat aplikasi pemrosesan file tanpa server
<a name="file-processing-app"></a>

Salah satu kasus penggunaan yang paling umum untuk Lambda adalah melakukan tugas pemrosesan file. Misalnya, Anda mungkin menggunakan fungsi Lambda untuk secara otomatis membuat file PDF dari file HTML atau gambar, atau untuk membuat thumbnail saat pengguna mengunggah gambar.

Dalam contoh ini, Anda membuat aplikasi yang secara otomatis mengenkripsi file PDF saat diunggah ke bucket Amazon Simple Storage Service (Amazon S3). Untuk mengimplementasikan aplikasi ini, Anda membuat sumber daya berikut:
+ Bucket S3 bagi pengguna untuk mengunggah file PDF ke
+ Fungsi Lambda dalam Python yang membaca file yang diunggah dan membuat versi terenkripsi yang dilindungi kata sandi
+ Bucket S3 kedua untuk Lambda untuk menyimpan file terenkripsi

Anda juga membuat kebijakan AWS Identity and Access Management (IAM) untuk memberikan izin fungsi Lambda Anda untuk melakukan operasi baca dan tulis pada bucket S3 Anda.

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/ExampleApps/file_process_resources.png)


**Tip**  
Jika Anda baru mengenal Lambda, kami sarankan Anda memulai dengan tutorial [Buat fungsi Lambda pertama Anda](getting-started.md) sebelum membuat aplikasi contoh ini.

Anda dapat menerapkan aplikasi secara manual dengan membuat dan mengonfigurasi resource dengan Konsol Manajemen AWS atau AWS Command Line Interface ()AWS CLI. Anda juga dapat menerapkan aplikasi dengan menggunakan AWS Serverless Application Model (AWS SAM). AWS SAM adalah alat infrastruktur sebagai kode (IAc). Dengan IAc, Anda tidak membuat sumber daya secara manual, tetapi mendefinisikannya dalam kode dan kemudian menerapkannya secara otomatis.

Jika Anda ingin mempelajari lebih lanjut tentang menggunakan Lambda dengan IAc sebelum menerapkan aplikasi contoh ini, lihat. [Menggunakan Lambda dengan infrastruktur sebagai kode (IAc)](foundation-iac.md)

## Buat file kode sumber fungsi Lambda
<a name="file-processing-app-download"></a>

Buat file berikut di direktori proyek Anda:
+ `lambda_function.py`- kode fungsi Python untuk fungsi Lambda yang melakukan enkripsi file
+ `requirements.txt`- file manifes yang mendefinisikan dependensi yang dibutuhkan kode fungsi Python Anda

Perluas bagian berikut untuk melihat kode dan untuk mempelajari lebih lanjut tentang peran setiap file. Untuk membuat file di mesin lokal Anda, salin dan tempel kode di bawah ini, atau unduh file dari [aws-lambda-developer-guide GitHub repo](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/file-processing-python).

### Kode fungsi Python
<a name="file-processing-app-function-code"></a>

Salin dan tempel kode berikut ke dalam file bernama`lambda_function.py`.

```
from pypdf import PdfReader, PdfWriter
import uuid
import os
from urllib.parse import unquote_plus
import boto3

# Create the S3 client to download and upload objects from S3
s3_client = boto3.client('s3')

def lambda_handler(event, context):
    # Iterate over the S3 event object and get the key for all uploaded files
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key = unquote_plus(record['s3']['object']['key']) # Decode the S3 object key to remove any URL-encoded characters
        download_path = f'/tmp/{uuid.uuid4()}.pdf' # Create a path in the Lambda tmp directory to save the file to 
        upload_path = f'/tmp/converted-{uuid.uuid4()}.pdf' # Create another path to save the encrypted file to
        
        # If the file is a PDF, encrypt it and upload it to the destination S3 bucket
        if key.lower().endswith('.pdf'):
            s3_client.download_file(bucket, key, download_path)
            encrypt_pdf(download_path, upload_path)
            encrypted_key = add_encrypted_suffix(key)
            s3_client.upload_file(upload_path, f'{bucket}-encrypted', encrypted_key)

# Define the function to encrypt the PDF file with a password
def encrypt_pdf(file_path, encrypted_file_path):
    reader = PdfReader(file_path)
    writer = PdfWriter()
    
    for page in reader.pages:
        writer.add_page(page)

    # Add a password to the new PDF
    writer.encrypt("my-secret-password")

    # Save the new PDF to a file
    with open(encrypted_file_path, "wb") as file:
        writer.write(file)

# Define a function to add a suffix to the original filename after encryption
def add_encrypted_suffix(original_key):
    filename, extension = original_key.rsplit('.', 1)
    return f'{filename}_encrypted.{extension}'
```

**catatan**  
Dalam contoh kode ini, kata sandi untuk file terenkripsi (`my-secret-password`) di-hardcode ke dalam kode fungsi. Dalam aplikasi produksi, jangan sertakan informasi sensitif seperti kata sandi dalam kode fungsi Anda. Sebagai gantinya, [buat AWS Secrets Manager rahasia](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) dan kemudian [gunakan ekstensi AWS Parameter dan Rahasia Lambda](with-secrets-manager.md) untuk mengambil kredensil Anda di fungsi Lambda Anda.

Kode fungsi python berisi tiga fungsi - fungsi [handler](python-handler.md) yang dijalankan Lambda saat fungsi Anda dipanggil, dan dua fungsi terpisah bernama `add_encrypted_suffix` dan `encrypt_pdf` yang dipanggil handler untuk melakukan enkripsi PDF.

Saat fungsi Anda dipanggil oleh Amazon S3, Lambda meneruskan argumen peristiwa *berformat* JSON ke fungsi yang berisi detail tentang peristiwa yang menyebabkan pemanggilan. Dalam hal ini, informasi termasuk nama bucket S3 dan kunci objek untuk file yang diunggah. Untuk mempelajari lebih lanjut tentang format objek acara untuk Amazon S3, lihat. [Memproses pemberitahuan acara Amazon S3 dengan Lambda](with-s3.md)

Fungsi Anda kemudian menggunakan file AWS SDK untuk Python (Boto3) untuk mengunduh file PDF yang ditentukan dalam objek acara ke direktori penyimpanan sementara lokalnya, sebelum mengenkripsi mereka menggunakan perpustakaan. [https://pypi.org/project/pypdf/](https://pypi.org/project/pypdf/)

Terakhir, fungsi ini menggunakan Boto3 SDK untuk menyimpan file terenkripsi di bucket tujuan S3 Anda.

### `requirements.txt`file manifes
<a name="file-processing-app-dependencies"></a>

Salin dan tempel kode berikut ke dalam file bernama`requirements.txt`.

```
boto3
pypdf
```

Untuk contoh ini, kode fungsi Anda hanya memiliki dua dependensi yang bukan bagian dari pustaka Python standar - SDK for Python (Boto3) dan paket yang digunakan fungsi untuk melakukan enkripsi PDF. `pypdf`

**catatan**  
Versi SDK untuk Python (Boto3) disertakan sebagai bagian dari runtime Lambda, sehingga kode Anda akan berjalan tanpa menambahkan Boto3 ke paket penerapan fungsi Anda. Namun, untuk mempertahankan kontrol penuh dependensi fungsi Anda dan menghindari kemungkinan masalah dengan misalignment versi, praktik terbaik untuk Python adalah menyertakan semua dependensi fungsi dalam paket penerapan fungsi Anda. Lihat [Dependensi runtime dengan Python](python-package.md#python-package-dependencies) untuk mempelajari selengkapnya.

## Terapkan aplikasi
<a name="file-processing-app-deploy"></a>

Anda dapat membuat dan menerapkan sumber daya untuk aplikasi contoh ini baik secara manual atau dengan menggunakan AWS SAM. Dalam lingkungan produksi, kami menyarankan Anda menggunakan alat IAC AWS SAM untuk menyebarkan seluruh aplikasi tanpa server dengan cepat dan berulang tanpa menggunakan proses manual.

### Menyebarkan sumber daya secara manual
<a name="file-processing-app-deploy-manual"></a>

Untuk menerapkan aplikasi Anda secara manual:
+ Buat bucket Amazon S3 sumber dan tujuan
+ Buat fungsi Lambda yang mengenkripsi file PDF dan menyimpan versi terenkripsi ke bucket S3
+ Konfigurasikan pemicu Lambda yang memanggil fungsi Anda saat objek diunggah ke bucket sumber

Sebelum Anda mulai, pastikan [Python](https://www.python.org/downloads/) diinstal pada mesin build Anda.

#### Buat dua ember S3
<a name="file-processing-app-deploy-manual-create-buckets"></a>

Pertama buat dua ember S3. Bucket pertama adalah bucket sumber tempat Anda akan mengunggah file PDF Anda. Bucket kedua digunakan oleh Lambda untuk menyimpan file terenkripsi saat Anda menjalankan fungsi.

------
#### [ Console ]

**Untuk membuat bucket S3 (konsol)**

1. Buka halaman [bucket tujuan umum](https://console.aws.amazon.com/s3/buckets) konsol Amazon S3.

1. Pilih yang Wilayah AWS paling dekat dengan lokasi geografis Anda. Anda dapat mengubah wilayah Anda menggunakan daftar drop-down di bagian atas layar.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/console_region_select.png)

1. Pilih **Buat bucket**.

1. Pada **Konfigurasi umum**, lakukan hal berikut:

   1. Untuk **jenis Bucket**, pastikan **Tujuan umum** dipilih.

   1. Untuk **nama Bucket**, masukkan nama unik global yang memenuhi aturan [penamaan bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html) Amazon S3. Nama bucket hanya dapat berisi huruf kecil, angka, titik (.), dan tanda hubung (-).

1. Biarkan semua opsi lain disetel ke nilai defaultnya dan pilih **Buat bucket**.

1. Ulangi langkah 1 hingga 4 untuk membuat bucket tujuan Anda. Untuk **nama Bucket**`amzn-s3-demo-bucket-encrypted`, masukkan, di `amzn-s3-demo-bucket` mana nama bucket sumber yang baru saja Anda buat.

------
#### [ AWS CLI ]

Sebelum Anda mulai, pastikan bahwa [AWS CLI diinstal](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) pada mesin build Anda.

**Untuk membuat bucket Amazon S3 ()AWS CLI**

1. Jalankan perintah CLI berikut untuk membuat bucket sumber Anda. Nama yang Anda pilih untuk bucket Anda harus unik secara global dan ikuti aturan [penamaan bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html) Amazon S3. Nama hanya dapat berisi huruf kecil, angka, titik (.), dan tanda hubung (-). Untuk `region` dan`LocationConstraint`, pilih yang paling [Wilayah AWS](https://docs.aws.amazon.com/general/latest/gr/lambda-service.html)dekat dengan lokasi geografis Anda.

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-bucket --region us-east-2 \
   --create-bucket-configuration LocationConstraint=us-east-2
   ```

   Kemudian dalam tutorial, Anda harus membuat fungsi Lambda Anda Wilayah AWS sama dengan bucket sumber Anda, jadi catat wilayah yang Anda pilih.

1. Jalankan perintah berikut untuk membuat bucket tujuan Anda. Untuk nama bucket, Anda harus menggunakan`amzn-s3-demo-bucket-encrypted`, di `amzn-s3-demo-bucket` mana nama bucket sumber yang Anda buat di langkah 1. Untuk `region` dan`LocationConstraint`, pilih yang sama dengan yang Wilayah AWS Anda gunakan untuk membuat bucket sumber Anda.

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-bucket-encrypted --region us-east-2 \
   --create-bucket-configuration LocationConstraint=us-east-2
   ```

------

#### Membuat peran eksekusi
<a name="file-processing-app-deploy-manual-create-execution-role"></a>

Peran eksekusi adalah peran IAM yang memberikan izin fungsi Lambda untuk mengakses dan sumber daya. Layanan AWS Untuk memberikan akses baca dan tulis fungsi Anda ke Amazon S3, Anda melampirkan kebijakan [AWS terkelola](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies). `AmazonS3FullAccess`

------
#### [ Console ]

**Untuk membuat peran eksekusi dan melampirkan kebijakan `AmazonS3FullAccess` terkelola (konsol)**

1. Buka [Halaman peran](https://console.aws.amazon.com/iam/home/roles) di konsol IAM.

1. Pilih **Buat peran**.

1. Untuk **jenis entitas Tepercaya**, pilih **AWS layanan**, dan untuk **kasus Penggunaan**, pilih **Lambda**.

1. Pilih **Berikutnya**.

1. Tambahkan kebijakan `AmazonS3FullAccess` terkelola dengan melakukan hal berikut:

   1. Dalam **kebijakan Izin**, masukkan **AmazonS3FullAccess** ke dalam bilah pencarian.

   1. Pilih kotak centang di sebelah kebijakan.

   1. Pilih **Berikutnya**.

1. Dalam **Rincian Peran**, untuk **nama Peran** masukkan**LambdaS3Role**.

1. Pilih **Buat Peran**.

------
#### [ AWS CLI ]

**Untuk membuat peran eksekusi dan melampirkan kebijakan `AmazonS3FullAccess` terkelola (AWS CLI)**

1. Simpan JSON berikut dalam file bernama`trust-policy.json`. Kebijakan kepercayaan ini memungkinkan Lambda untuk menggunakan izin peran dengan memberikan `lambda.amazonaws.com` izin utama layanan untuk memanggil tindakan AWS Security Token Service ()AWS STS. `AssumeRole`  
****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "lambda.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

1. Dari direktori tempat Anda menyimpan dokumen kebijakan kepercayaan JSON, jalankan perintah CLI berikut untuk membuat peran eksekusi.

   ```
   aws iam create-role --role-name LambdaS3Role --assume-role-policy-document file://trust-policy.json
   ```

1. Untuk melampirkan kebijakan `AmazonS3FullAccess` terkelola, jalankan perintah CLI berikut.

   ```
   aws iam attach-role-policy --role-name LambdaS3Role --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
   ```

------

#### Buat paket penerapan fungsi
<a name="file-processing-app-deploy-manual-create-function-package"></a>

Untuk membuat fungsi Anda, Anda membuat *paket deployment* yang berisi kode fungsi dan dependensinya. Untuk aplikasi ini, kode fungsi Anda menggunakan pustaka terpisah untuk enkripsi PDF.

**Untuk membuat paket deployment**

1. Arahkan ke direktori proyek yang berisi `lambda_function.py` dan `requirements.txt` file yang Anda buat atau unduh dari GitHub sebelumnya dan buat direktori baru bernama`package`.

1. Instal dependensi yang ditentukan dalam `requirements.txt` file di `package` direktori Anda dengan menjalankan perintah berikut.

   ```
   pip install -r requirements.txt --target ./package/
   ```

1. Buat file.zip yang berisi kode aplikasi Anda dan dependensinya. Di Linux atau macOS, jalankan perintah berikut dari antarmuka baris perintah Anda.

   ```
   cd package
   zip -r ../lambda_function.zip .
   cd ..
   zip lambda_function.zip lambda_function.py
   ```

    Di Windows, gunakan alat zip pilihan Anda untuk membuat file `lambda_function.zip`. Pastikan bahwa `lambda_function.py` file Anda dan folder yang berisi dependensi Anda semuanya berada di root file.zip.

Anda juga dapat membuat paket deployment menggunakan lingkungan virtual Python. Lihat [Bekerja dengan arsip file.zip untuk fungsi Python Lambda](python-package.md)

#### Buat fungsi Lambda
<a name="file-processing-app-deploy-manual-createfunction"></a>

Anda sekarang menggunakan paket penyebaran yang Anda buat pada langkah sebelumnya untuk menyebarkan fungsi Lambda Anda.

------
#### [ Console ]

**Untuk membuat fungsi (konsol)**

Untuk membuat fungsi Lambda menggunakan konsol, pertama-tama Anda membuat fungsi dasar yang berisi beberapa kode 'Hello world'. Anda kemudian mengganti kode ini dengan kode fungsi Anda sendiri dengan mengunggah file the.zip yang Anda buat pada langkah sebelumnya.

Untuk memastikan bahwa fungsi Anda tidak habis saat mengenkripsi file PDF besar, Anda mengonfigurasi pengaturan memori dan batas waktu fungsi. Anda juga mengatur format log fungsi ke JSON. Mengkonfigurasi log berformat JSON diperlukan saat menggunakan skrip pengujian yang disediakan sehingga dapat membaca status pemanggilan fungsi dari CloudWatch Log untuk mengonfirmasi pemanggilan yang berhasil.

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pastikan Anda bekerja di tempat yang sama saat Wilayah AWS Anda membuat bucket S3. Anda dapat mengubah wilayah Anda menggunakan daftar drop-down di bagian atas layar.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/console_region_select.png)

1. Pilih **Buat fungsi**.

1. Pilih **Penulis dari scratch**.

1. Di bagian **Informasi dasar**, lakukan hal berikut:

   1. Untuk **Nama fungsi**, masukkan `EncryptPDF`.

   1. Untuk **Runtime** pilih **Python 3.12**.

   1. Untuk **Arsitektur**, pilih **x86\$164**.

1. Lampirkan peran eksekusi yang Anda buat pada langkah sebelumnya dengan melakukan hal berikut:

   1. Perluas bagian **Ubah peran eksekusi default**.

   1. Pilih **Gunakan peran yang ada**.

   1. Di bawah **Peran yang ada**, pilih peran Anda (`LambdaS3Role`).

1. Pilih **Buat fungsi**.

**Untuk mengunggah kode fungsi (konsol)**

1. Di panel **Sumber kode**, pilih **Unggah dari**.

1. Pilih **file.zip**.

1. Pilih **Unggah**.

1. **Di pemilih file, pilih file.zip Anda dan pilih Buka.**

1. Pilih **Simpan**.

**Untuk mengkonfigurasi memori fungsi dan batas waktu (konsol)**

1. Pilih tab **Konfigurasi** untuk fungsi Anda.

1. Di panel **konfigurasi Umum**, pilih **Edit**.

1. Atur **Memori** ke 256 MB dan **Timeout** menjadi 15 detik.

1. Pilih **Simpan**.

**Untuk mengkonfigurasi format log (konsol)**

1. Pilih tab **Konfigurasi** untuk fungsi Anda.

1. Pilih **Alat pemantauan dan operasi**.

1. Di panel **konfigurasi Logging**, pilih **Edit**.

1. Untuk **konfigurasi Logging**, pilih **JSON**.

1. Pilih **Simpan**.

------
#### [ AWS CLI ]

**Untuk membuat fungsi (AWS CLI)**
+ Jalankan perintah berikut dari direktori yang berisi `lambda_function.zip` file Anda.Untuk `region` parameternya, ganti `us-east-2` dengan wilayah tempat Anda membuat bucket S3.

  ```
  aws lambda create-function --function-name EncryptPDF \
  --zip-file fileb://lambda_function.zip --handler lambda_function.lambda_handler \
  --runtime python3.12 --timeout 15 --memory-size 256 \
  --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-east-2 \
  --logging-config LogFormat=JSON
  ```

------

#### Konfigurasikan pemicu Amazon S3 untuk menjalankan fungsi
<a name="file-processing-app-deploy-manual-configure-s3-trigger"></a>

Agar fungsi Lambda dapat berjalan saat mengunggah file ke bucket sumber, Anda perlu mengonfigurasi pemicu untuk fungsi Anda. Anda dapat mengonfigurasi pemicu Amazon S3 menggunakan konsol atau. AWS CLI

**penting**  
Prosedur ini mengonfigurasi bucket S3 untuk memanggil fungsi Anda setiap kali objek dibuat di bucket. Pastikan untuk mengonfigurasi ini hanya di bucket sumber. Jika fungsi Lambda Anda membuat objek dalam bucket yang sama yang memanggilnya, fungsi Anda dapat [dipanggil terus menerus](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway) dalam satu loop. Hal ini dapat mengakibatkan biaya yang tidak diharapkan ditagih ke Anda Akun AWS.

------
#### [ Console ]

**Untuk mengonfigurasi pemicu Amazon S3 (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) konsol Lambda dan pilih fungsi Anda ()`EncryptPDF`.

1. Pilih **Tambahkan pemicu**.

1. Pilih **S3**.

1. Di bawah **Bucket**, pilih bucket sumber Anda.

1. Di bawah **Jenis acara**, pilih **Semua objek membuat acara**.

1. Di bawah **Pemanggilan rekursif**, pilih kotak centang untuk mengetahui bahwa tidak disarankan menggunakan bucket S3 yang sama untuk input dan output. Anda dapat mempelajari lebih lanjut tentang pola pemanggilan rekursif di Lambda dengan membaca [pola rekursif yang menyebabkan fungsi Lambda yang tidak terkendali](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway) di Tanah Tanpa Server.

1. Pilih **Tambahkan**.

   Saat Anda membuat pemicu menggunakan konsol Lambda, Lambda secara otomatis membuat [kebijakan berbasis sumber daya](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html) untuk memberikan layanan yang Anda pilih izin untuk menjalankan fungsi Anda. 

------
#### [ AWS CLI ]

**Untuk mengonfigurasi pemicu Amazon S3 ()AWS CLI**

1. Tambahkan [kebijakan berbasis sumber daya](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html) ke fungsi yang memungkinkan bucket sumber Amazon S3 menjalankan fungsi saat menambahkan file. Pernyataan kebijakan berbasis sumber daya memberikan Layanan AWS izin lain untuk menjalankan fungsi Anda. Untuk memberikan izin Amazon S3 untuk menjalankan fungsi Anda, jalankan perintah CLI berikut. Pastikan untuk mengganti `source-account` parameter dengan Akun AWS ID Anda sendiri dan menggunakan nama bucket sumber Anda sendiri.

   ```
   aws lambda add-permission --function-name EncryptPDF \
   --principal s3.amazonaws.com --statement-id s3invoke --action "lambda:InvokeFunction" \
   --source-arn arn:aws:s3:::amzn-s3-demo-bucket \
   --source-account 123456789012
   ```

   Kebijakan yang Anda tetapkan dengan perintah ini memungkinkan Amazon S3 untuk menjalankan fungsi Anda hanya ketika tindakan dilakukan di bucket sumber Anda.
**catatan**  
Meskipun nama bucket S3 unik secara global, saat menggunakan kebijakan berbasis sumber daya, praktik terbaik adalah menentukan bahwa bucket harus menjadi milik akun Anda. Ini karena jika Anda menghapus bucket, Anda dapat membuat bucket dengan Amazon Resource Name (ARN) yang sama. Akun AWS 

1. Simpan JSON berikut dalam file bernama`notification.json`. Saat diterapkan ke bucket sumber Anda, JSON ini mengonfigurasi bucket untuk mengirim notifikasi ke fungsi Lambda Anda setiap kali objek baru ditambahkan. Ganti Akun AWS nomor dan Wilayah AWS dalam fungsi Lambda ARN dengan nomor akun dan wilayah Anda sendiri.

   ```
   {
   "LambdaFunctionConfigurations": [
       {
         "Id": "EncryptPDFEventConfiguration",
         "LambdaFunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:EncryptPDF",
         "Events": [ "s3:ObjectCreated:Put" ]
       }
     ]
   }
   ```

1. Jalankan perintah CLI berikut untuk menerapkan pengaturan notifikasi dalam file JSON yang Anda buat ke bucket sumber Anda. Ganti `amzn-s3-demo-bucket` dengan nama bucket sumber Anda sendiri.

   ```
   aws s3api put-bucket-notification-configuration --bucket amzn-s3-demo-bucket \
   --notification-configuration file://notification.json
   ```

   Untuk mempelajari lebih lanjut tentang `put-bucket-notification-configuration` perintah dan `notification-configuration` opsi, lihat [put-bucket-notification-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-notification-configuration.html)di Referensi *Perintah AWS CLI*.

------

### Menyebarkan sumber daya menggunakan AWS SAM
<a name="file-processing-app-deploy-sam"></a>

Sebelum memulai, pastikan bahwa [Docker](https://docs.docker.com/get-docker/) dan [versi terbaru](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html) diinstal pada mesin build Anda. AWS SAMCLI

1. Di direktori proyek Anda, salin dan tempel kode berikut ke dalam file bernama`template.yaml`. Ganti nama bucket placeholder:
   + Untuk bucket sumber, ganti `amzn-s3-demo-bucket` dengan nama apa pun yang sesuai dengan aturan [penamaan bucket S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html).
   + Untuk bucket tujuan, ganti `amzn-s3-demo-bucket-encrypted` dengan`<source-bucket-name>-encrypted`, di `<source-bucket>` mana nama yang Anda pilih untuk bucket sumber Anda.

   ```
   AWSTemplateFormatVersion: '2010-09-09'
   Transform: AWS::Serverless-2016-10-31
   
   Resources:
     EncryptPDFFunction:
       Type: AWS::Serverless::Function
       Properties:
         FunctionName: EncryptPDF
         Architectures: [x86_64]
         CodeUri: ./
         Handler: lambda_function.lambda_handler
         Runtime: python3.12
         Timeout: 15
         MemorySize: 256
         LoggingConfig:
           LogFormat: JSON
         Policies:
           - AmazonS3FullAccess
         Events:
           S3Event:
             Type: S3
             Properties:
               Bucket: !Ref PDFSourceBucket
               Events: s3:ObjectCreated:*
   
     PDFSourceBucket:
       Type: AWS::S3::Bucket
       Properties:
         BucketName: amzn-s3-demo-bucket
   
     EncryptedPDFBucket:
       Type: AWS::S3::Bucket
       Properties:
         BucketName: amzn-s3-demo-bucket-encrypted
   ```

    AWS SAM Template menentukan sumber daya yang Anda buat untuk aplikasi Anda. Dalam contoh ini, template mendefinisikan fungsi Lambda menggunakan `AWS::Serverless::Function` tipe dan dua bucket S3 menggunakan tipe. `AWS::S3::Bucket` Nama bucket yang ditentukan dalam template adalah placeholder. Sebelum menerapkan aplikasi AWS SAM, Anda perlu mengedit template untuk mengganti nama bucket dengan nama unik global yang memenuhi aturan penamaan bucket [S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html). Langkah ini dijelaskan lebih lanjut dalam[Menyebarkan sumber daya menggunakan AWS SAM](#file-processing-app-deploy-sam).

   Definisi sumber daya fungsi Lambda mengonfigurasi pemicu untuk fungsi menggunakan properti event. `S3Event` Pemicu ini menyebabkan fungsi Anda dipanggil setiap kali objek dibuat di bucket sumber Anda.

   Definisi fungsi juga menentukan kebijakan AWS Identity and Access Management (IAM) yang akan dilampirkan ke peran [eksekusi](lambda-intro-execution-role.md) fungsi. [Kebijakan AWS terkelola](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies) `AmazonS3FullAccess` memberi fungsi Anda izin yang diperlukan untuk membaca dan menulis objek ke Amazon S3.

1. Jalankan perintah berikut dari direktori tempat Anda menyimpan`template.yaml`,`lambda_function.py`, dan `requirements.txt` file Anda.

   ```
   sam build --use-container
   ```

   Perintah ini mengumpulkan artefak build untuk aplikasi Anda dan menempatkannya dalam format dan lokasi yang tepat untuk menerapkannya. Menentukan `--use-container` opsi membangun fungsi Anda di dalam wadah Docker seperti Lambda. Kami menggunakannya di sini sehingga Anda tidak perlu menginstal Python 3.12 di mesin lokal Anda agar build berfungsi.

   Selama proses build, AWS SAM cari kode fungsi Lambda di lokasi yang Anda tentukan dengan `CodeUri` properti di template. Dalam hal ini, kami menentukan direktori saat ini sebagai location (`./`).

   Jika ada `requirements.txt` file, AWS SAM gunakan untuk mengumpulkan dependensi yang ditentukan. Secara default, AWS SAM buat paket deployment .zip dengan kode fungsi dan dependensi Anda. Anda juga dapat memilih untuk menerapkan fungsi Anda sebagai gambar kontainer menggunakan [PackageType](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-packagetype)properti.

1. Untuk menerapkan aplikasi Anda dan membuat sumber daya Lambda dan Amazon S3 yang ditentukan dalam template AWS SAM Anda, jalankan perintah berikut.

   ```
   sam deploy --guided
   ```

   Menggunakan `--guided` tanda berarti itu AWS SAM akan menunjukkan kepada Anda petunjuk untuk memandu Anda melalui proses penerapan. Untuk penerapan ini, terima opsi default dengan menekan Enter.

Selama proses penerapan, AWS SAM buat sumber daya berikut di: Akun AWS
+ Sebuah CloudFormation [tumpukan](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-concepts.html#cfn-concepts-stacks) bernama `sam-app`
+ Fungsi Lambda dengan nama `EncryptPDF`
+ Dua ember S3 dengan nama yang Anda pilih saat Anda mengedit file template `template.yaml` AWS SAM 
+ Peran eksekusi IAM untuk fungsi Anda dengan format nama `sam-app-EncryptPDFFunctionRole-2qGaapHFWOQ8`

Ketika AWS SAM selesai membuat sumber daya Anda, Anda akan melihat pesan berikut:

```
Successfully created/updated stack - sam-app in us-east-2
```

## Tes aplikasi
<a name="file-processing-app-test"></a>

Untuk menguji aplikasi Anda, unggah file PDF ke bucket sumber Anda, dan konfirmasikan bahwa Lambda membuat versi file terenkripsi di bucket tujuan Anda. Dalam contoh ini, Anda dapat menguji ini secara manual menggunakan konsol atau AWS CLI, atau dengan menggunakan skrip pengujian yang disediakan.

Untuk aplikasi produksi, Anda dapat menggunakan metode dan teknik pengujian tradisional, seperti pengujian unit, untuk mengonfirmasi berfungsinya kode fungsi Lambda Anda dengan benar. Praktik terbaik juga melakukan pengujian seperti yang ada di skrip pengujian yang disediakan yang melakukan pengujian integrasi dengan sumber daya berbasis cloud yang nyata. Pengujian integrasi di cloud mengonfirmasi bahwa infrastruktur Anda telah digunakan dengan benar dan bahwa peristiwa mengalir di antara berbagai layanan seperti yang diharapkan. Untuk mempelajari selengkapnya, lihat [Cara menguji fungsi dan aplikasi tanpa server](testing-guide.md).

### Menguji aplikasi secara manual
<a name="file-processing-app-test-manual"></a>

Anda dapat menguji fungsi Anda secara manual dengan menambahkan file PDF ke bucket sumber Amazon S3 Anda. Saat Anda menambahkan file ke bucket sumber, fungsi Lambda Anda akan dipanggil secara otomatis dan harus menyimpan versi file terenkripsi di bucket target Anda.

------
#### [ Console ]

**Untuk menguji aplikasi Anda dengan mengunggah file (konsol)**

1. Untuk mengunggah file PDF ke bucket S3 Anda, lakukan hal berikut:

   1. Buka halaman [Bucket di](https://console.aws.amazon.com/s3/buckets) konsol Amazon S3 dan pilih bucket sumber Anda.

   1. Pilih **Unggah**.

   1. Pilih **Tambahkan file** dan gunakan pemilih file untuk memilih file PDF yang ingin Anda unggah.

   1. Pilih **Buka**, lalu pilih **Unggah**.

1. Verifikasi bahwa Lambda telah menyimpan versi terenkripsi file PDF Anda di bucket target Anda dengan melakukan hal berikut:

   1. Arahkan kembali ke halaman [Bucket di](https://console.aws.amazon.com/s3/buckets) konsol Amazon S3 dan pilih bucket tujuan Anda.

   1. Di panel **Objects**, Anda sekarang akan melihat file dengan format nama `filename_encrypted.pdf` (di mana `filename.pdf` nama file yang Anda unggah ke bucket sumber Anda). **Untuk mengunduh PDF terenkripsi Anda, pilih file, lalu pilih Unduh.**

   1. Konfirmasikan bahwa Anda dapat membuka file yang diunduh dengan kata sandi fungsi Lambda Anda melindunginya dengan ()`my-secret-password`.

------
#### [ AWS CLI ]

**Untuk menguji aplikasi Anda dengan mengunggah file ()AWS CLI**

1. Dari direktori yang berisi file PDF yang ingin Anda unggah, jalankan perintah CLI berikut. Ganti `--bucket` parameter dengan nama bucket sumber Anda. Untuk `--body` parameter `--key` dan, gunakan nama file file pengujian Anda.

   ```
   aws s3api put-object --bucket amzn-s3-demo-bucket --key test.pdf --body ./test.pdf
   ```

1. Verifikasi bahwa fungsi Anda telah membuat versi terenkripsi dari file Anda dan menyimpannya ke bucket S3 target Anda. Jalankan perintah CLI berikut, ganti `amzn-s3-demo-bucket-encrypted` dengan nama bucket tujuan Anda sendiri.

   ```
   aws s3api list-objects-v2 --bucket amzn-s3-demo-bucket-encrypted
   ```

   Jika fungsi Anda berjalan dengan sukses, Anda akan melihat output yang mirip dengan berikut ini. Bucket target Anda harus berisi file dengan format nama`<your_test_file>_encrypted.pdf`, di `<your_test_file>` mana nama file yang Anda unggah.

   ```
   {
       "Contents": [
           {
               "Key": "test_encrypted.pdf",
               "LastModified": "2023-06-07T00:15:50+00:00",
               "ETag": "\"7781a43e765a8301713f533d70968a1e\"",
               "Size": 2763,
               "StorageClass": "STANDARD"
           }
       ]
   }
   ```

1. Untuk mengunduh file yang disimpan Lambda di bucket tujuan Anda, jalankan perintah CLI berikut. Ganti `--bucket` parameter dengan nama bucket tujuan Anda. Untuk `--key` parameternya, gunakan nama file`<your_test_file>_encrypted.pdf`, di `<your_test_file>` mana nama file pengujian yang Anda unggah.

   ```
   aws s3api get-object --bucket amzn-s3-demo-bucket-encrypted --key test_encrypted.pdf my_encrypted_file.pdf
   ```

   Perintah ini mengunduh file ke direktori Anda saat ini dan menyimpannya sebagai`my_encrypted_file.pdf`.

1. Konfirmasikan bahwa Anda dapat membuka file yang diunduh dengan kata sandi fungsi Lambda Anda melindunginya dengan ()`my-secret-password`.

------

### Menguji aplikasi dengan skrip otomatis
<a name="file-processing-app-test-auto"></a>

Buat file berikut di direktori proyek Anda:
+ `test_pdf_encrypt.py`- skrip pengujian yang dapat Anda gunakan untuk menguji aplikasi Anda secara otomatis
+ `pytest.ini`- file konfigurasi untuk skrip pengujian

Perluas bagian berikut untuk melihat kode dan untuk mempelajari lebih lanjut tentang peran setiap file.

#### Skrip pengujian otomatis
<a name="file-processing-app-test-script"></a>

Salin dan tempel kode berikut ke dalam file bernama`test_pdf_encrypt.py`. Pastikan untuk mengganti nama bucket placeholder:
+ Dalam `test_source_bucket_available` fungsinya, ganti `amzn-s3-demo-bucket` dengan nama bucket sumber Anda.
+ Dalam `test_encrypted_file_in_bucket` fungsinya, ganti `amzn-s3-demo-bucket-encrypted` dengan`source-bucket-encrypted`, di `source-bucket>` mana nama bucket sumber Anda.
+ Dalam `cleanup` fungsi, ganti `amzn-s3-demo-bucket` dengan nama bucket sumber Anda, dan ganti `amzn-s3-demo-bucket-encrypted` dengan nama bucket tujuan Anda.

```
import boto3
import json
import pytest
import time
import os

@pytest.fixture
def lambda_client():
    return boto3.client('lambda')
    
@pytest.fixture
def s3_client():
    return boto3.client('s3')

@pytest.fixture
def logs_client():
    return boto3.client('logs')

@pytest.fixture(scope='session')
def cleanup():
    # Create a new S3 client for cleanup
    s3_client = boto3.client('s3')

    yield
    # Cleanup code will be executed after all tests have finished

    # Delete test.pdf from the source bucket
    source_bucket = 'amzn-s3-demo-bucket'
    source_file_key = 'test.pdf'
    s3_client.delete_object(Bucket=source_bucket, Key=source_file_key)
    print(f"\nDeleted {source_file_key} from {source_bucket}")

    # Delete test_encrypted.pdf from the destination bucket
    destination_bucket = 'amzn-s3-demo-bucket-encrypted'
    destination_file_key = 'test_encrypted.pdf'
    s3_client.delete_object(Bucket=destination_bucket, Key=destination_file_key)
    print(f"Deleted {destination_file_key} from {destination_bucket}")
        

@pytest.mark.order(1)
def test_source_bucket_available(s3_client):
    s3_bucket_name = 'amzn-s3-demo-bucket'
    file_name = 'test.pdf'
    file_path = os.path.join(os.path.dirname(__file__), file_name)

    file_uploaded = False
    try:
        s3_client.upload_file(file_path, s3_bucket_name, file_name)
        file_uploaded = True
    except:
        print("Error: couldn't upload file")

    assert file_uploaded, "Could not upload file to S3 bucket"

    

@pytest.mark.order(2)
def test_lambda_invoked(logs_client):

    # Wait for a few seconds to make sure the logs are available
    time.sleep(5)

    # Get the latest log stream for the specified log group
    log_streams = logs_client.describe_log_streams(
        logGroupName='/aws/lambda/EncryptPDF',
        orderBy='LastEventTime',
        descending=True,
        limit=1
    )

    latest_log_stream_name = log_streams['logStreams'][0]['logStreamName']

    # Retrieve the log events from the latest log stream
    log_events = logs_client.get_log_events(
        logGroupName='/aws/lambda/EncryptPDF',
        logStreamName=latest_log_stream_name
    )

    success_found = False
    for event in log_events['events']:
        message = json.loads(event['message'])
        status = message.get('record', {}).get('status')
        if status == 'success':
            success_found = True
            break

    assert success_found, "Lambda function execution did not report 'success' status in logs."

@pytest.mark.order(3)
def test_encrypted_file_in_bucket(s3_client):
    # Specify the destination S3 bucket and the expected converted file key
    destination_bucket = 'amzn-s3-demo-bucket-encrypted'
    converted_file_key = 'test_encrypted.pdf'

    try:
        # Attempt to retrieve the metadata of the converted file from the destination S3 bucket
        s3_client.head_object(Bucket=destination_bucket, Key=converted_file_key)
    except s3_client.exceptions.ClientError as e:
        # If the file is not found, the test will fail
        pytest.fail(f"Converted file '{converted_file_key}' not found in the destination bucket: {str(e)}")

def test_cleanup(cleanup):
    # This test uses the cleanup fixture and will be executed last
    pass
```

Skrip pengujian otomatis menjalankan tiga fungsi pengujian untuk mengonfirmasi pengoperasian aplikasi Anda yang benar:
+ Pengujian `test_source_bucket_available` mengonfirmasi bahwa bucket sumber Anda telah berhasil dibuat dengan mengunggah file PDF pengujian ke bucket.
+ Pengujian `test_lambda_invoked` menginterogasi aliran CloudWatch log Log terbaru untuk fungsi Anda guna mengonfirmasi bahwa saat Anda mengunggah file pengujian, fungsi Lambda Anda berjalan dan melaporkan keberhasilan.
+ Pengujian `test_encrypted_file_in_bucket` mengonfirmasi bahwa bucket tujuan Anda berisi file terenkripsi. `test_encrypted.pdf`

Setelah semua pengujian ini berjalan, skrip menjalankan langkah pembersihan tambahan untuk menghapus `test_encrypted.pdf` file `test.pdf` dan dari bucket sumber dan tujuan Anda.

Seperti halnya AWS SAM template, nama bucket yang ditentukan dalam file ini adalah placeholder. Sebelum menjalankan pengujian, Anda perlu mengedit file ini dengan nama bucket asli aplikasi Anda. Langkah ini dijelaskan lebih lanjut dalam [Menguji aplikasi dengan skrip otomatis](#file-processing-app-test-auto)

#### File konfigurasi skrip uji
<a name="file-processing-app-test-config"></a>

Salin dan tempel kode berikut ke dalam file bernama`pytest.ini`.

```
[pytest]
markers =
    order: specify test execution order
```

Ini diperlukan untuk menentukan urutan pengujian dalam `test_pdf_encrypt.py` skrip berjalan.

Untuk menjalankan tes lakukan hal berikut:

1. Pastikan `pytest` modul dipasang di lingkungan lokal Anda. Anda dapat menginstal `pytest` dengan menjalankan perintah berikut:

   ```
   pip install pytest
   ```

1. Simpan file PDF bernama `test.pdf` di direktori yang berisi `pytest.ini` file `test_pdf_encrypt.py` dan.

1. Buka terminal atau program shell dan jalankan perintah berikut dari direktori yang berisi file uji.

   ```
   pytest -s -v
   ```

   Ketika tes selesai, Anda akan melihat output seperti berikut:

   ```
   ============================================================== test session starts =========================================================
   platform linux -- Python 3.12.2, pytest-7.2.2, pluggy-1.0.0 -- /usr/bin/python3
   cachedir: .pytest_cache
   hypothesis profile 'default' -> database=DirectoryBasedExampleDatabase('/home/pdf_encrypt_app/.hypothesis/examples')
   Test order randomisation NOT enabled. Enable with --random-order or --random-order-bucket=<bucket_type>
   rootdir: /home/pdf_encrypt_app, configfile: pytest.ini
   plugins: anyio-3.7.1, hypothesis-6.70.0, localserver-0.7.1, random-order-1.1.0
   collected 4 items
   
   test_pdf_encrypt.py::test_source_bucket_available PASSED
   test_pdf_encrypt.py::test_lambda_invoked PASSED
   test_pdf_encrypt.py::test_encrypted_file_in_bucket PASSED
   test_pdf_encrypt.py::test_cleanup PASSED
   Deleted test.pdf from amzn-s3-demo-bucket
   Deleted test_encrypted.pdf from amzn-s3-demo-bucket-encrypted
   
   
   =============================================================== 4 passed in 7.32s ==========================================================
   ```

## Langkah selanjutnya
<a name="file-processing-app-next-steps"></a>

Sekarang Anda telah membuat aplikasi contoh ini, Anda dapat menggunakan kode yang disediakan sebagai dasar untuk membuat jenis aplikasi pemrosesan file lainnya. Ubah kode dalam `lambda_function.py` file untuk mengimplementasikan logika pemrosesan file untuk kasus penggunaan Anda.

Banyak kasus penggunaan pemrosesan file yang khas melibatkan pemrosesan gambar. Saat menggunakan Python, perpustakaan pemrosesan gambar yang paling populer seperti [bantal](https://pypi.org/project/pillow/) biasanya berisi komponen C atau C \$1\$1. Untuk memastikan bahwa paket penerapan fungsi Anda kompatibel dengan lingkungan eksekusi Lambda, penting untuk menggunakan biner distribusi sumber yang benar.

Saat menerapkan sumber daya Anda AWS SAM, Anda perlu mengambil beberapa langkah ekstra untuk menyertakan distribusi sumber yang tepat dalam paket penerapan Anda. Karena AWS SAM tidak akan menginstal dependensi untuk platform yang berbeda dari mesin build Anda, menentukan distribusi sumber (`.whl`file) yang benar dalam `requirements.txt` file Anda tidak akan berfungsi jika mesin build Anda menggunakan sistem operasi atau arsitektur yang berbeda dari lingkungan eksekusi Lambda. Sebagai gantinya, Anda harus melakukan salah satu hal berikut:
+ Gunakan `--use-container` opsi saat menjalankan`sam build`. Saat Anda menentukan opsi ini, AWS SAM unduh gambar dasar kontainer yang kompatibel dengan lingkungan eksekusi Lambda dan buat paket penerapan fungsi Anda dalam wadah Docker menggunakan gambar itu. Untuk mempelajari lebih lanjut, lihat [Membangun fungsi Lambda di dalam wadah yang disediakan](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/using-sam-cli-build.html#using-sam-cli-build-options-container).
+ Buat sendiri paket.zip deployment fungsi Anda menggunakan biner distribusi sumber yang benar dan simpan file.zip di direktori yang Anda tentukan seperti `CodeUri` di template. AWS SAM Untuk mempelajari lebih lanjut tentang membangun paket deployment .zip untuk Python menggunakan distribusi biner, lihat dan. [Membuat paket penerapan.zip dengan dependensi](python-package.md#python-package-create-dependencies) [Membuat paket penerapan.zip dengan pustaka asli](python-package.md#python-package-native-libraries)

# Membuat aplikasi untuk melakukan pemeliharaan database terjadwal
<a name="scheduled-task-app"></a>

Anda dapat menggunakan AWS Lambda untuk mengganti proses terjadwal seperti pencadangan sistem otomatis, konversi file, dan tugas pemeliharaan. Dalam contoh ini, Anda membuat aplikasi tanpa server yang melakukan pemeliharaan terjadwal rutin pada tabel DynamoDB dengan menghapus entri lama. Aplikasi ini menggunakan EventBridge Scheduler untuk menjalankan fungsi Lambda pada jadwal cron. Saat dipanggil, fungsi menanyakan tabel untuk item yang lebih tua dari satu tahun, dan menghapusnya. Fungsi mencatat setiap item yang dihapus di CloudWatch Log.

Untuk mengimplementasikan contoh ini, pertama buat tabel DynamoDB dan isi dengan beberapa data uji untuk fungsi Anda untuk query. Kemudian, buat fungsi Lambda Python dengan pemicu EventBridge Scheduler dan peran eksekusi IAM yang memberikan izin fungsi untuk membaca, dan menghapus, item dari tabel Anda.

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/ExampleApps/cron_app.png)


**Tip**  
Jika Anda baru mengenal Lambda, kami sarankan Anda menyelesaikan tutorial [Buat fungsi Lambda pertama Anda](getting-started.md) sebelum membuat aplikasi contoh ini.

Anda dapat menerapkan aplikasi secara manual dengan membuat dan mengonfigurasi sumber daya dengan aplikasi. Konsol Manajemen AWS Anda juga dapat menerapkan aplikasi dengan menggunakan AWS Serverless Application Model (AWS SAM). AWS SAM adalah alat infrastruktur sebagai kode (IAc). Dengan IAc, Anda tidak membuat sumber daya secara manual, tetapi mendefinisikannya dalam kode dan kemudian menerapkannya secara otomatis.

Jika Anda ingin mempelajari lebih lanjut tentang menggunakan Lambda dengan IAc sebelum menerapkan aplikasi contoh ini, lihat. [Menggunakan Lambda dengan infrastruktur sebagai kode (IAc)](foundation-iac.md)

## Prasyarat
<a name="scheduled-task-app-prereqs"></a>

Sebelum Anda dapat membuat aplikasi contoh, pastikan Anda memiliki alat dan program baris perintah yang diperlukan diinstal.
+ **Python**

  Untuk mengisi tabel DynamoDB yang Anda buat untuk menguji aplikasi, contoh ini menggunakan skrip Python dan file CSV untuk menulis data ke dalam tabel. Pastikan Anda memiliki Python versi 3.8 atau yang lebih baru diinstal pada mesin Anda.
+ **AWS SAM CLI**

  Jika Anda ingin membuat tabel DynamoDB dan menerapkan aplikasi contoh AWS SAM menggunakan, Anda perlu menginstal CLI. AWS SAM Ikuti [petunjuk penginstalan](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html) di *Panduan AWS SAM Pengguna*.
+ **AWS CLI**

  Untuk menggunakan skrip Python yang disediakan untuk mengisi tabel pengujian Anda, Anda harus menginstal dan mengkonfigurasi file. AWS CLI Ini karena skrip menggunakan AWS SDK untuk Python (Boto3), yang membutuhkan akses ke kredensil AWS Identity and Access Management (IAM) Anda. Anda juga perlu AWS CLI diinstal untuk menyebarkan sumber daya menggunakan AWS SAM. Instal CLI dengan mengikuti [petunjuk penginstalan](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) di *AWS Command Line Interface Panduan Pengguna*.
+ **Docker**

  Untuk menerapkan aplikasi menggunakan AWS SAM, Docker juga harus diinstal pada mesin build Anda. Ikuti petunjuk di [Instal Docker Engine](https://docs.docker.com/engine/install/) di situs web dokumentasi Docker.

## Mengunduh contoh file aplikasi
<a name="scheduled-task-app-download"></a>

Untuk membuat database contoh dan aplikasi pemeliharaan terjadwal, Anda perlu membuat file berikut di direktori proyek Anda:

**Contoh file database**
+ `template.yaml`- AWS SAM Template yang dapat Anda gunakan untuk membuat tabel DynamoDB
+ `sample_data.csv`- file CSV yang berisi data sampel untuk dimuat ke dalam tabel Anda
+ `load_sample_data.py`- skrip Python yang menulis data dalam file CSV ke dalam tabel

**File aplikasi pemeliharaan terjadwal**
+ `lambda_function.py`- kode fungsi Python untuk fungsi Lambda yang melakukan pemeliharaan database
+ `requirements.txt`- file manifes yang mendefinisikan dependensi yang dibutuhkan kode fungsi Python Anda
+ `template.yaml`- AWS SAM Template yang dapat Anda gunakan untuk menyebarkan aplikasi

**File uji**
+ `test_app.py`- skrip Python yang memindai tabel dan mengonfirmasi keberhasilan operasi fungsi Anda dengan mengeluarkan semua catatan yang lebih tua dari satu tahun

Perluas bagian berikut untuk melihat kode dan mempelajari lebih lanjut tentang peran setiap file dalam membuat dan menguji aplikasi Anda. Untuk membuat file di mesin lokal Anda, salin dan tempel kode di bawah ini.

### AWS SAM template (contoh tabel DynamoDB)
<a name="scheduled-task-app-table-yaml"></a>

Salin dan tempel kode berikut ke dalam file bernama`template.yaml`.

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: SAM Template for DynamoDB Table with Order_number as Partition Key and Date as Sort Key

Resources:
  MyDynamoDBTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
    Properties:
      TableName: MyOrderTable
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - AttributeName: Order_number
          AttributeType: S
        - AttributeName: Date
          AttributeType: S
      KeySchema:
        - AttributeName: Order_number
          KeyType: HASH
        - AttributeName: Date
          KeyType: RANGE
      SSESpecification:
        SSEEnabled: true
      GlobalSecondaryIndexes:
        - IndexName: Date-index
          KeySchema:
            - AttributeName: Date
              KeyType: HASH
          Projection:
            ProjectionType: ALL
      PointInTimeRecoverySpecification:
        PointInTimeRecoveryEnabled: true

Outputs:
  TableName:
    Description: DynamoDB Table Name
    Value: !Ref MyDynamoDBTable
  TableArn:
    Description: DynamoDB Table ARN
    Value: !GetAtt MyDynamoDBTable.Arn
```

**catatan**  
AWS SAM template menggunakan konvensi penamaan standar`template.yaml`. Dalam contoh ini, Anda memiliki dua file template - satu untuk membuat database contoh dan satu lagi untuk membuat aplikasi itu sendiri. Simpan di sub-direktori terpisah di folder proyek Anda.

 AWS SAM Template ini mendefinisikan resource tabel DynamoDB yang Anda buat untuk menguji aplikasi Anda. Tabel menggunakan kunci utama `Order_number` dengan semacam kunci`Date`. Agar fungsi Lambda Anda menemukan item secara langsung berdasarkan tanggal, kami juga mendefinisikan [Indeks Sekunder Global bernama](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html). `Date-index`

*Untuk mempelajari selengkapnya tentang membuat dan mengonfigurasi tabel DynamoDB menggunakan `AWS::DynamoDB::Table` sumber daya, [AWS lihat: :DynamoDB: :Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html) di Panduan Pengguna.AWS CloudFormation *

### Contoh file data database
<a name="scheduled-task-app-csv-file"></a>

Salin dan tempel kode berikut ke dalam file bernama`sample_data.csv`.

```
Date,Order_number,CustomerName,ProductID,Quantity,TotalAmount
2023-09-01,ORD001,Alejandro Rosalez,PROD123,2,199.98
2023-09-01,ORD002,Akua Mansa,PROD456,1,49.99
2023-09-02,ORD003,Ana Carolina Silva,PROD789,3,149.97
2023-09-03,ORD004,Arnav Desai,PROD123,1,99.99
2023-10-01,ORD005,Carlos Salazar,PROD456,2,99.98
2023-10-02,ORD006,Diego Ramirez,PROD789,1,49.99
2023-10-03,ORD007,Efua Owusu,PROD123,4,399.96
2023-10-04,ORD008,John Stiles,PROD456,2,99.98
2023-10-05,ORD009,Jorge Souza,PROD789,3,149.97
2023-10-06,ORD010,Kwaku Mensah,PROD123,1,99.99
2023-11-01,ORD011,Li Juan,PROD456,5,249.95
2023-11-02,ORD012,Marcia Oliveria,PROD789,2,99.98
2023-11-03,ORD013,Maria Garcia,PROD123,3,299.97
2023-11-04,ORD014,Martha Rivera,PROD456,1,49.99
2023-11-05,ORD015,Mary Major,PROD789,4,199.96
2023-12-01,ORD016,Mateo Jackson,PROD123,2,199.99
2023-12-02,ORD017,Nikki Wolf,PROD456,3,149.97
2023-12-03,ORD018,Pat Candella,PROD789,1,49.99
2023-12-04,ORD019,Paulo Santos,PROD123,5,499.95
2023-12-05,ORD020,Richard Roe,PROD456,2,99.98
2024-01-01,ORD021,Saanvi Sarkar,PROD789,3,149.97
2024-01-02,ORD022,Shirley Rodriguez,PROD123,1,99.99
2024-01-03,ORD023,Sofia Martinez,PROD456,4,199.96
2024-01-04,ORD024,Terry Whitlock,PROD789,2,99.98
2024-01-05,ORD025,Wang Xiulan,PROD123,3,299.97
```

File ini berisi beberapa contoh data uji untuk mengisi tabel DynamoDB Anda dengan format nilai dipisahkan koma (CSV) standar.

### Skrip Python untuk memuat data sampel
<a name="scheduled-task-app-load-script"></a>

Salin dan tempel kode berikut ke dalam file bernama`load_sample_data.py`.

```
import boto3
import csv
from decimal import Decimal

# Initialize the DynamoDB client
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('MyOrderTable') 
print("DDB client initialized.")

def load_data_from_csv(filename):
    with open(filename, 'r') as file:
        csv_reader = csv.DictReader(file)
        for row in csv_reader:
            item = {
                'Order_number': row['Order_number'],
                'Date': row['Date'],
                'CustomerName': row['CustomerName'],
                'ProductID': row['ProductID'],
                'Quantity': int(row['Quantity']),
                'TotalAmount': Decimal(str(row['TotalAmount']))
            }
            table.put_item(Item=item)
            print(f"Added item: {item['Order_number']} - {item['Date']}")

if __name__ == "__main__":
    load_data_from_csv('sample_data.csv')
    print("Data loading completed.")
```

Script Python ini pertama kali menggunakan AWS SDK untuk Python (Boto3) untuk membuat koneksi ke tabel DynamoDB Anda. Kemudian iterasi di setiap baris dalam file CSV contoh-data, membuat item dari baris itu, dan menulis item ke tabel DynamoDB menggunakan boto3 SDK.

### Kode fungsi Python
<a name="scheduled-task-app-function-code"></a>

Salin dan tempel kode berikut ke dalam file bernama`lambda_function.py`.

```
import boto3
from datetime import datetime, timedelta
from boto3.dynamodb.conditions import Key, Attr
import logging

logger = logging.getLogger()
logger.setLevel("INFO")

def lambda_handler(event, context):
    # Initialize the DynamoDB client
    dynamodb = boto3.resource('dynamodb')
    
    # Specify the table name
    table_name = 'MyOrderTable'
    table = dynamodb.Table(table_name)
    
    # Get today's date
    today = datetime.now()
    
    # Calculate the date one year ago
    one_year_ago = (today - timedelta(days=365)).strftime('%Y-%m-%d')
    
    # Scan the table using a global secondary index
    response = table.scan(
        IndexName='Date-index',
        FilterExpression='#date < :one_year_ago',
        ExpressionAttributeNames={
            '#date': 'Date'
        },
        ExpressionAttributeValues={
            ':one_year_ago': one_year_ago
        }
    )
    
     # Delete old items
    with table.batch_writer() as batch:
        for item in response['Items']:
            Order_number = item['Order_number']
            batch.delete_item(
                Key={
                    'Order_number': Order_number,
                    'Date': item['Date']
                }
            )
            logger.info(f'deleted order number {Order_number}')
    
    # Check if there are more items to scan
    while 'LastEvaluatedKey' in response:
        response = table.scan(
            IndexName='DateIndex',
            FilterExpression='#date < :one_year_ago',
            ExpressionAttributeNames={
                '#date': 'Date'
            },
            ExpressionAttributeValues={
                ':one_year_ago': one_year_ago
            },
            ExclusiveStartKey=response['LastEvaluatedKey']
        )
        
        # Delete old items
        with table.batch_writer() as batch:
            for item in response['Items']:
                batch.delete_item(
                    Key={
                        'Order_number': item['Order_number'],
                        'Date': item['Date']
                    }
                )
    
    return {
        'statusCode': 200,
        'body': 'Cleanup completed successfully'
    }
```

Kode fungsi Python berisi fungsi [handler () `lambda_handler` yang dijalankan Lambda saat fungsi](python-handler.md) Anda dipanggil.

Ketika fungsi dipanggil oleh EventBridge Scheduler, ia menggunakan AWS SDK untuk Python (Boto3) untuk membuat koneksi ke tabel DynamoDB di mana tugas pemeliharaan terjadwal akan dilakukan. Kemudian menggunakan `datetime` pustaka Python untuk menghitung tanggal satu tahun yang lalu, sebelum memindai tabel untuk item yang lebih tua dari ini dan menghapusnya.

Perhatikan bahwa tanggapan dari kueri DynamoDB dan operasi pemindaian dibatasi hingga ukuran maksimum 1 MB. Jika respon lebih besar dari 1 MB, DynamoDB paginates data dan mengembalikan `LastEvaluatedKey` elemen dalam respon. Untuk memastikan bahwa fungsi kami memproses semua catatan dalam tabel, kami memeriksa keberadaan kunci ini dan terus melakukan pemindaian tabel dari posisi yang dievaluasi terakhir hingga seluruh tabel dipindai.

### `requirements.txt`file manifes
<a name="scheduled-task-app-dependencies"></a>

Salin dan tempel kode berikut ke dalam file bernama`requirements.txt`.

```
boto3
```

Untuk contoh ini, kode fungsi Anda hanya memiliki satu dependensi yang bukan bagian dari pustaka Python standar - SDK for Python (Boto3) yang digunakan fungsi untuk memindai dan menghapus item dari tabel DynamoDB.

**catatan**  
Versi SDK untuk Python (Boto3) disertakan sebagai bagian dari runtime Lambda, sehingga kode Anda akan berjalan tanpa menambahkan Boto3 ke paket penerapan fungsi Anda. Namun, untuk mempertahankan kontrol penuh dependensi fungsi Anda dan menghindari kemungkinan masalah dengan misalignment versi, praktik terbaik untuk Python adalah menyertakan semua dependensi fungsi dalam paket penerapan fungsi Anda. Lihat [Dependensi runtime dengan Python](python-package.md#python-package-dependencies) untuk mempelajari selengkapnya.

### AWS SAM template (aplikasi pemeliharaan terjadwal)
<a name="scheduled-task-app-table-yaml"></a>

Salin dan tempel kode berikut ke dalam file bernama`template.yaml`.

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: SAM Template for Lambda function and EventBridge Scheduler rule

Resources:
  MyLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: ScheduledDBMaintenance
      CodeUri: ./
      Handler: lambda_function.lambda_handler
      Runtime: python3.11
      Architectures:
        - x86_64
      Events:
        ScheduleEvent:
          Type: ScheduleV2
          Properties:
            ScheduleExpression: cron(0 3 1 * ? *)
            Description: Run on the first day of every month at 03:00 AM
      Policies:
        - CloudWatchLogsFullAccess
        - Statement:
            - Effect: Allow
              Action:
                - dynamodb:Scan
                - dynamodb:BatchWriteItem
              Resource: !Sub 'arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/MyOrderTable'

  LambdaLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub /aws/lambda/${MyLambdaFunction}
      RetentionInDays: 30

Outputs:
  LambdaFunctionName:
    Description: Lambda Function Name
    Value: !Ref MyLambdaFunction
  LambdaFunctionArn:
    Description: Lambda Function ARN
    Value: !GetAtt MyLambdaFunction.Arn
```

**catatan**  
AWS SAM template menggunakan konvensi penamaan standar`template.yaml`. Dalam contoh ini, Anda memiliki dua file template - satu untuk membuat database contoh dan satu lagi untuk membuat aplikasi itu sendiri. Simpan di sub-direktori terpisah di folder proyek Anda.

 AWS SAM Template ini mendefinisikan resource untuk aplikasi Anda. Kami mendefinisikan fungsi Lambda menggunakan sumber daya. `AWS::Serverless::Function` Jadwal EventBridge Scheduler dan pemicu untuk memanggil fungsi Lambda dibuat dengan menggunakan `Events` properti sumber daya ini menggunakan tipe. `ScheduleV2` *Untuk mempelajari selengkapnya tentang menentukan jadwal EventBridge Penjadwal dalam AWS SAM templat, lihat [ScheduleV2](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-schedulev2.html) di Panduan Pengembang.AWS Serverless Application Model *

Selain fungsi Lambda dan jadwal EventBridge Scheduler, kami juga mendefinisikan grup CloudWatch log untuk fungsi Anda untuk mengirim catatan item yang dihapus ke.

### Skrip uji
<a name="scheduled-task-app-test-script"></a>

Salin dan tempel kode berikut ke dalam file bernama`test_app.py`.

```
import boto3
from datetime import datetime, timedelta
import json

# Initialize the DynamoDB client
dynamodb = boto3.resource('dynamodb')

# Specify your table name
table_name = 'YourTableName'
table = dynamodb.Table(table_name)

# Get the current date
current_date = datetime.now()

# Calculate the date one year ago
one_year_ago = current_date - timedelta(days=365)

# Convert the date to string format (assuming the date in DynamoDB is stored as a string)
one_year_ago_str = one_year_ago.strftime('%Y-%m-%d')

# Scan the table
response = table.scan(
    FilterExpression='#date < :one_year_ago',
    ExpressionAttributeNames={
        '#date': 'Date'
    },
    ExpressionAttributeValues={
        ':one_year_ago': one_year_ago_str
    }
)

# Process the results
old_records = response['Items']

# Continue scanning if we have more items (pagination)
while 'LastEvaluatedKey' in response:
    response = table.scan(
        FilterExpression='#date < :one_year_ago',
        ExpressionAttributeNames={
            '#date': 'Date'
        },
        ExpressionAttributeValues={
            ':one_year_ago': one_year_ago_str
        },
        ExclusiveStartKey=response['LastEvaluatedKey']
    )
    old_records.extend(response['Items'])

for record in old_records:
    print(json.dumps(record))

# The total number of old records should be zero.
print(f"Total number of old records: {len(old_records)}")
```

Skrip pengujian ini menggunakan AWS SDK untuk Python (Boto3) untuk membuat koneksi ke tabel DynamoDB Anda dan memindai item yang lebih tua dari satu tahun. Untuk mengonfirmasi apakah fungsi Lambda telah berjalan dengan sukses, pada akhir pengujian, fungsi mencetak jumlah catatan yang lebih tua dari satu tahun masih dalam tabel. Jika fungsi Lambda berhasil, jumlah catatan lama dalam tabel harus nol. 

## Membuat dan mengisi tabel contoh DynamoDB
<a name="scheduled-task-app-create-table"></a>

Untuk menguji aplikasi pemeliharaan terjadwal, pertama-tama Anda membuat tabel DynamoDB dan mengisinya dengan beberapa data sampel. Anda dapat membuat tabel baik secara manual menggunakan Konsol Manajemen AWS atau dengan menggunakan AWS SAM. Kami menyarankan Anda menggunakan AWS SAM untuk membuat dan mengkonfigurasi tabel dengan cepat menggunakan beberapa AWS CLI perintah.

------
#### [ Console ]

**Untuk membuat tabel DynamoDB**

1. Buka [halaman Tabel](https://console.aws.amazon.com/dynamodbv2/home#tables) di konsol DynamoDB.

1. Pilih **Buat tabel**.

1. Buat tabel dengan melakukan hal berikut:

   1. Di bawah **Rincian tabel**, untuk **nama Tabel**, masukkan**MyOrderTable**.

   1. Untuk **kunci Partition**, masukkan **Order\$1number** dan biarkan tipe sebagai **String**.

   1. Untuk **tombol Sort**, masukkan **Date** dan biarkan tipe sebagai **String**.

   1. Biarkan **pengaturan Tabel** diatur ke **Pengaturan default** dan pilih **Buat tabel**.

1. Ketika tabel Anda telah selesai dibuat dan **Statusnya** ditampilkan sebagai **Aktif**, buat indeks sekunder global (GSI) dengan melakukan hal berikut. Aplikasi Anda akan menggunakan GSI ini untuk mencari item secara langsung berdasarkan tanggal untuk menentukan apa yang akan dihapus.

   1. Pilih **MyOrderTable**dari daftar tabel.

   1. Pilih tab **Indeks**.

   1. Di bawah **Indeks sekunder global**, pilih **Buat indeks**.

   1. Di bawah **Detail indeks**, masukkan **Date** untuk **kunci Partition** dan biarkan **tipe Data** diatur ke **String**.

   1. Untuk **Nama indeks**, masukkan **Date-index**.

   1. Biarkan semua parameter lain diatur ke nilai defaultnya, gulir ke bagian bawah halaman, dan pilih **Buat indeks**.

------
#### [ AWS SAM ]

**Untuk membuat tabel DynamoDB**

1. Arahkan ke folder tempat Anda menyimpan `template.yaml` file untuk tabel DynamoDB. Perhatikan bahwa contoh ini menggunakan dua `template.yaml` file. Pastikan mereka disimpan dalam sub-folder terpisah dan bahwa Anda berada di folder yang benar berisi template untuk membuat tabel DynamoDB Anda.

1. Jalankan perintah berikut.

   ```
   sam build
   ```

   Perintah ini mengumpulkan artefak build untuk sumber daya yang ingin Anda terapkan dan menempatkannya dalam format dan lokasi yang tepat untuk menerapkannya.

1. Untuk membuat sumber daya DynamoDB yang ditentukan dalam `template.yaml` file, jalankan perintah berikut.

   ```
   sam deploy --guided
   ```

   Menggunakan `--guided` tanda berarti itu AWS SAM akan menunjukkan kepada Anda petunjuk untuk memandu Anda melalui proses penerapan. Untuk penyebaran ini, masukkan a `Stack name` dari**cron-app-test-db**, dan terima default untuk semua opsi lain dengan menggunakan Enter.

   Setelah AWS SAM selesai membuat sumber daya DynamoDB, Anda akan melihat pesan berikut.

   ```
   Successfully created/updated stack - cron-app-test-db in us-west-2
   ```

1. [Anda juga dapat mengonfirmasi bahwa tabel DynamoDB telah dibuat dengan membuka halaman Tabel dari konsol DynamoDB.](https://console.aws.amazon.com/dynamodbv2/home#tables) Anda harus melihat tabel bernama`MyOrderTable`.

------

Setelah membuat tabel, Anda selanjutnya menambahkan beberapa data sampel untuk menguji aplikasi Anda. File CSV yang `sample_data.csv` Anda unduh sebelumnya berisi sejumlah contoh entri yang terdiri dari nomor pesanan, tanggal, dan informasi pelanggan dan pesanan. Gunakan skrip python yang disediakan `load_sample_data.py` untuk menambahkan data ini ke tabel Anda.

**Untuk menambahkan data sampel ke tabel**

1. Arahkan ke direktori yang berisi `load_sample_data.py` file `sample_data.csv` dan. Jika file-file ini berada di direktori terpisah, pindahkan agar file tersebut disimpan di lokasi yang sama.

1. Buat lingkungan virtual Python untuk menjalankan skrip dengan menjalankan perintah berikut. Kami menyarankan Anda menggunakan lingkungan virtual karena pada langkah berikut Anda harus menginstal AWS SDK untuk Python (Boto3).

   ```
   python -m venv venv
   ```

1. Aktifkan lingkungan virtual dengan menjalankan perintah berikut.

   ```
   source venv/bin/activate
   ```

1. Instal SDK for Python (Boto3) di lingkungan virtual Anda dengan menjalankan perintah berikut. Skrip menggunakan pustaka ini untuk terhubung ke tabel DynamoDB Anda dan menambahkan item.

   ```
   pip install boto3
   ```

1. Jalankan skrip untuk mengisi tabel dengan menjalankan perintah berikut.

   ```
   python load_sample_data.py
   ```

   Jika skrip berjalan dengan sukses, skrip harus mencetak setiap item ke konsol saat memuat dan melaporkannya`Data loading completed`.

1. Nonaktifkan lingkungan virtual dengan menjalankan perintah berikut.

   ```
   deactivate
   ```

1. Anda dapat memverifikasi bahwa data telah dimuat ke tabel DynamoDB Anda dengan melakukan hal berikut:

   1. Buka halaman [Jelajahi item](https://console.aws.amazon.com/dynamodbv2/home#item-explorer) dari konsol DynamoDB dan pilih tabel Anda (). `MyOrderTable`

   1. Di panel **Item yang dikembalikan**, Anda akan melihat 25 item dari file CSV yang ditambahkan skrip ke tabel.

## Membuat aplikasi pemeliharaan terjadwal
<a name="scheduled-task-app-create-app"></a>

Anda dapat membuat dan menerapkan sumber daya untuk aplikasi contoh ini langkah demi langkah menggunakan Konsol Manajemen AWS atau dengan menggunakan AWS SAM. Dalam lingkungan produksi, kami menyarankan Anda menggunakan alat Infrustracture-as-Code (IAc) seperti AWS SAM menyebarkan aplikasi tanpa server secara berulang tanpa menggunakan proses manual.

Untuk contoh ini, ikuti petunjuk konsol untuk mempelajari cara mengonfigurasi setiap AWS sumber daya secara terpisah, atau ikuti AWS SAM petunjuk untuk menerapkan aplikasi dengan cepat menggunakan AWS CLI perintah.

------
#### [ Console ]

**Untuk membuat fungsi menggunakan Konsol Manajemen AWS**

Pertama, buat fungsi yang berisi kode starter dasar. Anda kemudian mengganti kode ini dengan kode fungsi Anda sendiri dengan menyalin dan menempelkan kode langsung di editor kode Lambda, atau dengan mengunggah kode Anda sebagai paket. `.zip` Untuk tugas ini, kami sarankan menyalin dan menempelkan kode.

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih **Buat fungsi**.

1. Pilih **Penulis dari scratch**.

1. Di bagian **Informasi dasar**, lakukan hal berikut:

   1. Untuk **Nama fungsi**, masukkan `ScheduledDBMaintenance`.

   1. Untuk **Runtime** pilih versi Python terbaru.

   1. Untuk **Arsitektur**, pilih **x86\$164**.

1. Pilih **Buat fungsi**.

1. Setelah fungsi Anda dibuat, Anda dapat mengonfigurasi fungsi Anda dengan kode fungsi yang disediakan.

   1. Di panel **sumber Kode**, ganti kode Hello world yang dibuat Lambda dengan kode fungsi Python dari file yang Anda simpan `lambda_function.py` sebelumnya.

   1. Di bagian **DEPLOY**, pilih **Deploy** untuk memperbarui kode fungsi Anda:  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

**Untuk mengkonfigurasi memori fungsi dan batas waktu (konsol)**

1. Pilih tab **Konfigurasi** untuk fungsi Anda.

1. Di panel **konfigurasi Umum**, pilih **Edit**.

1. Atur **Memori** ke 256 MB dan **Timeout** menjadi 15 detik. Jika Anda memproses tabel besar dengan banyak catatan, misalnya dalam kasus lingkungan produksi, Anda dapat mempertimbangkan untuk mengatur **Timeout** ke jumlah yang lebih besar. Ini memberi fungsi Anda lebih banyak waktu untuk memindai, dan membersihkan database.

1. Pilih **Simpan**.

**Untuk mengkonfigurasi format log (konsol)**

Anda dapat mengonfigurasi fungsi Lambda untuk mengeluarkan log dalam teks tidak terstruktur atau format JSON. Kami menyarankan Anda menggunakan format JSON untuk log agar lebih mudah untuk mencari dan memfilter data log. Untuk mempelajari lebih lanjut tentang opsi konfigurasi log Lambda, lihat. [Mengkonfigurasi kontrol logging lanjutan untuk fungsi Lambda](monitoring-logs.md#monitoring-cloudwatchlogs-advanced)

1. Pilih tab **Konfigurasi** untuk fungsi Anda.

1. Pilih **Alat pemantauan dan operasi**.

1. Di panel **konfigurasi Logging**, pilih **Edit**.

1. Untuk **konfigurasi Logging**, pilih **JSON**.

1. Pilih **Simpan**.

**Untuk mengatur izin IAM**

Untuk memberikan fungsi Anda izin yang diperlukan untuk membaca dan menghapus item DynamoDB, Anda perlu menambahkan kebijakan ke peran [eksekusi](lambda-intro-execution-role.md) fungsi Anda yang menentukan izin yang diperlukan.

1. Buka tab **Konfigurasi**, lalu pilih **Izin** dari bilah navigasi kiri.

1. Pilih nama peran di bawah **Peran eksekusi**.

1. Di konsol IAM, pilih **Tambahkan izin**, lalu **Buat kebijakan sebaris**.

1. Gunakan editor JSON dan masukkan kebijakan berikut:  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "dynamodb:Scan",
                   "dynamodb:DeleteItem",
                   "dynamodb:BatchWriteItem"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/MyOrderTable"
           }
       ]
   }
   ```

1. Beri nama kebijakan**DynamoDBCleanupPolicy**, lalu buat.

**Untuk mengatur EventBridge Scheduler sebagai pemicu (konsol)**

1. Buka [konsol EventBridge ](https://console.aws.amazon.com/events/home).

1. **Di panel navigasi kiri, pilih **Penjadwal di bawah bagian Penjadwal**.**

1. Pilih **Buat jadwal**.

1. Konfigurasikan jadwal dengan melakukan hal berikut:

   1. Di bawah **nama Jadwal**, masukkan nama untuk jadwal Anda (misalnya,**DynamoDBCleanupSchedule**).

   1. Di bawah **Pola jadwal**, pilih **Jadwal berulang**.

   1. Untuk **jenis Jadwal** biarkan default sebagai **jadwal berbasis Cron**, lalu masukkan detail jadwal berikut:
      + **Menit**: **0**
      + **Jam**: **3**
      + **Hari bulan**: **1**
      + **Bulan**: **\$1**
      + **Hari dalam seminggu**: **?**
      + **Tahun**: **\$1**

      Saat dievaluasi, ekspresi cron ini berjalan pada hari pertama setiap bulan pukul 03:00 pagi.

   1. Untuk **jendela waktu Fleksibel**, pilih **Mati**.

1. Pilih **Berikutnya**.

1. Konfigurasikan pemicu untuk fungsi Lambda Anda dengan melakukan hal berikut:

   1. **Di panel **Detail target**, biarkan **API Target disetel ke target** **Templated**, lalu pilih AWS Lambda Invoke.**

   1. Di bawah **Invoke**, pilih fungsi Lambda Anda `ScheduledDBMaintenance` () dari daftar dropdown.

   1. Biarkan **Payload** kosong dan pilih **Berikutnya**.

   1. Gulir ke bawah ke **Izin** dan pilih **Buat peran baru untuk jadwal ini**. Saat Anda membuat jadwal EventBridge Scheduler baru menggunakan konsol, EventBridge Scheduler membuat kebijakan baru dengan izin yang diperlukan yang dibutuhkan jadwal untuk menjalankan fungsi Anda. *Untuk informasi selengkapnya tentang mengelola izin jadwal Anda, lihat Jadwal [berbasis cron. dalam Panduan Pengguna EventBridge Penjadwal](https://docs.aws.amazon.com/scheduler/latest/UserGuide/schedule-types.html#cron-based).*

   1. Pilih **Berikutnya**.

1. Tinjau pengaturan Anda dan pilih **Buat jadwal** untuk menyelesaikan pembuatan jadwal dan pemicu Lambda.

------
#### [ AWS SAM ]

**Untuk menerapkan aplikasi menggunakan AWS SAM**

1. Arahkan ke folder tempat Anda menyimpan `template.yaml` file untuk aplikasi. Perhatikan bahwa contoh ini menggunakan dua `template.yaml` file. Pastikan mereka disimpan dalam sub-folder terpisah dan bahwa Anda berada di folder yang benar berisi template untuk membuat aplikasi.

1. Salin `requirements.txt` file `lambda_function.py` dan file yang Anda unduh sebelumnya ke folder yang sama. Lokasi kode yang ditentukan dalam AWS SAM template adalah`./`, yang berarti lokasi saat ini. AWS SAM akan mencari di folder ini untuk kode fungsi Lambda ketika Anda mencoba menerapkan aplikasi.

1. Jalankan perintah berikut.

   ```
   sam build --use-container
   ```

   Perintah ini mengumpulkan artefak build untuk sumber daya yang ingin Anda terapkan dan menempatkannya dalam format dan lokasi yang tepat untuk menerapkannya. Menentukan `--use-container` opsi membangun fungsi Anda di dalam wadah Docker seperti Lambda. Kami menggunakannya di sini sehingga Anda tidak perlu menginstal Python 3.12 di mesin lokal Anda agar build berfungsi.

1. Untuk membuat sumber daya Lambda dan EventBridge Scheduler yang ditentukan dalam `template.yaml` file, jalankan perintah berikut.

   ```
   sam deploy --guided
   ```

   Menggunakan `--guided` tanda berarti itu AWS SAM akan menunjukkan kepada Anda petunjuk untuk memandu Anda melalui proses penerapan. Untuk penyebaran ini, masukkan a `Stack name` dari**cron-maintenance-app**, dan terima default untuk semua opsi lain dengan menggunakan Enter.

   Setelah AWS SAM selesai membuat sumber daya Lambda dan EventBridge Scheduler, Anda akan melihat pesan berikut.

   ```
   Successfully created/updated stack - cron-maintenance-app in us-west-2
   ```

1. Anda juga dapat mengonfirmasi bahwa fungsi Lambda telah dibuat dengan membuka halaman [Fungsi konsol](https://console.aws.amazon.com/lambda/home#/functions) Lambda. Anda akan melihat fungsi bernama`ScheduledDBMaintenance`.

------

## Menguji aplikasi
<a name="scheduled-task-app-test-app"></a>

 Untuk menguji apakah jadwal Anda memicu fungsi Anda dengan benar, dan bahwa fungsi Anda membersihkan catatan dengan benar dari database, Anda dapat mengubah jadwal sementara untuk dijalankan sekali pada waktu tertentu. Anda kemudian dapat menjalankan `sam deploy` lagi untuk mengatur ulang jadwal pengulangan Anda agar berjalan sebulan sekali. 

**Untuk menjalankan aplikasi menggunakan Konsol Manajemen AWS**

1. Arahkan kembali ke halaman konsol EventBridge Scheduler.

1. Pilih jadwal Anda, lalu pilih **Edit**.

1. Di bagian **Pola jadwal**, di bawah **Perulangan**, pilih Jadwal **satu kali**.

1.  **Atur waktu pemanggilan Anda ke beberapa menit dari sekarang, tinjau pengaturan Anda, lalu pilih Simpan.** 

 Setelah jadwal berjalan dan memanggil targetnya, Anda menjalankan `test_app.py` skrip untuk memverifikasi bahwa fungsi Anda berhasil menghapus semua catatan lama dari tabel DynamoDB. 

**Untuk memverifikasi bahwa catatan lama dihapus menggunakan skrip Python**

1.  Di baris perintah Anda, arahkan ke folder tempat Anda menyimpan`test_app.py`. 

1. Jalankan penulisan.

   ```
   python test_app.py
   ```

    Jika berhasil, Anda akan melihat output berikut. 

   ```
   Total number of old records: 0
   ```

## Langkah selanjutnya
<a name="scheduled-task-app-next-steps"></a>

 Anda sekarang dapat memodifikasi EventBridge jadwal Scheduler untuk memenuhi persyaratan aplikasi khusus Anda. EventBridge Scheduler mendukung ekspresi jadwal berikut: cron, rate, dan jadwal satu kali. 

 Untuk informasi selengkapnya tentang ekspresi EventBridge jadwal penjadwal, lihat [Jenis jadwal](https://docs.aws.amazon.com/scheduler/latest/UserGuide/schedule-types.html) di *Panduan Pengguna EventBridge Penjadwal*. [Manajemen Akses](https://docs.aws.amazon.com/IAM/latest/UserGuide/access.html) di *Panduan Pengguna IAM* 

# Membuat Sistem Pemrosesan Pesanan dengan Fungsi Tahan Lama Lambda
<a name="order-processing-app"></a>

**catatan**  
PERLU: Tambahkan diagram arsitektur yang menunjukkan API Gateway, alur kerja Fungsi Tahan Lama, dan layanan pendukung (DynamoDB,) EventBridge

## Prasyarat
<a name="order-processing-prerequisites"></a>
+ AWS CLI diinstal dan dikonfigurasi
+ PERLU: Persyaratan Fungsi Tahan Lama Spesifik

## Buat File Kode Sumber
<a name="order-processing-source"></a>

Buat file berikut di direktori proyek Anda:
+ `lambda_function.py`- kode fungsi
+ `requirements.txt`- Dependensi manifes

### Kode Fungsi
<a name="order-processing-function-code"></a>

```
# NEED: Verify correct imports
import boto3
import json

def lambda_handler(event, context):
    # NEED: Verify DurableContext syntax
    durable = context.durable
    
    try:
        # Validate and store order
        order = await durable.step('validate', async () => {
            return validate_order(event['order'])
        })
        
        # Process payment
        # NEED: Verify wait syntax
        await durable.wait(/* wait configuration */)
        
        # Additional steps
        # NEED: Complete implementation
        
    except Exception as e:
        # NEED: Error handling patterns
        raise e

def validate_order(order_data):
    # NEED: Implementation
    pass
```

### File Persyaratan
<a name="order-processing-requirements"></a>

```
# NEED: List of required packages
```

## Menerapkan Aplikasi
<a name="order-processing-deploy"></a>

### Buat Tabel DynamoDB untuk Pesanan
<a name="order-processing-dynamodb"></a>

1. Buka konsol DynamoDB di [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)

1. Pilih **Buat tabel**

1. Untuk **nama Tabel**, masukkan **Orders**

1. Untuk **kunci Partisi**, masukkan **orderId**

1. Biarkan pengaturan lain sebagai default

1. Pilih **Buat tabel**

### Buat fungsi Lambda
<a name="order-processing-lambda"></a>

1. Buka konsol Lambda di [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)

1. Pilih **fungsi Buat**

1. Pilih **Penulis dari awal**

1. Untuk **nama Fungsi**, masukkan **ProcessOrder**

1. Untuk **Runtime**, pilih runtime pilihan Anda

1. PERLU: Tambahkan konfigurasi khusus Fungsi Tahan Lama

1. Pilih **fungsi Buat**

### Buat Titik Akhir API Gateway
<a name="order-processing-apigateway"></a>

1. Buka konsol API Gateway di [https://console.aws.amazon.com/apigateway/](https://console.aws.amazon.com/apigateway/)

1. Pilih **Buat API**

1. Pilih **HTTP API**

1. Pilih **Build**

1. Tambahkan integrasi dengan fungsi Lambda Anda

1. Konfigurasikan rute untuk pemrosesan pesanan

1. Terapkan API

## Uji Aplikasi
<a name="order-processing-test"></a>

Kirim pesanan tes:

```
{
    "orderId": "12345",
    "items": [
        {
            "productId": "ABC123",
            "quantity": 1
        }
    ]
}
```

PERLU: Tambahkan instruksi pemantauan khusus untuk Fungsi Tahan Lama

## Langkah Berikutnya
<a name="order-processing-next-steps"></a>

### Tambahkan Logika Bisnis
<a name="order-processing-business-logic"></a>

Menerapkan manajemen inventaris:

```
async def check_inventory(order):
    # Add inventory check logic
    pass
```

Tambahkan perhitungan harga:

```
async def calculate_total(order):
    # Add pricing logic
    pass
```

### Tingkatkan Penanganan Kesalahan
<a name="order-processing-error-handling"></a>

Tambahkan logika kompensasi:

```
async def reverse_payment(order):
    # Add payment reversal logic
    pass
```

Menangani pembatalan pesanan:

```
async def cancel_order(order):
    # Add cancellation logic
    pass
```

### Integrasikan Sistem Eksternal
<a name="order-processing-integrations"></a>

```
async def notify_shipping_provider(order):
    # Add shipping integration
    pass

async def send_customer_notification(order):
    # Add notification logic
    pass
```

### Meningkatkan Monitoring
<a name="order-processing-monitoring"></a>
+ Buat CloudWatch dasbor
+ Siapkan metrik untuk waktu pemrosesan pesanan
+ Konfigurasikan peringatan untuk pesanan yang tertunda