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 kebijakan sebagai kode sumber terbuka, tujuan umum. Ini dapat digunakan untuk tata kelola dan kepatuhan preventif dengan memvalidasi template Infrastructure as Code (IaC) dan komposisi layanan terhadap aturan kebijakan. Aturan-aturan ini dapat disesuaikan berdasarkan persyaratan tim atau organisasi Anda. Untuk fungsi Lambda, aturan Guard dapat digunakan untuk mengontrol pembuatan sumber daya dan pembaruan konfigurasi dengan menentukan pengaturan properti yang diperlukan 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 menerapkan 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 di workstation lokal. Pengembang membuat kode, memvalidasi template dengan alat baris perintah, dan kemudian mengkomit kode ke repositori, yang kemudian secara otomatis divalidasi melalui CI/CD pipeline sebelum penerapan ke AWS lingkungan.
Dengan Guard, Anda dapat menulis aturan dan menerapkan kontrol Anda dengan bahasa khusus domain sebagai berikut.
Misalnya, Anda ingin memastikan bahwa pengembang hanya memilih runtime terbaru. Anda dapat menentukan dua kebijakan yang berbeda, satu untuk mengidentifikasi runtime yang sudah usang dan satu lagi untuk mengidentifikasi runtime yang akan segera dihentikan. 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 util itas 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 } } } }
Dengan Guard, pengembang Anda dapat melihat dari workstation pengembang lokal mereka bahwa mereka perlu memperbarui template untuk menggunakan runtime yang diizinkan oleh organisasi. Ini terjadi sebelum berkomitmen ke repositori kode dan kemudian gagal memeriksa dalam CI/CD pipeline. Akibatnya, pengembang Anda mendapatkan umpan balik ini tentang cara mengembangkan template 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 dalam CI/CD pipeline sebelum penerapan.
Peringatan
Jika Anda menggunakan template AWS Serverless Application Model (AWS SAM) 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 untuk dimasukkan dalam definisi sumber daya. Sementara itu, AWS SAM template memungkinkan properti untuk ditentukan di bagian Globals yang terpisah. Properti yang didefinisikan di bagian Globals tidak divalidasi dengan aturan Guard Anda.
Sebagaimana diuraikan dalam dokumentasi pemec ahan masalah Guard, ketahuilah bahwa Guard tidak mendukung intrinsik bentuk pendek seperti !GetAtt atau !Sub dan sebaliknya memerlukan penggunaan formulir yang diperluas: dan. Fn::GetAtt Fn::Sub (Contoh sebelumnya tidak mengevaluasi properti Role, jadi intrinsik bentuk pendek digunakan untuk kesederhanaan.)