Come posso risolvere le dipendenze circolari con i modelli AWS Serverless Application Model (SAM) in CloudFormation?
Se distribuisco un modello AWS Serverless Application Model (SAM) in AWS CloudFormation, ricevo un errore simile al seguente: "Circular dependency between resources: [Function, Bucket, FunctionRole, FunctionUploadPermission]."
Breve descrizione
Ricevi un errore in CloudFormation se utilizzi il seguente modello AWS SAM di esempio:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Circular Dependency Resources: Bucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub "{AWS::StackName}-${AWS::Region}-${AWS::AccountId}" Function: Type: AWS::Serverless::Function Properties: CodeUri: s3://mybucket/function.zip Runtime: nodejs12.x Handler: index.handler Policies: - Version: 2012-10-17 Statement: - Effect: Allow Action: s3:GetObject* Resource: !Sub "arn:aws:s3:::${Bucket}*" Events: Upload: Properties: Bucket: Ref: Bucket Events: s3:ObjectCreated:* Type: S3
Il modello genera un errore perché crea la seguente dipendenza circolare:
- La risorsa Bucket dipende da FunctionUploadPermission.
- La funzione FunctionUploadPermission dipende dalla Funzione.
- La **funzione ** dipende da FunctionRole.
- FunctionRole dipende dalla risorsa Bucket, che crea un ciclo.
Nota: Nel messaggio di errore, la risorsa FunctionUploadPermission è di tipo AWS::Lambda::Permission. Questa risorsa viene generata automaticamente da AWS SAM quando viene specificata la proprietà Events per AWS::Serverless::Function. La risorsa FunctionRole è di tipo AWS::IAM::Role. Questa risorsa viene generata automaticamente da AWS SAM quando la proprietà Role per AWS::Serverless::Function non è specificata.
Per risolvere la dipendenza circolare, è necessario interrompere il ciclo sostituendo il riferimento dinamico alla risorsa bucket.
Soluzione
Sostituisci il modello CloudFormation che ha una dipendenza circolare con il seguente modello:
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Circular Dependency Resources: Bucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub "${AWS::StackName}-${AWS::Region}-${AWS::AccountId}" Function: Type: AWS::Serverless::Function Properties: CodeUri: s3://mybucket/function.zip Runtime: nodejs12.x Handler: index.handler Policies: - Version: 2012-10-17 Statement: - Effect: Allow Action: s3:GetObject* Resource: !Sub "arn:aws:s3:::${AWS::StackName}-${AWS::Region}-${AWS::AccountId}*" Events: Upload: Properties: Bucket: Ref: Bucket Events: s3:ObjectCreated:* Type: S3
Nel modello, il nome del bucket nella sezione Risorse della dichiarazione di policy utilizza gli stessi pseudo parametri utilizzati nella proprietà BucketName della risorsa bucket. Ora puoi passare il nome del bucket senza fare direttamente riferimento a quel bucket. Di conseguenza, l'errore viene risolto perché il ciclo di dipendenza circolare è interrotto. Ovvero, il ciclo di dipendenza circolare che risulta da FunctionRole in base alla risorsa ** Bucket**.
Nota: Sostituisci s3://mybucket/function.zip con la posizione del tuo file.
Informazioni correlate

Contenuto pertinente
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata 4 anni fa
- AWS UFFICIALEAggiornata 3 mesi fa