Blog AWS Indonesia

Menggunakan AWS Lambda SnapStart dengan infrastructure as code dan CI/CD pipeline

AWS Lambda SnapStart memungkinkan pelanggan untuk mengurangi cold starts dengan melakukan caching dari fungsi Lambda yang telah di-snapshot dan dienkripsi, dan menggunakan ulang snapshot tersebut untuk pemanggilan eksekusi berikutnya.

Artikel ini akan menjelaskan dengan lebih detil bagaimana mengaktifkan SnapStart dengan beberapa tool infrastructure as code: AWS Serverless Application Model (AWS SAM), AWS CloudFormation, dan Terraform. Artikel ini akan menunjukkan apa yang terjadi pada deployment Lambda ketika SnapStart diaktifkan, dan juga praktik terbaik dalam mengaplikasikannya dalam CI/CD pipeline.

Snapstart dapat secara signifikan mengurangi waktu cold start untuk fungsi Lambda yang ditulis dalam Java. Contoh yang diberikan pada pengumuman di blog mengurangi durasi cold start dari 6 detik ke 0.2 detik.

Menggunakan SnapStart

Anda dapat mengaktifkan fitur SnapStart melalui settingan konfigurasi di Lambda. Namun, ada beberapa langkah tambahan untuk menggunakan fitur SnapStart.

Mengaktifkan versioning pada fungsi Lambda

SnapStart bekerja secara bersamaan dengan versioning pada Lambda. Fungsi dinisialisasi ketika Anda mempublikasi versi terbaru dari fungsi Lambda. Untuk itu, Anda perlu mengaktifkan Lambda versions untuk menggunakan SnapStart. Untuk informasi lebih lanjut, silahkan baca Lambda Developer Guide.

Membuat alias dari fungsi Lambda (opsional)

Sebuah alias dari fungsi Lambda memungkinkan Anda untuk mendefinisikan sebuah custom pointer, dan mengontrol versi Lambda mana yang akan digunakan. Meskipun ini opsional, membuat sebuah alias dari fungsi Lambda akan membuat manajemen operasi lebih mudah. Anda dapat mengubah versi dari Lambda yang terikat ke alias tanpa perlu memodifikasi aplikasi yang menggunakan fungsi Lambda tersebut.

Mengubah aplikasi atau layanan AWS yang memanggil fungsi Lambda

Ketika Anda sudah memiliki versi Lambda yang menggunakan SnapStart, Anda harus mengubah mekanisme yang memanggil fungsi Lambda tersebut menggunakan qualified Lambda ARN. Ini berarti memanggil versi Lambda tertentu secara langsung atau menggunakan Lambda alias, yang akan menunjuk pada versi lambda yang diinginkan.

Jika Anda tidak mengubah mekanisme pemanggilan dari fungsi Lambda tersebut, atau menggunakan unqualified ARN, Anda tidak dapat memanfaatkan optimasi yang disediakan oleh SnapStart.

Menggunakan SnapStart dengan infrastructure as code

AWS CloudFormation

UnicornStockBroker adalah sebuah contoh aplikasi Serverless. Aplikasi ini terdiri dari Amazon API Gateway endpoint, sebuah fungsi Lambda ditulis dengan Java, dan sebuah tabel Amazon DynamoDB. Temukan CloudFormation template tanpa SnapStart pada GitHub repository ini.

Untuk mengaktifkan SnapStart:

  1. Aktifkan Lambda versioning dengan menambahkan tipe resource AWS::Lambda::Version:
      UnicornStockBrokerFunctionVersion1:
        Type: AWS::Lambda::Version
        Properties:
          FunctionName: !Ref 'UnicornStockBrokerFunction'
  2. Untuk deploy sebuah fungsi Lambda versi terbaru dengan CloudFormation, ganti nama resource dari UnicornStockBrokerFunctionVersion1 ke UnicornStockBrokerFunctionVersion2.
  3. Buat sebuah Lambda alias menggunakan tipe resource AWS::Lambda::Alias:
    UnicornStockBrokerFunctionAliasSnapStart:
      Type: AWS::Lambda::Alias
      Properties:
        Name: SnapStart
        FunctionName: !Ref 'UnicornStockBrokerFunction'
        FunctionVersion: !GetAtt 'UnicornStockBrokerFunctionVersion.Version'
  4. Update API Gateway untuk memanggil alias ke fungsi Lambda, tapi bukan menggunakan unqualified ARN. Ini untuk memastikan API Gateway memanggil Lambda alias yang telah ditentukan:
    ServerlessRestApi:
      Type: AWS::ApiGateway::RestApi
      Properties:
        Body:
          paths:
            /transactions:
              post:
                x-amazon-apigateway-integration:
                  [..]
                  uri: !Sub 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${UnicornStockBrokerFunctionAliasSnapStart}/invocations'
    
  5. Modifikasi IAM permission untuk memperbolehkan API Gateway memanggil Lambda alias yang telah ditentukan:
    UnicornStockBrokerFunctionUnicornStockBrokerEventPermissionProd:
      Type: AWS::Lambda::Permission
      Properties:
        [..]
        FunctionName: !Ref UnicornStockBrokerFunctionAliasSnapStart
    
  6. Aktifkan SnapStart pada fungsi Lambda:
    UnicornStockBrokerFunction:
      Type: AWS::Lambda::Function
      Properties:
        [..]
        SnapStart:
          ApplyOn: PublishedVersions

