Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
CloudFormation supporto per le estensioni linguistiche
AWS SAMCLISupporta modelli che utilizzano la AWS::LanguageExtensions trasformazione, tra cui Fn::ForEachFn::Length,Fn::ToJsonString, e Fn::FindInMap withDefaultValue. Per informazioni di riferimento complete su questi costrutti, vedete AWS::LanguageExtensions transform nella Guida per l'AWS CloudFormation utente.
Per utilizzare le estensioni linguistiche in un AWS SAM modello, elenca AWS::LanguageExtensions nella Transform sezione precedenteAWS::Serverless-2016-10-31:
Transform: - AWS::LanguageExtensions - AWS::Serverless-2016-10-31
Quando i AWS SAMCLI rilevamenti vengono rilevati AWS::LanguageExtensions nella Transform sezione di un modello e avete optato per l'elaborazione locale, espande localmente i costrutti delle estensioni linguistiche prima di eseguire le trasformazioni. AWS SAM Ciò consentesam build,,sam package,,sam deploy, sam sync sam validate sam local invokesam local start-api, e di lavorare con modelli sam local start-lambda che utilizzano questi costrutti.
L'elaborazione locale è disattivata per impostazione predefinita. Quando è disattivata, AWS SAMCLI passa il modello invariato ed CloudFormation elabora la AWS::LanguageExtensions trasformazione sul lato server al momento della distribuzione. Per i metodi di attivazione, vedere. Abilitazione delle estensioni linguistiche
L'espansione avviene in due fasi quando abilitata:
-
Fase 1 (estensioni del linguaggio): i
Fn::ForEachloop vengono espansi, le funzioni intrinseche vengono risolte ove possibile e il modello viene convertito in standard. CloudFormation -
Fase 2 (AWS SAM Trasformazione): il modello espanso viene elaborato dal AWS SAM Translator come di consueto.
Il modello originale (rimasto Fn::ForEach intatto) viene preservato per la CloudFormation distribuzione, poiché CloudFormation elabora la AWS::LanguageExtensions trasformazione lato server.
Abilitazione delle estensioni linguistiche
L'elaborazione locale di AWS::LanguageExtensions è facoltativa per comando. Esistono tre metodi di attivazione equivalenti, elencati in ordine di priorità:
-
CLIflag — trasmette
--language-extensionsuna singola invocazione:sam build --language-extensions sam package --language-extensions ... sam deploy --language-extensions ...--no-language-extensionsdisabilita esplicitamente, sovrascrivendo sia la variabile di ambiente descrittasamconfig.tomldi seguito. -
samconfig.toml— persiste la scelta per progetto:[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 = trueUna
samconfig.tomlvoce viene caricata di default per il comando, quindi ha effetto come se il flag fosse stato passato e quindi prevale sulla variabile di ambiente. -
Variabile d'ambiente: impostata
SAM_CLI_ENABLE_LANGUAGE_EXTENSIONS=1per essere abilitata per la shell corrente:export SAM_CLI_ENABLE_LANGUAGE_EXTENSIONS=1 sam build sam local invoke MyFunctionI valori veritieri (senza distinzione tra maiuscole e minuscole) sono
1, e.trueyesQualsiasi altra cosa, inclusa la stringa vuota, viene considerata disattivata. La variabile di ambiente viene consultata solo quando né il CLI flag nésamconfig.tomlimposta un valore.
Importante
Ogni comando necessita di una propria attivazione. Il passaggio --language-extensions a sam build non si propaga a un comando successivosam local invoke: l'elaborazione locale viene decisa in base alla chiamata del comando. Utilizzate la variabile di ambiente o una samconfig.toml voce per abilitare più comandi senza ripetere il flag.
Fn:: ForEach
Fn::ForEachgenera più risorse, condizioni o output da un'unica definizione di modello:
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 lo sam build espande in UsersFunctionOrdersFunction, eProductsFunction, ciascuno creato dalla rispettiva directory di origine.
Proprietà dinamiche degli artefatti
Quando una proprietà impacchettabile utilizza una variabile di ciclo (ad esempio./services/${Name}), AWS SAMCLI genera una CloudFormation Mappings sezione che mappa ogni valore della raccolta sul relativo Amazon S3. URI Il Fn::ForEach corpo viene riscritto per essere utilizzato in Fn::FindInMap modo da CloudFormation poter risolvere l'artefatto corretto al momento della distribuzione.
Le proprietà degli artefatti riconosciute sono le stesse riscritte oggi. sam package Ciò include:
| Tipo di risorsa | Proprietà |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Per le proprietà punteggiate (ad esempio, Command.ScriptLocation attivate AWS::Glue::Job o Code.ImageUri attivateAWS::Lambda::Function), il valore viene letto e scritto nella posizione annidata sulla risorsa. Il nome di mappatura generato utilizza solo il segmento fogliare del percorso della proprietà.
Quando la proprietà è basata su un modello di loop, il nome della mappatura è SAM<LeafProperty><LoopName> (ad esempio, o). SAMCodeUriServices SAMScriptLocationJobs
Importante
Customer-authored le mappature non devono iniziare con questi prefissi, in quanto sono SAM* riservate a. AWS SAMCLI Per informazioni, consulta Limitazioni.
Ad esempio, dopo: sam 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]
Risorse multiple per ForEach corpo
Un singolo Fn::ForEach corpo può emettere più di una risorsa per iterazione. Ogni risorsa viene generata per ogni valore di raccolta:
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
Risoluzione delle collisioni tra nomi di mappatura
Quando due risorse nello stesso Fn::ForEach corpo dichiarano la stessa proprietà dinamica dell'artefatto (ad esempio, sia an Api che StateMachine useDefinitionUri), AWS SAMCLI aggiunge un suffisso tratto dalla parte statica del modello Logical-ID della risorsa per mantenere unici i nomi di mappatura:
| Modello di risorse | Proprietà | Nome della mappatura |
|---|---|---|
|
|
|
|
|
|
In assenza di collisione, viene utilizzato il nome di base (ad esempio,SAMDefinitionUriServices).
Parameter-based collezioni
Quando la Fn::ForEach raccolta è un riferimento a un parametro (ad esempio!Ref ServiceNames) e il corpo del ciclo utilizza una proprietà di artefatto dinamica (ad esempio,CodeUri: ./services/${Name}), AWS SAMCLI ha bisogno dei valori della raccolta per generare le SAM* mappature descritte in. Proprietà dinamiche degli artefatti Li risolve quando elabora il modello, da:
-
--parameter-overridespassato al comando. AWS SAMCLI -
Il
Defaultvalore del parametro nel modello.
Importante
Poiché i SAM* mapping vengono inseriti al momento del pacchetto, è necessario reimballarli ogni volta che si modifica il valore del parametro (ad esempio, quando si aggiunge un nuovo servizio) in modo che i mapping includano le voci per i nuovi valori. Ciò si applica solo quando il parametro guida un ciclo dinamico di artefatti; le altre sostituzioni dei parametri possono essere modificate al momento della distribuzione, come di consueto.
# 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"
Stack nidificati
Fn::ForEachnei modelli di stack annidati () è supportato. AWS::CloudFormation::Stack AWS SAMCLIPassa la Parameters proprietà dello stack principale all'espansione del modello secondario, in modo che le Fn::ForEach raccolte secondarie che fanno riferimento ai parametri forniti dal padre vengano risolte correttamente.
# parent.yaml Resources: ChildStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: ./child.yaml Parameters: ServiceNames: "Users,Orders,Products"
Fn annidato: ForEach
Sono supportati fino a 5 livelli di nidificazione, corrispondenti al limite: CloudFormation
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 in Uscite
Fn::ForEachi blocchi vengono inoltre espansi all'interno della Outputs sezione, quindi puoi emettere un output per valore di raccolta:
Outputs: Fn::ForEach::FunctionArns: - Name - [alpha, beta] - ${Name}FunctionArn: Value: !GetAtt - !Sub "${Name}Function" - Arn
Condizioni e DependsOn
Le risorse emesse da Fn::ForEach possono trasportare Condition e sono DependsOn simili a qualsiasi altra risorsa. La condizione o dipendenza viene replicata su ogni risorsa generata:
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}/
&sintassi {identifier}
La &{identifier} sintassi elimina i caratteri non alfanumerici dal valore sostituito, utile per generare ID logici validi a partire da valori come gli indirizzi IP:
Fn::ForEach::Hosts: - IP - ["10.0.0.1", "10.0.0.2"] - Host&{IP}: Type: AWS::EC2::Instance # Expands to Host10001, Host10002
Funzioni intrinseche supportate
Le seguenti funzioni intrinseche vengono risolte localmente durante l'espansione:
| Funzione | Description |
|---|---|
|
Espansione del ciclo. |
|
Restituisce il conteggio degli elementi della lista. |
|
Converte un valore in una JSON stringa. |
|
Ricerca sulla mappa, inclusa quella opzionale. |
|
Selezione condizionale del valore. |
|
Sostituzione di stringhe. |
|
Concatenazione di stringhe. |
|
Divisione di stringhe. |
|
Selezione degli elementi dell'elenco. |
|
Codifica Base64. |
|
Valutazione delle condizioni. |
|
Riferimenti a parametri e pseudoparametri. |
Le funzioni che richiedono risorse distribuite (Fn::GetAtt,Fn::ImportValue,Fn::GetAZs) vengono conservate per essere risolte CloudFormation al momento della distribuzione.
Errori di convalida
I seguenti problemi relativi ai modelli vengono rilevati localmente prima dell'esecuzione della AWS SAM trasformazione:
| Causa | Messaggio di errore |
|---|---|
Il |
|
|
|
La raccolta si risolve in un elenco vuoto (ad esempio, un |
Nessun errore: il ciclo viene saltato silenziosamente e non viene emessa alcuna risorsa. |
|
Nessun errore: il riferimento non risolto viene mantenuto nel modello. Al momento della distribuzione, lo CloudFormation risolverà sul lato server. |
Limitazioni
-
Le raccolte devono essere risolvibili in qualsiasi momento. build/package
Fn::ForEachle raccolte che utilizzanoFn::GetAttriferimenti dinamici o SSM/Secrets Manager non possono essere espanse localmente.Fn::ImportValueUtilizzate--parameter-overridesinvece un parametro con. -
Le mappature dinamiche degli artefatti vengono corrette al momento del pacchetto. Quando una
Fn::ForEachraccolta è un riferimento a un parametro e il corpo del ciclo utilizza una proprietà di artefatto dinamica (ad esempio,CodeUri: ./services/${Name}), iSAM*mapping generati contengono solo voci per i valori dei parametri che sono stati risolti al momento del pacchetto. Se si modifica--parameter-overridestale parametro al momento della distribuzione senza riconfezionare i nuovi valori, non verranno inserite le voci Mapping e la distribuzione avrà esito negativo. Questo non si applica ai parametri che non vengono utilizzati per guidare un artefatto dinamico.Fn::ForEach -
DeletionPolicyeUpdateReplacePolicyvengono convalidati e risolti durante l'espansione. Supportano soloRefi parametri ma non altre funzioni intrinseche. -
Limite di nidificazione. È
Fn::ForEachpossibile annidare fino a 5 livelli, corrispondenti al limite sul CloudFormation lato server. -
Nomi di mappatura riservati. I nomi di mappatura che iniziano con uno dei seguenti prefissi sono riservati a AWS SAMCLI: non creare mappature personalizzate con questi prefissi:
-
SAMCodeUri,,SAMImageUri,,SAMContentUri,,SAMDefinitionUri,,SAMSchemaUriSAMBodyS3LocationSAMDefinitionS3LocationSAMTemplateURL,SAMContent— emesso da per leSAMCodeproprietà dinamiche degli artefatti.sam packageVedi la tabella. Proprietà dinamiche degli artefatti -
SAMLayers— emesso dasam buildquando una funzioneFn::ForEachgenerata raccoglie riferimenti al livello di dipendenza generati automaticamente (livelli Lambda che si accumulano in uno stack annidato). AWS SAMCLI Questo prefisso non ha alcuna proprietà creata dall'utente corrispondente; viene aggiunto automaticamente.
-
Telemetria
AWS SAMCLIEmette un evento di CFNLanguageExtensions telemetria quando viene richiamato un comando con --language-extensions (o il suo equivalente in una variabile di ambiente) e il modello dichiara la trasformazione. AWS::LanguageExtensions L'evento si attiva una volta per chiamata e non viene trasmesso alcun contenuto del modello. Quando l'elaborazione locale è disattivata (impostazione predefinita), non viene generato alcun evento.