Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
CloudFormation dukungan ekstensi bahasa
AWS SAMCLIMendukung template yang menggunakan AWS::LanguageExtensions transformasi, termasukFn::ForEach,Fn::Length,Fn::ToJsonString, dan Fn::FindInMap denganDefaultValue. Untuk informasi referensi lengkap tentang konstruksi ini, lihat AWS::LanguageExtensions mengubah dalam Panduan AWS CloudFormation Pengguna.
Untuk menggunakan ekstensi bahasa dalam AWS SAM templat, daftar AWS::LanguageExtensions di Transform bagian sebelumnyaAWS::Serverless-2016-10-31:
Transform: - AWS::LanguageExtensions - AWS::Serverless-2016-10-31
Ketika AWS SAMCLI mendeteksi AWS::LanguageExtensions di Transform bagian template dan Anda telah memilih untuk pemrosesan lokal, itu memperluas konstruksi ekstensi bahasa secara lokal sebelum menjalankan transformasi. AWS SAM Hal ini memungkinkan sam buildsam package,sam deploy,sam sync,sam validate,sam local invoke,sam local start-api,, dan sam local start-lambda untuk bekerja dengan template yang menggunakan konstruksi ini.
Pemrosesan lokal dimatikan secara default. Saat mati, AWS SAMCLI melewati templat tanpa perubahan dan CloudFormation memproses sisi server AWS::LanguageExtensions transformasi pada waktu penerapan. Untuk metode aktivasi, lihatMengaktifkan ekstensi bahasa.
Ekspansi terjadi dalam dua fase saat diaktifkan:
-
Fase 1 (Ekstensi Bahasa) —
Fn::ForEachloop diperluas, fungsi intrinsik diselesaikan jika memungkinkan, dan template dikonversi ke standar. CloudFormation -
Fase 2 (AWS SAM Transform) - Template yang diperluas diproses oleh AWS SAM Penerjemah seperti biasa.
Template asli (dengan Fn::ForEach utuh) dipertahankan untuk CloudFormation penerapan, karena CloudFormation memproses AWS::LanguageExtensions transformasi sisi server.
Mengaktifkan ekstensi bahasa
Pemrosesan lokal AWS::LanguageExtensions adalah opt-in per perintah. Ada tiga metode aktivasi yang setara, tercantum dalam urutan prioritas:
-
CLIbendera —
--language-extensionsteruskan satu doa:sam build --language-extensions sam package --language-extensions ... sam deploy --language-extensions ...--no-language-extensionsmenonaktifkan secara eksplisit, mengesampingkan keduanyasamconfig.tomldan variabel lingkungan yang dijelaskan di bawah ini. -
samconfig.toml— mempertahankan pilihan per proyek:[default.build.parameters] language_extensions = true [default.package.parameters] language_extensions = true [default.deploy.parameters] language_extensions = true [default.sync.parameters] language_extensions = true [default.local_invoke.parameters] language_extensions = true [default.local_start_api.parameters] language_extensions = true [default.local_start_lambda.parameters] language_extensions = true [default.validate.parameters] language_extensions = truesamconfig.tomlEntri dimuat sebagai default untuk perintah, sehingga berlaku seolah-olah bendera dilewatkan — dan karenanya menang atas variabel lingkungan. -
Variabel lingkungan - diatur
SAM_CLI_ENABLE_LANGUAGE_EXTENSIONS=1untuk mengaktifkan shell saat ini:export SAM_CLI_ENABLE_LANGUAGE_EXTENSIONS=1 sam build sam local invoke MyFunctionNilai-nilai yang benar (case-insensitive) adalah
1,, dan.trueyesHal lain, termasuk string kosong, diperlakukan sebagai tidak aktif. Variabel lingkungan dikonsultasikan hanya ketika tidak ada CLI tanda atausamconfig.tomlmenetapkan nilai.
penting
Setiap perintah membutuhkan aktivasi sendiri. Melewati --language-extensions ke sam build tidak menyebar ke nanti sam local invoke — pemrosesan lokal diputuskan per pemanggilan perintah. Gunakan variabel lingkungan atau samconfig.toml entri untuk mengaktifkan seluruh perintah tanpa mengulangi bendera.
Fn:: ForEach
Fn::ForEachmenghasilkan beberapa sumber daya, kondisi, atau output dari satu definisi template:
Transform: - AWS::LanguageExtensions - AWS::Serverless-2016-10-31 Parameters: ServiceNames: Type: CommaDelimitedList Default: "Users,Orders,Products" Resources: Fn::ForEach::Services: - Name - !Ref ServiceNames - ${Name}Function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: python3.12 CodeUri: ./services/${Name}
Running sam build memperluas ini menjadiUsersFunction,OrdersFunction, danProductsFunction, masing-masing dibangun dari direktori sumbernya masing-masing.
Sifat artefak dinamis
Ketika properti packageable menggunakan variabel loop (misalnya,./services/${Name}), akan AWS SAMCLI menghasilkan CloudFormation Mappings bagian yang memetakan setiap nilai koleksi ke Amazon S3-nya. URI Fn::ForEachTubuh ditulis ulang untuk digunakan Fn::FindInMap sehingga CloudFormation dapat menyelesaikan artefak yang benar pada waktu penyebaran.
Properti artefak yang diakui adalah yang sama yang sam package ditulis ulang hari ini. Itu termasuk:
| Tipe sumber daya | Properti |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Untuk properti bertitik (misalnya, aktif AWS::Glue::Job atau Command.ScriptLocation Code.ImageUri aktifAWS::Lambda::Function), nilainya dibaca dan ditulis di lokasi bersarang pada sumber daya. Nama Pemetaan yang dihasilkan hanya menggunakan segmen daun dari jalur properti.
Ketika properti di-loop-templated, nama Pemetaan adalah SAM<LeafProperty><LoopName> (misalnya, atau). SAMCodeUriServices SAMScriptLocationJobs
penting
Customer-authored pemetaan tidak boleh dimulai dengan SAM* awalan ini — mereka dicadangkan untuk. AWS SAMCLI Lihat Batasan.
Misalnya, setelahsam package:
Mappings: SAMCodeUriServices: Users: CodeUri: s3://my-bucket/abc123 Orders: CodeUri: s3://my-bucket/def456 Products: CodeUri: s3://my-bucket/ghi789 Resources: Fn::ForEach::Services: - Name - !Ref ServiceNames - ${Name}Function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: python3.12 CodeUri: !FindInMap [SAMCodeUriServices, !Ref Name, CodeUri]
Berbagai sumber daya per ForEach tubuh
Satu Fn::ForEach benda dapat memancarkan lebih dari satu sumber daya per iterasi. Setiap sumber daya dihasilkan untuk setiap nilai koleksi:
Resources: Fn::ForEach::Tables: - TableName - [Users, Orders, Products] - ${TableName}Table: Type: AWS::DynamoDB::Table Properties: TableName: !Sub "${AWS::StackName}-${TableName}" # ... ${TableName}StreamProcessor: Type: AWS::Serverless::Function Properties: CodeUri: stream-processors/${TableName}/ Events: DDBStream: Type: DynamoDB Properties: Stream: !GetAtt - !Sub "${TableName}Table" - StreamArn
Pemetaan resolusi tabrakan nama
Ketika dua sumber daya dalam Fn::ForEach badan yang sama mendeklarasikan properti artefak dinamis yang sama (misalnya, penggunaan Api dan StateMachine penggunaanDefinitionUri), menambahkan AWS SAMCLI akhiran yang diambil dari bagian statis template Logical-ID sumber daya agar nama Pemetaan tetap unik:
| Template sumber daya | Properti | Nama pemetaan |
|---|---|---|
|
|
|
|
|
|
Ketika tidak ada tabrakan, nama dasar (misalnya,SAMDefinitionUriServices) digunakan.
Parameter-based koleksi
Ketika Fn::ForEach koleksi adalah referensi parameter (misalnya,!Ref ServiceNames) dan badan loop menggunakan properti artefak dinamis (misalnya,CodeUri: ./services/${Name}), AWS SAMCLI kebutuhan nilai koleksi untuk menghasilkan SAM* Pemetaan dijelaskan dalam. Sifat artefak dinamis Ini menyelesaikannya ketika memproses template, dari:
-
--parameter-overridesditeruskan ke AWS SAMCLI perintah. -
DefaultNilai parameter dalam template.
penting
Karena SAM* Pemetaan dibuat pada waktu paket, Anda harus mengemas ulang setiap kali Anda mengubah nilai parameter (misalnya, saat menambahkan layanan baru) sehingga Pemetaan menyertakan entri untuk nilai baru. Ini hanya berlaku ketika parameter menggerakkan loop artefak dinamis; penggantian parameter lainnya dapat diubah pada waktu penerapan seperti biasa.
# Package with the values you intend to deploy with sam package --language-extensions --parameter-overrides ServiceNames="Users,Orders,Products" # Deploy with the same values sam deploy --language-extensions --parameter-overrides ServiceNames="Users,Orders,Products"
Tumpukan nested
Fn::ForEachdi template tumpukan bersarang (AWS::CloudFormation::Stack) didukung. AWS SAMCLIMeneruskan Parameters properti tumpukan induk ke ekspansi templat anak, sehingga Fn::ForEach koleksi anak yang mereferensikan parameter yang disediakan induk diselesaikan dengan benar.
# parent.yaml Resources: ChildStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: ./child.yaml Parameters: ServiceNames: "Users,Orders,Products"
Fn bersarang:: ForEach
Hingga 5 level bersarang didukung, sesuai dengan CloudFormation batas:
Resources: Fn::ForEach::Envs: - Env - [Dev, Staging, Prod] - Fn::ForEach::Services: - Svc - [Users, Orders] - ${Env}${Svc}Function: Type: AWS::Serverless::Function Properties: CodeUri: ./services/${Svc} Environment: Variables: STAGE: ${Env}
ForEach di Output
Fn::ForEachblok juga diperluas di dalam Outputs bagian, sehingga Anda dapat memancarkan satu output per nilai koleksi:
Outputs: Fn::ForEach::FunctionArns: - Name - [alpha, beta] - ${Name}FunctionArn: Value: !GetAtt - !Sub "${Name}Function" - Arn
Kondisi dan DependsOn
Sumber daya yang dipancarkan oleh Fn::ForEach dapat membawa Condition dan DependsOn seperti sumber daya lainnya. Kondisi atau ketergantungan direplikasi ke setiap sumber daya yang dihasilkan:
Conditions: IsProd: !Equals [!Ref Environment, prod] Resources: SharedTable: Type: AWS::DynamoDB::Table # ... Fn::ForEach::Functions: - Name - [api, worker] - ${Name}Function: Type: AWS::Serverless::Function Condition: IsProd DependsOn: SharedTable Properties: Handler: main.handler CodeUri: functions/${Name}/
&{identifier} sintaks
&{identifier}Sintaks menghapus karakter non-alfanumerik dari nilai substitusi, yang berguna untuk menghasilkan ID logis yang valid dari nilai-nilai seperti alamat IP:
Fn::ForEach::Hosts: - IP - ["10.0.0.1", "10.0.0.2"] - Host&{IP}: Type: AWS::EC2::Instance # Expands to Host10001, Host10002
Fungsi intrinsik yang didukung
Fungsi intrinsik berikut diselesaikan secara lokal selama ekspansi:
| Fungsi | Deskripsi |
|---|---|
|
Ekspansi loop. |
|
Mengembalikan hitungan elemen daftar. |
|
Mengkonversi nilai ke JSON string. |
|
Pencarian peta, termasuk opsional |
|
Pemilihan nilai bersyarat. |
|
Substitusi string. |
|
Rangkaian string. |
|
Pemisahan tali. |
|
Daftar pemilihan elemen. |
|
Pengkodean Base64. |
|
Evaluasi kondisi. |
|
Referensi parameter dan pseudo-parameter. |
Fungsi yang memerlukan sumber daya yang digunakan (Fn::GetAttFn::ImportValue,,Fn::GetAZs) dipertahankan CloudFormation untuk diselesaikan pada waktu penerapan.
Kesalahan validasi
Masalah template berikut ditangkap secara lokal sebelum AWS SAM transformasi berjalan:
| Penyebab | Pesan kesalahan |
|---|---|
|
|
Lebih dari 5 level |
|
Koleksi menyelesaikan ke daftar kosong (misalnya, |
Tidak ada kesalahan - loop dilewati secara diam-diam dan tidak ada sumber daya yang dipancarkan. |
|
Tidak ada kesalahan - referensi yang belum terselesaikan dipertahankan dalam template. Pada waktu penerapan, CloudFormation akan menyelesaikannya di sisi server. |
Batasan
-
Koleksi harus dapat diselesaikan pada waktu build/package .
Fn::ForEachkoleksi yang menggunakanFn::GetAtt,Fn::ImportValue, atau referensi dinamis SSM/Secrets Manajer tidak dapat diperluas secara lokal. Gunakan parameter dengan--parameter-overridessebagai gantinya. -
Pemetaan artefak dinamis ditetapkan pada waktu paket. Ketika
Fn::ForEachkoleksi adalah referensi parameter dan badan loop menggunakan properti artefak dinamis (misalnya,CodeUri: ./services/${Name}),SAM*Pemetaan yang dihasilkan hanya berisi entri untuk nilai parameter yang diselesaikan pada waktu paket. Jika Anda mengubah--parameter-overridesparameter tersebut pada waktu penerapan tanpa mengemas ulang, nilai baru tidak akan memiliki entri Pemetaan dan penerapan akan gagal. Ini tidak berlaku untuk parameter yang tidak digunakan untuk menggerakkanFn::ForEachartefak dinamis. -
DeletionPolicydanUpdateReplacePolicydivalidasi dan diselesaikan selama ekspansi. Mereka mendukungRefparameter tetapi tidak fungsi intrinsik lainnya. -
Batas bersarang. Hingga 5 level
Fn::ForEachmungkin bersarang, cocok dengan batas sisi CloudFormation server. -
Nama Pemetaan Cadangan. Nama pemetaan yang dimulai dengan salah satu dari berikut ini dicadangkan untuk AWS SAMCLI - jangan buat pemetaan Anda sendiri dengan awalan ini:
-
SAMCodeUri,SAMImageUri,,SAMContentUri,SAMDefinitionUri,SAMSchemaUri,SAMBodyS3Location,,SAMDefinitionS3LocationSAMTemplateURLSAMCode,SAMContent— dipancarkan olehsam packageuntuk properti artefak dinamis. Lihat Sifat artefak dinamis tabelnya. -
SAMLayers— dipancarkan olehsam buildketika fungsi yang dihasilkan mengambil referensi lapisan ketergantunganFn::ForEachyang dihasilkan secara otomatis (Lambda melapisi build menjadi tumpukan bersarang). AWS SAMCLI Awalan ini tidak memiliki properti yang ditulis pengguna yang sesuai; itu ditambahkan secara otomatis.
-
Telemetri
AWS SAMCLIMemancarkan peristiwa CFNLanguageExtensions telemetri ketika perintah dipanggil dengan --language-extensions (atau ekivalen variabel lingkungannya) dan template mendeklarasikan transformasi. AWS::LanguageExtensions Acara diaktifkan sekali per pemanggilan dan tidak ada konten template yang ditransmisikan. Saat pemrosesan lokal tidak aktif (default), tidak ada peristiwa yang diaktifkan.