Setelah update ini, template CloudFormation dengan SnapStart yang telah aktif akan terlihat seperti ini. Anda dapat deploy contoh aplikasi tersebut dan mendapat kelebihan dari SnapStart.

AWS SAM

Anda dapat menemukan template AWS SAM tanpa SnapStart di sini. Untuk mengaktifkan SnapStart:

  1. Aktifkan versi Lambda dan buat sebuah Lambda alias dengan menambahkan properti AutoPublishAlias, AWS SAM secara otomatis akan mempublikasikan versi Lambda terbaru untuk setiap deployment baru, dan secara otomatis mengarahkan Lambda alias ke versi yang baru dipublikasikan:
      UnicornStockBrokerFunction:
        Type: AWS::Serverless::Function
        Properties: 
          [..]
          AutoPublishAlias: SnapStart
    
  2. Aktifkan SnapStart pada fungsi Lambda:
    UnicornStockBrokerFunction:
      Type: AWS::Serverless::Function
      Properties:
        [..]
        SnapStart:
          ApplyOn: PublishedVersions
    

Contoh ini menggunakan resource AWS::Serverless:Function dengan properti AutoPublishAlias. AWS SAM secara implisit akan membuat Amazon API Gateway dengan permission dan konfigurasi yang sesuai untuk memanggil fungsi Lambda menggunakan Lambda alias yang telah dideklarasikan.

Anda dapat melihat template AWS SAM yang telah dimodifikasi di sini. Anda dapat deploy contoh aplikasi tersebut dan mendapat manfaat dari SnapStart.

Terraform

Anda dapat menemukan template Terraform tanpa SnapStart di sini. Untuk mengaktifkan Lambda SnapStart menggunakan Hashicorp Terraform:

  1. Aktifkan versioning pada Lambda dengan menambahkan properti publish pada resource aws_lambda_function
    resource "aws_lambda_function" "UnicornStockBrokerFunction" {
      [...]
      publish = true
    }
    
  2. Buat sebuah Lambda alias dengan menambahkan resource aws_lambda_alias:
    resource "aws_lambda_alias" "UnicornStockBrokerFunction_SnapStartAlias" {
      name             = "SnapStart"
      description      = "Alias for SnapStart"
      function_name    = aws_lambda_function.UnicornStockBrokerFunction.function_name
      function_version = aws_lambda_function.UnicornStockBrokerFunction.version
    }
    
  3. Update API Gateway untuk memanggil alias dari fungsi Lambda tersebut, bukan menggunakan unqualified ARN:
    SnapshotFunction:
    resource "aws_api_gateway_integration" "createproduct-lambda" {
      [...]
      uri = aws_lambda_alias.UnicornStockBrokerFunction_SnapStartAlias.invoke_arn
    }
    
  4. Modifikasi uri pada aws_lambda_permission untuk memperbolehkan API Gateway memanggil Lambda alias yang telah ditentukan sebelumnya:
    resource "aws_lambda_permission" "apigw-CreateProductHandler" {
      [...]
      qualifier = aws_lambda_alias.UnicornStockBrokerFunction_SnapStartAlias.name
    }
    
  5. Aktifkan Lambda SnapStart dengan menambahkan sebuah argumen snap_start pada resource aws_lambda_function:
    resource "aws_lambda_function" "UnicornStockBrokerFunction" {
      [...]
      snap_start {
        apply_on ="PublishedVersions"
      }
    }
    

Anda dapat melihat template Terraform yang dimodifikasi di sini. Anda dapat deploy contoh aplikasi tersebut dan mendapat kelebihan dari SnapStart.

Bagaimana deployment berubah dengan SnapStart?

Bagian ini menjelaskan bagaimana deployment berubah setelah mengaktifkan Lambda SnapStart.

Sebelum menambahkan Lambda versions, Lambda alias dan SnapStart, ini adalah proses untuk mempublikasi kode baru ke sebuah fungsi:

Fase deployment di Lambda

Setelah mengaktifkan Lambda versions, Lambda alias dan Lambda SnapStart, ada beberapa langkah untuk deployment:

Fase deployment Lambda dengan Versions, Alias dan SnapStart

Selama proses deployment dari sebuah versi Lambda, Lambda membuat sebuah lingkungan eksekusi baru dan melakukan inisialisasi dengan kode baru tersebut. Ketika kode sudah diinisialisasi, Lambda mengambil Snapshot dari inisialisasi kode tersebut. Sekarang deployment memerlukan waktu lebih lama dari sebelumnya tanpa SnapStart karena membutuhkan waktu tambahan untuk inisialisasi lingkungan eksekusi dan membuat snapshot dari fungsi yang diinisialisasi tersebut.

