View a markdown version of this page

Kontrol proaktif untuk Lambda dengan AWS CloudFormation Guard - AWS Lambda

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

Kontrol proaktif untuk Lambda dengan AWS CloudFormation Guard

AWS CloudFormation Guardadalah alat evaluasi open-source, tujuan umum, kebijakan sebagai kode. Ini dapat digunakan untuk tata kelola preventif dan kepatuhan dengan memvalidasi template Infrastructure as Code (IAc) dan komposisi layanan terhadap aturan kebijakan. Aturan ini dapat disesuaikan berdasarkan persyaratan tim atau organisasi Anda. Untuk fungsi Lambda, aturan Penjaga dapat digunakan untuk mengontrol pembuatan sumber daya dan pembaruan konfigurasi dengan menentukan pengaturan properti yang diperlukan saat membuat atau memperbarui fungsi Lambda.

Administrator kepatuhan menentukan daftar kontrol dan kebijakan tata kelola yang diperlukan untuk menerapkan dan memperbarui fungsi Lambda. Administrator platform mengimplementasikan kontrol dalam CI/CD pipeline, sebagai webhook validasi pra-komit dengan repositori kode, dan menyediakan pengembang dengan alat baris perintah untuk memvalidasi template dan kode pada workstation lokal. Pengembang membuat kode, memvalidasi template dengan alat baris perintah, dan kemudian komit kode ke repositori, yang kemudian secara otomatis divalidasi melalui CI/CD pipeline sebelum penerapan ke lingkungan. AWS

Guard memungkinkan Anda untuk menulis aturan dan menerapkan kontrol Anda dengan bahasa khusus domain sebagai berikut.

Guard rules include resource type, property name, operator, expression value, and optional comment

Misalnya, Anda ingin memastikan bahwa pengembang hanya memilih runtime terbaru. Anda dapat menentukan dua kebijakan berbeda, satu untuk mengidentifikasi runtime yang sudah usang dan satu lagi untuk mengidentifikasi runtime yang akan segera usang. Untuk melakukan ini, Anda dapat menulis etc/rules.guard file berikut:

let lambda_functions = Resources.*[ Type == "AWS::Lambda::Function" ] rule lambda_already_deprecated_runtime when %lambda_functions !empty { %lambda_functions { Properties { when Runtime exists { Runtime !in ["dotnetcore3.1", "nodejs12.x", "python3.6", "python2.7", "dotnet5.0", "dotnetcore2.1", "ruby2.5", "nodejs10.x", "nodejs8.10", "nodejs4.3", "nodejs6.10", "dotnetcore1.0", "dotnetcore2.0", "nodejs4.3-edge", "nodejs"] <<Lambda function is using a deprecated runtime.>> } } } } rule lambda_soon_to_be_deprecated_runtime when %lambda_functions !empty { %lambda_functions { Properties { when Runtime exists { Runtime !in ["nodejs16.x", "nodejs14.x", "python3.7", "java8", "dotnet7", "go1.x", "ruby2.7", "provided"] <<Lambda function is using a runtime that is targeted for deprecation.>> } } } }

Sekarang misalkan Anda menulis iac/lambda.yaml CloudFormation template berikut yang mendefinisikan fungsi Lambda:

Fn: Type: AWS::Lambda::Function Properties: Runtime: python3.7 CodeUri: src Handler: fn.handler Role: !GetAtt FnRole.Arn Layers: - arn:aws:lambda:us-east-1:111122223333:layer:LambdaInsightsExtension:35

Setelah menginstal utilitas Guard, validasi template Anda:

cfn-guard validate --rules etc/rules.guard --data iac/lambda.yaml

Keluaran terlihat seperti ini:

lambda.yaml Status = FAIL FAILED rules rules.guard/lambda_soon_to_be_deprecated_runtime --- Evaluating data lambda.yaml against rules rules.guard Number of non-compliant resources 1 Resource = Fn { Type = AWS::Lambda::Function Rule = lambda_soon_to_be_deprecated_runtime { ALL { Check = Runtime not IN ["nodejs16.x","nodejs14.x","python3.7","java8","dotnet7","go1.x","ruby2.7","provided"] { ComparisonError { Message = Lambda function is using a runtime that is targeted for deprecation. Error = Check was not compliant as property [/Resources/Fn/Properties/Runtime[L:88,C:15]] was not present in [(resolved, Path=[L:0,C:0] Value=["nodejs16.x","nodejs14.x","python3.7","java8","dotnet7","go1.x","ruby2.7","provided"])] } PropertyPath = /Resources/Fn/Properties/Runtime[L:88,C:15] Operator = NOT IN Value = "python3.7" ComparedWith = [["nodejs16.x","nodejs14.x","python3.7","java8","dotnet7","go1.x","ruby2.7","provided"]] Code: 86. Fn: 87. Type: AWS::Lambda::Function 88. Properties: 89. Runtime: python3.7 90. CodeUri: src 91. Handler: fn.handler } } } }

Guard memungkinkan pengembang Anda untuk melihat dari workstation pengembang lokal mereka bahwa mereka perlu memperbarui template untuk menggunakan runtime yang diizinkan oleh organisasi. Ini terjadi sebelum melakukan repositori kode dan kemudian gagal memeriksa dalam pipeline. CI/CD Akibatnya, pengembang Anda mendapatkan umpan balik ini tentang cara mengembangkan templat yang sesuai dan mengalihkan waktu mereka untuk menulis kode yang memberikan nilai bisnis. Kontrol ini dapat diterapkan pada workstation pengembang lokal, dalam webhook validasi pra-komit, and/or di CI/CD pipeline sebelum penerapan.

Peringatan

Jika Anda menggunakan AWS Serverless Application Model (AWS SAM) template untuk menentukan fungsi Lambda, ketahuilah bahwa Anda perlu memperbarui aturan Guard untuk mencari jenis AWS::Serverless::Function sumber daya sebagai berikut.

let lambda_functions = Resources.*[ Type == "AWS::Serverless::Function" ]

Guard juga mengharapkan properti dimasukkan dalam definisi sumber daya. Sementara itu, AWS SAM template memungkinkan properti yang akan ditentukan di bagian Globals terpisah. Properti yang didefinisikan di bagian Globals tidak divalidasi dengan aturan Penjaga Anda.

Seperti yang diuraikan dalam dokumentasi pemecahan masalah Guard, ketahuilah bahwa Guard tidak mendukung intrinsik bentuk pendek seperti !GetAtt atau !Sub dan sebagai gantinya memerlukan penggunaan formulir yang diperluas: and. Fn::GetAtt Fn::Sub (Contoh sebelumnya tidak mengevaluasi properti Peran, jadi intrinsik bentuk pendek digunakan untuk kesederhanaan.)