

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

# Menggunakan Lambda dengan infrastruktur sebagai kode (IAc)
<a name="foundation-iac"></a>

Fungsi Lambda jarang berjalan secara terpisah. Sebaliknya, mereka sering membentuk bagian dari aplikasi tanpa server dengan sumber daya lain seperti database, antrian, dan penyimpanan. Dengan [Infrastructure as code (IAc)](https://aws.amazon.com/what-is/iac/), Anda dapat mengotomatiskan proses penyebaran Anda untuk menyebarkan dan memperbarui seluruh aplikasi tanpa server dengan cepat dan berulang yang melibatkan banyak sumber daya terpisah. AWS Pendekatan ini mempercepat siklus pengembangan Anda, membuat manajemen konfigurasi lebih mudah, dan memastikan bahwa sumber daya Anda digunakan dengan cara yang sama setiap saat.

## Alat IAc untuk Lambda
<a name="foundation-iac-tools"></a>

**CloudFormation**  
CloudFormation adalah layanan IAc dasar dari. AWS Anda dapat menggunakan [templat YAMB atau JSON](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html) untuk memodelkan dan menyediakan seluruh AWS infrastruktur Anda, termasuk fungsi Lambda. CloudFormation menangani kompleksitas membuat, memperbarui, dan menghapus sumber daya Anda AWS .

**AWS Serverless Application Model (AWS SAM)**  
AWS SAM adalah kerangka kerja sumber terbuka yang dibangun di atas. CloudFormation Ini menyediakan sintaks yang disederhanakan untuk mendefinisikan aplikasi tanpa server. Gunakan [AWS SAM template](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification-template-anatomy.html) untuk menyediakan fungsi Lambda, database APIs, dan sumber peristiwa dengan cepat hanya dengan beberapa baris YAMB.

**AWS Cloud Development Kit (AWS CDK)**  
CDK adalah pendekatan kode-pertama untuk IAc. Anda dapat menentukan arsitektur berbasis Lambda Anda menggunakan TypeScript,, JavaScript Python, Java, C \$1/.Net, atau Go. Pilih bahasa pilihan Anda dan gunakan elemen pemrograman seperti parameter, kondisional, loop, komposisi, dan pewarisan untuk menentukan hasil yang diinginkan dari infrastruktur Anda. CDK kemudian menghasilkan CloudFormation template yang mendasari untuk penerapan. Untuk contoh cara menggunakan Lambda dengan CDK, lihat. [Menerapkan fungsi Lambda dengan AWS CDK](lambda-cdk-tutorial.md)

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


AWS juga menyediakan layanan yang dipanggil AWS Infrastructure Composer untuk mengembangkan template IAC menggunakan antarmuka grafis sederhana. Dengan Infrastructure Composer, Anda merancang arsitektur aplikasi dengan menyeret, mengelompokkan, dan menghubungkan Layanan AWS dalam kanvas visual. Infrastructure Composer kemudian membuat AWS SAM CloudFormation template atau template dari desain Anda yang dapat Anda gunakan untuk menyebarkan aplikasi Anda.

Pada [Menggunakan fungsi Lambda di dan Infrastructure AWS SAM Composer](foundation-iac-getting-started.md) bagian di bawah ini, Anda menggunakan Infrastructure Composer untuk mengembangkan template untuk aplikasi tanpa server berdasarkan fungsi Lambda yang ada.

# Menggunakan fungsi Lambda di dan Infrastructure AWS SAM Composer
<a name="foundation-iac-getting-started"></a>

Dalam tutorial ini, Anda dapat mulai menggunakan IAc dengan Lambda dengan membuat template dari fungsi Lambda AWS SAM yang ada dan kemudian membangun aplikasi tanpa server di Infrastructure Composer dengan menambahkan sumber daya lainnya. AWS 

Saat Anda menjalankan tutorial ini, Anda akan mempelajari beberapa konsep dasar, seperti bagaimana AWS sumber daya ditentukan AWS SAM. Anda juga akan belajar cara menggunakan Infrastructure Composer untuk membangun aplikasi tanpa server yang dapat Anda gunakan menggunakan atau. AWS SAM CloudFormation

Untuk menyelesaikan tutorial ini, Anda akan melakukan langkah-langkah berikut:
+ Buat contoh fungsi Lambda
+ Gunakan konsol Lambda untuk melihat AWS SAM template untuk fungsi
+ Ekspor konfigurasi fungsi Anda ke AWS Infrastructure Composer dan rancang aplikasi tanpa server sederhana berdasarkan konfigurasi fungsi Anda
+ Menyimpan AWS SAM template yang diperbarui yang dapat Anda gunakan sebagai dasar untuk menyebarkan aplikasi tanpa server Anda

## Prasyarat
<a name="foundation-iac-prerequisites"></a>

Dalam tutorial ini, Anda menggunakan fitur [sinkronisasi lokal](https://docs.aws.amazon.com/application-composer/latest/dg/reference-features-local-sync.html) Infrastructure Composer untuk menyimpan file template dan kode Anda ke mesin build lokal Anda. Untuk menggunakan fitur ini, Anda memerlukan browser yang mendukung File System Access API, yang memungkinkan aplikasi web membaca, menulis, dan menyimpan file di sistem file lokal Anda. Sebaiknya gunakan Google Chrome atau Microsoft Edge. Untuk informasi selengkapnya tentang API Akses Sistem File, lihat [Apa itu API Akses Sistem File?](https://docs.aws.amazon.com/application-composer/latest/dg/reference-fsa.html#reference-fsa-api)

## Buat fungsi Lambda
<a name="foundation-iac-create-function"></a>

Pada langkah pertama ini, Anda membuat fungsi Lambda yang dapat Anda gunakan untuk menyelesaikan sisa tutorial. Untuk menjaga hal-hal sederhana, Anda menggunakan konsol Lambda untuk membuat fungsi dasar 'Hello world' menggunakan runtime Python 3.11.

**Untuk membuat fungsi Lambda 'Hello world' menggunakan konsol**

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

1. Pilih **Buat fungsi**.

1. Biarkan **Penulis dari awal** dipilih, dan di bawah **Informasi dasar**, masukkan **LambdaIaCDemo** **nama Fungsi**.

1. Untuk **Runtime**, pilih **Python 3.11**.

1. Pilih **Buat fungsi**.

## Lihat AWS SAM template untuk fungsi Anda
<a name="foundation-iac-view-template"></a>

Sebelum Anda mengekspor konfigurasi fungsi Anda ke Infrastructure Composer, gunakan konsol Lambda untuk melihat konfigurasi fungsi Anda saat ini sebagai AWS SAM templat. Dengan mengikuti langkah-langkah di bagian ini, Anda akan belajar tentang anatomi AWS SAM template dan cara mendefinisikan sumber daya seperti fungsi Lambda untuk mulai menentukan aplikasi tanpa server.

**Untuk melihat AWS SAM template untuk fungsi Anda**

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

1. Pilih fungsi yang baru saja Anda buat (`LambdaIaCDemo`).

1. Di panel **Ikhtisar fungsi**, pilih **Template**.

   Di tempat diagram yang mewakili konfigurasi fungsi Anda, Anda akan melihat AWS SAM template untuk fungsi Anda. Template akan terlihat seperti berikut ini.

   ```
   # This AWS SAM template has been generated from your function's 
   # configuration. If your function has one or more triggers, note 
   # that the AWS resources associated with these triggers aren't fully 
   # specified in this template and include placeholder values.Open this template 
   # in AWS Application Composer or your favorite IDE and modify 
   # it to specify a serverless application with other AWS resources. 
   AWSTemplateFormatVersion: '2010-09-09'
   Transform: AWS::Serverless-2016-10-31
   Description: An AWS Serverless Specification template describing your function.
   Resources:
     LambdaIaCDemo:
       Type: AWS::Serverless::Function
       Properties:
         CodeUri: .
         Description: ''
         MemorySize: 128
         Timeout: 3
         Handler: lambda_function.lambda_handler
         Runtime: python3.11
         Architectures:
           - x86_64
         EventInvokeConfig:
           MaximumEventAgeInSeconds: 21600
           MaximumRetryAttempts: 2
         EphemeralStorage:
           Size: 512
         RuntimeManagementConfig:
           UpdateRuntimeOn: Auto
         SnapStart:
           ApplyOn: None
         PackageType: Zip
         Policies:
           Statement:
             - Effect: Allow
               Action:
                 - logs:CreateLogGroup
               Resource: arn:aws:logs:us-east-1:123456789012:*
             - Effect: Allow
               Action:
                 - logs:CreateLogStream
                 - logs:PutLogEvents
               Resource:
                 - >-
                   arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/LambdaIaCDemo:*
   ```

Mari luangkan waktu sejenak untuk melihat template YAMB untuk fungsi Anda dan memahami beberapa konsep kunci.

Template dimulai dengan deklarasi`Transform: AWS::Serverless-2016-10-31`. Deklarasi ini diperlukan karena di balik layar, AWS SAM template digunakan melalui CloudFormation. Menggunakan `Transform` pernyataan mengidentifikasi template sebagai file AWS SAM template.

Setelah `Transform` deklarasi datang `Resources` bagian. Di sinilah AWS sumber daya yang ingin Anda terapkan dengan AWS SAM template Anda ditentukan. AWS SAM template dapat berisi kombinasi AWS SAM sumber daya dan sumber CloudFormation daya. Ini karena selama penerapan, AWS SAM templat diperluas ke CloudFormation templat, sehingga CloudFormation sintaks apa pun yang valid dapat ditambahkan ke templat. AWS SAM 

Saat ini, hanya ada satu sumber daya yang ditentukan di `Resources` bagian template, fungsi Lambda Anda. `LambdaIaCDemo` Untuk menambahkan fungsi Lambda ke AWS SAM template, Anda menggunakan jenis `AWS::Serverless::Function` sumber daya. Sumber daya fungsi Lambda menentukan runtime fungsi, penangan fungsi, dan opsi konfigurasi lainnya. `Properties` Jalur ke kode sumber fungsi Anda yang AWS SAM harus digunakan untuk menyebarkan fungsi juga didefinisikan di sini. Untuk mempelajari lebih lanjut tentang sumber daya fungsi Lambda AWS SAM, lihat [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)di Panduan *AWS SAM Pengembang*.

Selain properti dan konfigurasi fungsi, template juga menentukan kebijakan AWS Identity and Access Management (IAM) untuk fungsi Anda. Kebijakan ini memberikan izin fungsi Anda untuk menulis log ke Amazon CloudWatch Logs. Saat Anda membuat fungsi di konsol Lambda, Lambda secara otomatis melampirkan kebijakan ini ke fungsi Anda. Untuk mempelajari selengkapnya tentang menentukan kebijakan IAM untuk fungsi dalam AWS SAM templat, lihat `policies` properti di [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)halaman Panduan *AWS SAM Pengembang*.

Untuk mempelajari lebih lanjut tentang struktur AWS SAM templat, lihat [anatomi AWS SAM templat](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification-template-anatomy.html).

## Gunakan AWS Infrastructure Composer untuk mendesain aplikasi tanpa server
<a name="foundation-iac-design-app"></a>

Untuk mulai membangun aplikasi tanpa server sederhana menggunakan AWS SAM template fungsi Anda sebagai titik awal, Anda mengekspor konfigurasi fungsi Anda ke Infrastructure Composer dan mengaktifkan mode sinkronisasi lokal Infrastructure Composer. Sinkronisasi lokal secara otomatis menyimpan kode fungsi dan AWS SAM template Anda ke mesin build lokal Anda dan membuat template tersimpan Anda tetap disinkronkan saat Anda menambahkan AWS sumber daya lain di Infrastructure Composer.

**Untuk mengekspor fungsi Anda ke Infrastructure Composer**

1. Di panel **Ikhtisar Fungsi**, pilih **Ekspor ke Komposer Aplikasi**.

   Untuk mengekspor konfigurasi dan kode fungsi Anda ke Infrastructure Composer, Lambda membuat bucket Amazon S3 di akun Anda untuk menyimpan sementara data ini.

1. Di kotak dialog, pilih **Konfirmasi dan buat proyek** untuk menerima nama default untuk bucket ini dan ekspor konfigurasi dan kode fungsi Anda ke Infrastructure Composer.

1. (Opsional) Untuk memilih nama lain untuk bucket Amazon S3 yang dibuat Lambda, masukkan nama baru dan pilih **Konfirmasi** dan buat proyek. Nama bucket Amazon S3 harus unik secara global dan mengikuti aturan [penamaan bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html).

   Memilih **Konfirmasi dan buat proyek** membuka konsol Infrastructure Composer. Di *kanvas*, Anda akan melihat fungsi Lambda Anda.

1. Dari **menu** tarik-turun, pilih **Aktifkan sinkronisasi lokal**.

1. Di kotak dialog yang terbuka, pilih **Pilih folder** dan pilih folder di mesin build lokal Anda.

1. Pilih **Aktifkan** untuk mengaktifkan sinkronisasi lokal.

Untuk mengekspor fungsi Anda ke Infrastructure Composer, Anda memerlukan izin untuk menggunakan tindakan API tertentu. Jika Anda tidak dapat mengekspor fungsi Anda, lihat [Izin yang diperlukan](services-appcomposer.md#services-appcomposer-permissions) dan pastikan Anda memiliki izin yang Anda butuhkan.

**catatan**  
[Harga Amazon S3](https://aws.amazon.com/s3/pricing) standar berlaku untuk bucket yang dibuat Lambda saat Anda mengekspor fungsi ke Infrastructure Composer. Objek yang dimasukkan Lambda ke dalam bucket secara otomatis dihapus setelah 10 hari, tetapi Lambda tidak menghapus bucket itu sendiri.  
Untuk menghindari biaya tambahan ditambahkan ke Anda Akun AWS, ikuti petunjuk di [Menghapus bucket setelah Anda mengekspor](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html) fungsi Anda ke Infrastructure Composer. Untuk informasi selengkapnya tentang bucket Amazon S3 yang dibuat Lambda, lihat. [Menggunakan AWS Lambda dengan AWS Infrastructure Composer](services-appcomposer.md)

**Untuk mendesain aplikasi tanpa server Anda di Infrastructure Composer**

Setelah mengaktifkan sinkronisasi lokal, perubahan yang Anda buat di Infrastructure Composer akan tercermin dalam AWS SAM template yang disimpan di mesin build lokal Anda. Sekarang Anda dapat menarik dan melepas AWS sumber daya tambahan ke kanvas Infrastructure Composer untuk membangun aplikasi Anda. Dalam contoh ini, Anda menambahkan antrean sederhana Amazon SQS sebagai pemicu fungsi Lambda dan tabel DynamoDB untuk fungsi yang akan menulis data.

1. Tambahkan pemicu Amazon SQS ke fungsi Lambda Anda dengan melakukan hal berikut:

   1. Di bidang pencarian di palet **Sumber Daya**, masukkan**SQS**.

   1. Seret sumber daya **SQS Queue** ke kanvas Anda dan posisikan di sebelah kiri fungsi Lambda Anda.

   1. Pilih **Detail**, dan untuk **Logical ID** masukkan**LambdaIaCQueue**.

   1. Pilih **Simpan**.

   1. Hubungkan sumber daya Amazon SQS dan Lambda Anda dengan mengklik port **Langganan** pada kartu antrian SQS dan menyeretnya ke port sebelah kiri pada kartu fungsi Lambda. Munculnya garis antara dua sumber daya menunjukkan koneksi yang sukses. Infrastructure Composer juga menampilkan pesan di bagian bawah kanvas yang menunjukkan bahwa kedua sumber daya berhasil terhubung.

1. Tambahkan tabel Amazon DynamoDB untuk fungsi Lambda Anda untuk menulis data dengan melakukan hal berikut:

   1. Di bidang pencarian di palet **Sumber Daya**, masukkan**DynamoDB**.

   1. Seret sumber daya **DynamoDB** Table ke kanvas Anda dan posisikan di sebelah kanan fungsi Lambda Anda.

   1. Pilih **Detail**, dan untuk **Logical ID** masukkan**LambdaIaCTable**.

   1. Pilih **Simpan**.

   1. Hubungkan tabel DynamoDB ke fungsi Lambda Anda dengan mengklik port kanan kartu fungsi Lambda dan menyeretnya ke port kiri pada kartu DynamoDB. 

Sekarang setelah Anda menambahkan sumber daya tambahan ini, mari kita lihat AWS SAM template yang diperbarui Infrastructure Composer telah dibuat.

**Untuk melihat AWS SAM template Anda yang diperbarui**
+ Pada kanvas Infrastructure Composer, pilih **Template** untuk beralih dari tampilan kanvas ke tampilan template.

 AWS SAM Template Anda sekarang harus berisi sumber daya dan properti tambahan berikut:
+ Antrian Amazon SQS dengan pengenal `LambdaIaCQueue`

  ```
  LambdaIaCQueue:
      Type: AWS::SQS::Queue
      Properties:
        MessageRetentionPeriod: 345600
  ```

  Saat Anda menambahkan antrean Amazon SQS menggunakan Infrastructure Composer, Infrastructure Composer menetapkan properti. `MessageRetentionPeriod` **Anda juga dapat mengatur `FifoQueue` properti dengan memilih **Detail** pada kartu SQS Queue dan memeriksa atau menghapus centang antrian Fifo.**

  Untuk mengatur properti lain untuk antrian Anda, Anda dapat mengedit template secara manual untuk menambahkannya. *Untuk mempelajari lebih lanjut tentang `AWS::SQS::Queue` sumber daya dan properti yang tersedia, lihat [AWS: :SQS: :Queue](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html) di Panduan Pengguna.CloudFormation *
+ `Events`Properti dalam definisi fungsi Lambda Anda yang menentukan antrean Amazon SQS sebagai pemicu fungsi

  ```
  Events:
    LambdaIaCQueue:
      Type: SQS
      Properties:
        Queue: !GetAtt LambdaIaCQueue.Arn
        BatchSize: 1
  ```

  `Events`Properti terdiri dari jenis acara dan satu set properti yang bergantung pada jenisnya. Untuk mempelajari tentang perbedaan yang dapat Layanan AWS Anda konfigurasikan untuk memicu fungsi Lambda dan properti yang dapat Anda atur, lihat [EventSource](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-eventsource.html)di Panduan *AWS SAM Pengembang*.
+ Sebuah tabel DynamoDB dengan identifier `LambdaIaCTable`

  ```
  LambdaIaCTable:
      Type: AWS::DynamoDB::Table
      Properties:
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        BillingMode: PAY_PER_REQUEST
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        StreamSpecification:
          StreamViewType: NEW_AND_OLD_IMAGES
  ```

  Ketika Anda menambahkan tabel DynamoDB menggunakan Infrastructure Composer, Anda dapat mengatur kunci tabel Anda dengan memilih **Detail** pada kartu tabel DynamoDB dan mengedit nilai-nilai kunci. Infrastructure Composer juga menetapkan nilai default untuk sejumlah properti lain termasuk `BillingMode` dan`StreamViewType`.

  *Untuk mempelajari lebih lanjut tentang properti ini dan properti lain yang dapat Anda tambahkan ke AWS SAM template Anda, lihat [AWS: :DynamoDB: :Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html) di Panduan Pengguna.CloudFormation *
+ Kebijakan IAM baru yang memberikan izin fungsi Anda untuk melakukan operasi CRUD pada tabel DynamoDB yang Anda tambahkan.

  ```
  Policies:
  ...
    - DynamoDBCrudPolicy:
      TableName: !Ref LambdaIaCTable
  ```

 AWS SAM Template akhir yang lengkap akan terlihat seperti berikut ini.

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Specification template describing your function.
Resources:
  LambdaIaCDemo:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Description: ''
      MemorySize: 128
      Timeout: 3
      Handler: lambda_function.lambda_handler
      Runtime: python3.11
      Architectures:
        - x86_64
      EventInvokeConfig:
        MaximumEventAgeInSeconds: 21600
        MaximumRetryAttempts: 2
      EphemeralStorage:
        Size: 512
      RuntimeManagementConfig:
        UpdateRuntimeOn: Auto
      SnapStart:
        ApplyOn: None
      PackageType: Zip
      Policies:
        - Statement:
            - Effect: Allow
              Action:
                - logs:CreateLogGroup
              Resource: arn:aws:logs:us-east-1:594035263019:*
            - Effect: Allow
              Action:
                - logs:CreateLogStream
                - logs:PutLogEvents
              Resource:
                - arn:aws:logs:us-east-1:594035263019:log-group:/aws/lambda/LambdaIaCDemo:*
        - DynamoDBCrudPolicy:
            TableName: !Ref LambdaIaCTable
      Events:
        LambdaIaCQueue:
          Type: SQS
          Properties:
            Queue: !GetAtt LambdaIaCQueue.Arn
            BatchSize: 1
      Environment:
        Variables:
          LAMBDAIACTABLE_TABLE_NAME: !Ref LambdaIaCTable
          LAMBDAIACTABLE_TABLE_ARN: !GetAtt LambdaIaCTable.Arn
  LambdaIaCQueue:
    Type: AWS::SQS::Queue
    Properties:
      MessageRetentionPeriod: 345600
  LambdaIaCTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      BillingMode: PAY_PER_REQUEST
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      StreamSpecification:
        StreamViewType: NEW_AND_OLD_IMAGES
```

## Terapkan aplikasi tanpa server Anda menggunakan AWS SAM (opsional)
<a name="foundation-iac-deploy"></a>

Jika Anda ingin menggunakan AWS SAM untuk menyebarkan aplikasi tanpa server menggunakan template yang baru saja Anda buat di Infrastructure Composer, Anda harus menginstal file terlebih dahulu. AWS SAM CLI Untuk melakukan ini, ikuti instruksi di [Instalasi AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html).

Sebelum Anda menerapkan aplikasi Anda, Anda juga perlu memperbarui kode fungsi yang disimpan Infrastructure Composer bersama dengan template Anda. Saat ini, `lambda_function.py` file yang disimpan oleh Infrastructure Composer hanya berisi kode dasar 'Hello world' yang disediakan Lambda saat Anda membuat fungsi. 

Untuk memperbarui kode fungsi Anda, salin kode berikut dan tempel ke `lambda_function.py` file Infrastructure Composer yang disimpan ke mesin build lokal Anda. Anda menentukan direktori untuk Infrastructure Composer untuk menyimpan file ini ketika Anda mengaktifkan mode Local Sync.

Kode ini menerima pasangan nilai kunci dalam pesan dari antrian Amazon SQS yang Anda buat di Infrastructure Composer. Jika kedua kunci dan nilai adalah string, kode kemudian menggunakannya untuk menulis item ke tabel DynamoDB didefinisikan dalam template Anda.

### Kode fungsi Python yang diperbarui
<a name="foundation-iac-updated-code"></a>

```
import boto3
import os
import json

# define the DynamoDB table that Lambda will connect to
tablename = os.environ['LAMBDAIACTABLE_TABLE_NAME']

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

def lambda_handler(event, context):
    # get the message out of the SQS event
    message = event['Records'][0]['body']
    data = json.loads(message)
    # write event data to DDB table
    if check_message_format(data):
        key = next(iter(data))
        value = data[key]
        dynamo.put_item(
            TableName=tablename,
            Item={
                'id': {'S': key},
                'Value': {'S': value}
            }
        )
    else:
        raise ValueError("Input data not in the correct format")

# check that the event object contains a single key value  
# pair that can be written to the database
def check_message_format(message):
    if len(message) != 1:
        return False
        
    key, value = next(iter(message.items()))
    
    if not (isinstance(key, str) and isinstance(value, str)):
        return False

    else:
        return True
```

**Untuk menerapkan aplikasi tanpa server**

Untuk menyebarkan aplikasi Anda menggunakan AWS SAM CLI, lakukan langkah-langkah berikut. Agar fungsi Anda dapat membangun dan menerapkan dengan benar, Python versi 3.11 harus diinstal pada mesin build Anda dan di mesin Anda. `PATH`

1. Jalankan perintah berikut dari direktori di mana Infrastructure Composer menyimpan `lambda_function.py` file Anda `template.yaml` dan.

   ```
   sam build
   ```

   Perintah ini mengumpulkan artefak build untuk aplikasi Anda dan menempatkannya dalam format dan lokasi yang tepat untuk menerapkannya.

1. Untuk menerapkan aplikasi Anda dan membuat sumber daya Lambda, Amazon SQS, dan DynamoDB yang ditentukan AWS SAM dalam template 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 format nama `sam-app-LambdaIaCDemo-99VXPpYQVv1M`
+ Antrian Amazon SQS dengan format nama `sam-app-LambdaIaCQueue-xL87VeKsGiIo`
+ Sebuah tabel DynamoDB dengan format nama `sam-app-LambdaIaCTable-CN0S66C0VLNV`

AWS SAM juga membuat peran dan kebijakan IAM yang diperlukan sehingga fungsi Lambda Anda dapat membaca pesan dari antrian Amazon SQS dan melakukan operasi CRUD pada tabel DynamoDB.

## Menguji aplikasi yang Anda gunakan (opsional)
<a name="foundation-iac-test"></a>

Untuk mengonfirmasi bahwa aplikasi tanpa server Anda diterapkan dengan benar, kirim pesan ke antrian Amazon SQS Anda yang berisi pasangan nilai kunci dan periksa apakah Lambda menulis item ke tabel DynamoDB Anda menggunakan nilai-nilai ini.

**Untuk menguji aplikasi tanpa server Anda**

1. Buka halaman [Antrian](https://console.aws.amazon.com/sqs/v2/home#/queues) konsol Amazon SQS dan pilih antrian AWS SAM yang dibuat dari template Anda. Namanya memiliki format`sam-app-LambdaIaCQueue-xL87VeKsGiIo`.

1. Pilih **Kirim dan terima pesan** dan tempelkan JSON berikut ke **Konten pesan** di bagian **Kirim pesan**.

   ```
   {
       "myKey": "myValue"
   }
   ```

1. Pilih **Kirim pesan**.

   Mengirim pesan ke antrian menyebabkan Lambda memanggil fungsi Anda melalui pemetaan sumber peristiwa yang ditentukan dalam templat Anda. AWS SAM Untuk mengonfirmasi bahwa Lambda telah memanggil fungsi Anda seperti yang diharapkan, konfirmasikan bahwa item telah ditambahkan ke tabel DynamoDB Anda.

1. Buka halaman [Tabel](https://console.aws.amazon.com/dynamodbv2#tables) konsol DynamoDB dan pilih tabel Anda. Namanya memiliki format`sam-app-LambdaIaCTable-CN0S66C0VLNV`.

1. Pilih **Jelajahi item tabel**. Di panel **Item yang dikembalikan**, Anda akan melihat item dengan **id** `myKey` dan **Nilai**`myValue`.

# Menerapkan fungsi Lambda dengan AWS CDK
<a name="lambda-cdk-tutorial"></a>

 AWS Cloud Development Kit (AWS CDK) Ini adalah kerangka infrastruktur sebagai kode (IAc) yang dapat Anda gunakan untuk mendefinisikan infrastruktur AWS cloud dengan menggunakan bahasa pemrograman pilihan Anda. Untuk menentukan infrastruktur cloud Anda sendiri, pertama-tama Anda menulis aplikasi (dalam salah satu bahasa yang didukung CDK) yang berisi satu atau beberapa tumpukan. Kemudian, Anda mensintesisnya ke CloudFormation template dan menyebarkan sumber daya Anda ke template Anda. Akun AWS Ikuti langkah-langkah dalam topik ini untuk menerapkan fungsi Lambda yang menampilkan peristiwa dari titik akhir Amazon API Gateway.

 AWS Construct Library, disertakan dengan CDK, menyediakan modul yang dapat Anda gunakan untuk memodelkan sumber daya yang Layanan AWS disediakan. Untuk layanan populer, perpustakaan menyediakan konstruksi yang dikuratori dengan default cerdas dan praktik terbaik. Anda dapat menggunakan modul [aws\$1lambda](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda-readme.html) untuk menentukan fungsi Anda dan sumber daya pendukung hanya dengan beberapa baris kode. 

## Prasyarat
<a name="lambda-cdk-prerequisites"></a>

Sebelum memulai tutorial ini, instal AWS CDK dengan menjalankan perintah berikut.

```
npm install -g aws-cdk
```

## Langkah 1: Siapkan AWS CDK proyek Anda
<a name="lambda-cdk-step-1"></a>

Buat direktori untuk AWS CDK aplikasi baru Anda dan inisialisasi proyek.

------
#### [ JavaScript ]

```
mkdir hello-lambda
cd hello-lambda
cdk init --language javascript
```

------
#### [ TypeScript ]

```
mkdir hello-lambda
cd hello-lambda
cdk init --language typescript
```

------
#### [ Python ]

```
mkdir hello-lambda
cd hello-lambda
cdk init --language python
```

Setelah proyek dimulai, aktifkan lingkungan virtual proyek dan instal dependensi dasar untuk. AWS CDK

```
source .venv/bin/activate
python -m pip install -r requirements.txt
```

------
#### [ Java ]

```
mkdir hello-lambda
cd hello-lambda
cdk init --language java
```

Impor proyek Maven ini ke lingkungan pengembangan terintegrasi Java (IDE) Anda. **Misalnya, di Eclipse, pilih **File**, **Import, Maven, Existing** **Maven Projects**.**

------
#### [ C\$1 ]

```
mkdir hello-lambda
cd hello-lambda
cdk init --language csharp
```

------

**catatan**  
Template AWS CDK aplikasi menggunakan nama direktori proyek untuk menghasilkan nama untuk file sumber dan kelas. Dalam contoh ini, direktori diberi nama`hello-lambda`. Jika Anda menggunakan nama direktori project yang berbeda, aplikasi Anda tidak akan cocok dengan petunjuk ini.

AWS CDK v2 menyertakan konstruksi stabil untuk semua Layanan AWS dalam satu paket yang dipanggil`aws-cdk-lib`. Paket ini diinstal sebagai dependensi ketika Anda menginisialisasi proyek. Saat bekerja dengan bahasa pemrograman tertentu, paket diinstal saat Anda membangun proyek untuk pertama kalinya.

## Langkah 2: Tentukan AWS CDK tumpukan
<a name="lambda-cdk-step-2"></a>

*Tumpukan* CDK adalah kumpulan dari satu atau lebih konstruksi, yang mendefinisikan AWS sumber daya. Setiap tumpukan CDK mewakili CloudFormation tumpukan di aplikasi CDK Anda.

Untuk menentukan tumpukan CDK Anda, ikuti instruksi untuk bahasa pemrograman pilihan Anda. Tumpukan ini mendefinisikan yang berikut:
+ Nama logis fungsi: `MyFunction`
+ Lokasi kode fungsi, yang ditentukan dalam `code` properti. Untuk informasi selengkapnya, lihat [Kode handler](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda-readme.html#handler-code) di *Referensi AWS Cloud Development Kit (AWS CDK) API*.
+ Nama logis REST API: `HelloApi`
+ Nama logis titik akhir API Gateway: `ApiGwEndpoint`

Perhatikan bahwa semua tumpukan CDK dalam tutorial ini menggunakan [runtime](lambda-runtimes.md) Node.js untuk fungsi Lambda. Anda dapat menggunakan bahasa pemrograman yang berbeda untuk tumpukan CDK dan fungsi Lambda untuk memanfaatkan kekuatan setiap bahasa. Misalnya, Anda dapat menggunakan TypeScript tumpukan CDK untuk memanfaatkan manfaat pengetikan statis untuk kode infrastruktur Anda. Anda dapat menggunakan JavaScript fungsi Lambda untuk memanfaatkan fleksibilitas dan perkembangan cepat dari bahasa yang diketik secara dinamis.

------
#### [ JavaScript ]

Buka `lib/hello-lambda-stack.js` file dan ganti isinya dengan yang berikut ini.

```
const { Stack } = require('aws-cdk-lib');
const lambda = require('aws-cdk-lib/aws-lambda');
const apigw = require('aws-cdk-lib/aws-apigateway');

class HelloLambdaStack extends Stack {
  /**
   *
   * @param {Construct} scope
   * @param {string} id
   * @param {StackProps=} props
   */
  constructor(scope, id, props) {
    super(scope, id, props);
    const fn = new lambda.Function(this, 'MyFunction', {
      code: lambda.Code.fromAsset('lib/lambda-handler'),
      runtime: lambda.Runtime.NODEJS_LATEST,
      handler: 'index.handler'
    });

    const endpoint = new apigw.LambdaRestApi(this, 'MyEndpoint', {
      handler: fn,
      restApiName: "HelloApi"
    });

  }
}

module.exports = { HelloLambdaStack }
```

------
#### [ TypeScript ]

Buka `lib/hello-lambda-stack.ts` file dan ganti isinya dengan yang berikut ini.

```
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as apigw from "aws-cdk-lib/aws-apigateway";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as path from 'node:path';

export class HelloLambdaStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps){
    super(scope, id, props)
    const fn = new lambda.Function(this, 'MyFunction', {
      runtime: lambda.Runtime.NODEJS_LATEST,
      handler: 'index.handler',
      code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
    });

    const endpoint = new apigw.LambdaRestApi(this, `ApiGwEndpoint`, {
      handler: fn,
      restApiName: `HelloApi`,
    });

  }
}
```

------
#### [ Python ]

Buka `/hello-lambda/hello_lambda/hello_lambda_stack.py` file dan ganti isinya dengan yang berikut ini.

```
from aws_cdk import (
    Stack,
    aws_apigateway as apigw,
    aws_lambda as _lambda
)
from constructs import Construct

class HelloLambdaStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        fn = _lambda.Function(
            self,
            "MyFunction",
            runtime=_lambda.Runtime.NODEJS_LATEST,
            handler="index.handler",
            code=_lambda.Code.from_asset("lib/lambda-handler")
        )

        endpoint = apigw.LambdaRestApi(
            self,
            "ApiGwEndpoint",
            handler=fn,
            rest_api_name="HelloApi"
        )
```

------
#### [ Java ]

Buka `/hello-lambda/src/main/java/com/myorg/HelloLambdaStack.java` file dan ganti isinya dengan yang berikut ini.

```
package com.myorg;

import software.constructs.Construct;
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.StackProps;
import software.amazon.awscdk.services.apigateway.LambdaRestApi;
import software.amazon.awscdk.services.lambda.Function;

public class HelloLambdaStack extends Stack {
    public HelloLambdaStack(final Construct scope, final String id) {
        this(scope, id, null);
    }

    public HelloLambdaStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);

        Function hello = Function.Builder.create(this, "MyFunction")
                            .runtime(software.amazon.awscdk.services.lambda.Runtime.NODEJS_LATEST)
                            .code(software.amazon.awscdk.services.lambda.Code.fromAsset("lib/lambda-handler"))
                            .handler("index.handler")
                            .build();

        LambdaRestApi api = LambdaRestApi.Builder.create(this, "ApiGwEndpoint")
                                .restApiName("HelloApi")
                                .handler(hello)
                                .build();

    }
}
```

------
#### [ C\$1 ]

Buka `src/HelloLambda/HelloLambdaStack.cs` file dan ganti isinya dengan yang berikut ini.

```
using Amazon.CDK;
using Amazon.CDK.AWS.APIGateway;
using Amazon.CDK.AWS.Lambda;
using Constructs;