Ketika sebuah versi Lambda baru sedang dibuat, Lambda alias tidak berubah dan tetap memanggil versi sebelumnya untuk dipanggil. Sisi aplikasi yang memanggil tidak mengetahui proses deployment ini, karena itu tambahan waktu dari deployment tidak memberikan dampak pada aplikasi yang memanggil.

Ketika fungsi versi terbaru sudah siap, Anda dapat mengupdate Lambda alias untuk menunjuk pada versi Lambda terbaru (hal ini dilakukan secara otomatis pada contoh IaC sebelumnya).

Dengan menggunakan Lambda alias, Anda tidak harus memanggil fungsi Lambda dengan versi terbaru. Anda dapat menggunakan konfigurasi Alias routing untuk mengarahkan traffic secara gradual ke Lambda versi terbaru, ini mempermudah Anda untuk melakukan tes secara gradual pada fungsi Lambda versi terbaru dan melakukan rollback jika terdapat masalah pada versi terakhir.

Terdapat tambahan failure mode pada deployment ini. Inisialisasi dari versi terbaru Lambda dapat gagal karena terdapat error dalam kodenya. Sebagai contoh, Lambda tidak akan menginisialisasi kode Anda jika terdapat unhandled exception ketika tahap inisialisasi. Ini adalah tambahan failure mode yang harus Anda tangani pada tahapan deployment.

Pertimbangan CI/CD

Deployment lebih lama

Pertimbangan pertama ketika mengaktifkan Lambda SnapStart adalah bertambahnya waktu deployment.

Ketika Anda deploy CI/CD pipeline pada Lambda yang memiliki SnapStart, Lambda melakukan inisialisasi lingkungan eksekusi baru dan mengambil snapshot dari memori dan disk dari kode yang diinisialisasi. Ini memakan waktu dan latensinya tergantung inisialisasi dari fungsi Lambda Anda dan ukuran keseluruhan dari snapshot.

Tambahan delay ini dapat menjadi signifikan untuk CI/CD pipeline dengan banyak fungsi Lambda. Untuk itu, jika Anda mempunyai aplikasi dengan beberapa fungsi Lambda, aktifkan Lambda SnapStart secara gradual pada fungsi-fungsi tersebut, kemudian ubah timeout CI/CD pipeline berdasarkan hal tersebut.

Deployment failure mode

Dengan Lambda SnapStart, terdapat tambahan failure mode yang perlu Anda tangani pada CI/CD pipeline.

Seperti yang dijelaskan sebelumnya, ketika membuat versi baru dari Lambda terdapat kemungkinan kesalahan saat melakukan inisialisasi kode Lambda. Skenario kegagalan ini dapat dimitigasi dengan 2 cara:

  1. Tambahkan prosedur tes dalam CI/CD pipeline Anda.
    Anda dapat menambahkan prosedur tes untuk memvalidasi bahwa fungsi telah diinisasi dengan sukses. Prosedur tes ini dapat dilakukan secara lokal dengan menjalankan fungsi Lambda menggunakan sam local atau menjalankan tes lokal dengan Lambda Java Test library
  2. Deploy fungsi Lambda ke lingkungan tes dengan SnapStart yang telah aktif.
    Cara mendeteksi masalah lebih awal adalah dengan deploy fungsi Lambda ke lingkungan tes dengan SnapStart telah aktif. Dengan deploy fungsi Lambda yang memiliki StapStart dalam sebuah lingkungan tes, Anda dapat mengenali masalah lebih awal pada alur development Anda, dan melakukan end-to-end testing dan tes performa.

Kesimpulan

Artikel ini menunjukkan langkah-langkah yang diperlukan untuk menggunakan Lambda SnapStart, dengan contoh untuk AWS CloudFormation, AWS SAM, dan Terraform.

Ketika Anda menggunakan fitur ini, ada beberapa langkah tambahan yang dilakukan Lambda ketika proses deployment. Lambda melakukan inisialisasi versi Lambda baru dengan kode baru kemudian mengambil snapshot. Operasi ini memerlukan waktu dan mungkin gagal jika terjadi kesalahan pada saat inisialisasi kode, karena itu Anda perlu membuat beberapa perubahan pada CI/CD pipeline Anda untuk mengatasi beberapa skenario ini.

Jika Anda ingin mempelajari lebih lanjut tentang fitur Lambda SnapStart, baca selengkapnya pada AWS Lambda Developer Guide atau kunjungi Java on AWS Lambda workshop kami. Untuk mempelajari lebih lanjut tentang ini dan fitur-fitur lainnya, kunjungi Serverless Land.

Artikel ini diterjemahkan dari artikel asli dengan judul “Using AWS Lambda SnapStart with infrastructure as code and CI/CD pipelines” yang ditulis oleh Michele Ricciardi, Specialist Solutions Architect, DevAx.

Rio Astamal

Rio Astamal

Rio Astamal is a Developer Advocate at AWS and a passionate web developer since 2003. In his spare time he loves writing small open source projects to solve problem in his daily activity.