namespace HelloLambda
{
    public class HelloLambdaStack : Stack
    {
        internal HelloLambdaStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            var fn = new Function(this, "MyFunction", new FunctionProps
            {
                Runtime = Runtime.NODEJS_LATEST,
                Code = Code.FromAsset("lib/lambda-handler"),
                Handler = "index.handler"
            });

            var api = new LambdaRestApi(this, "ApiGwEndpoint", new LambdaRestApiProps
            {
                Handler = fn
            });
        }
    }
}
```

------

## Langkah 3: Buat kode fungsi Lambda
<a name="lambda-cdk-step-3"></a>

1. Dari root project Anda (`hello-lambda`), buat `/lib/lambda-handler` direktori untuk kode fungsi Lambda. Direktori ini ditentukan dalam `code` properti AWS CDK tumpukan Anda.

1. Buat file baru yang disebut `index.js` di `/lib/lambda-handler` direktori. Tempel kode berikut ke file. Fungsi mengekstrak properti tertentu dari permintaan API dan mengembalikannya sebagai respons JSON.

   ```
   exports.handler = async (event) => {
     // Extract specific properties from the event object
     const { resource, path, httpMethod, headers, queryStringParameters, body } = event;
     const response = {
       resource,
       path,
       httpMethod,
       headers,
       queryStringParameters,
       body,
     };
     return {
       body: JSON.stringify(response, null, 2),
       statusCode: 200,
     };
   };
   ```

## Langkah 4: Menyebarkan tumpukan AWS CDK
<a name="lambda-cdk-step-4"></a>

1. Dari root proyek Anda, jalankan perintah [cdk synth](https://docs.aws.amazon.com/cdk/v2/guide/ref-cli-cmd-synth.html):

   ```
   cdk synth
   ```

   Perintah ini mensintesis AWS CloudFormation template dari tumpukan CDK Anda. Template adalah file YAMM sekitar 400 baris, mirip dengan yang berikut ini. 
**catatan**  
Jika Anda mendapatkan kesalahan berikut, pastikan Anda berada di root direktori proyek Anda.  

   ```
   --app is required either in command-line, in cdk.json or in ~/.cdk.json
   ```  
**Example CloudFormation Template**  

   ```
   Resources:
     MyFunctionServiceRole3C357FF2:
       Type: AWS::IAM::Role
       Properties:
         AssumeRolePolicyDocument:
           Statement:
             - Action: sts:AssumeRole
               Effect: Allow
               Principal:
                 Service: lambda.amazonaws.com
           Version: "2012-10-17"		 	 	 
         ManagedPolicyArns:
           - Fn::Join:
               - ""
               - - "arn:"
                 - Ref: AWS::Partition
                 - :iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
       Metadata:
         aws:cdk:path: HelloLambdaStack/MyFunction/ServiceRole/Resource
     MyFunction1BAA52E7:
       Type: AWS::Lambda::Function
       Properties:
         Code:
           S3Bucket:
             Fn::Sub: cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}
           S3Key: ab1111111cd32708dc4b83e81a21c296d607ff2cdef00f1d7f48338782f92l3901.zip
         Handler: index.handler
         Role:
           Fn::GetAtt:
             - MyFunctionServiceRole3C357FF2
             - Arn
         Runtime: nodejs24.x
         ...
   ```

1. Jalankan [perintah cdk deploy](https://docs.aws.amazon.com/cdk/v2/guide/ref-cli-cmd-deploy.html):

   ```
   cdk deploy
   ```

   Tunggu sementara sumber daya Anda dibuat. Output akhir menyertakan URL untuk titik akhir API Gateway Anda. Contoh:

   ```
   Outputs:
   HelloLambdaStack.ApiGwEndpoint77F417B1 = https://abcd1234.execute-api.us-east-1.amazonaws.com/prod/
   ```

## Langkah 5: Uji fungsinya
<a name="lambda-cdk-step-5"></a>

Untuk menjalankan fungsi Lambda, salin titik akhir API Gateway dan tempelkan ke browser web atau jalankan perintah: `curl`

```
curl -s https://abcd1234.execute-api.us-east-1.amazonaws.com/prod/
```

Responsnya adalah representasi JSON dari properti yang dipilih dari objek peristiwa asli, yang berisi informasi tentang permintaan yang dibuat ke titik akhir API Gateway. Contoh:

```
{
  "resource": "/",
  "path": "/",
  "httpMethod": "GET",
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
    "Accept-Encoding": "gzip, deflate, br, zstd",
    "Accept-Language": "en-US,en;q=0.9",
    "CloudFront-Forwarded-Proto": "https",
    "CloudFront-Is-Desktop-Viewer": "true",
    "CloudFront-Is-Mobile-Viewer": "false",
    "CloudFront-Is-SmartTV-Viewer": "false",
    "CloudFront-Is-Tablet-Viewer": "false",
    "CloudFront-Viewer-ASN": "16509",
    "CloudFront-Viewer-Country": "US",
    "Host": "abcd1234.execute-api.us-east-1.amazonaws.com",
     ...
```

## Langkah 6: Bersihkan sumber daya Anda
<a name="lambda-cdk-step-6"></a>

Titik akhir API Gateway dapat diakses publik. Untuk mencegah tagihan yang tidak terduga, jalankan perintah [cdk destroy](https://docs.aws.amazon.com/cdk/v2/guide/ref-cli-cmd-destroy.html) untuk menghapus tumpukan dan semua sumber daya terkait.

```
cdk destroy
```

## Langkah selanjutnya
<a name="lambda-cdk-next-steps"></a>

Untuk informasi tentang menulis AWS CDK aplikasi dalam bahasa pilihan Anda, lihat berikut ini:

------
#### [ TypeScript ]

[Bekerja dengan AWS CDK di TypeScript](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-typescript.html)

------
#### [ JavaScript ]

[Bekerja dengan AWS CDK di JavaScript](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-javascript.html)

------
#### [ Python ]

[Bekerja dengan AWS CDK in Python](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-python.html)

------
#### [ Java ]

[Bekerja dengan AWS CDK di Jawa](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-java.html)

------
#### [ C\$1 ]

[Bekerja dengan AWS CDK di C \$1](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-csharp.html)

------
#### [ Go ]

[Bekerja dengan AWS CDK in Go](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-go.html)

------