Come posso risolvere le dipendenze circolari con i modelli AWS Serverless Application Model (SAM) in CloudFormation?

3 minuti di lettura
0

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:

  1. La risorsa Bucket dipende da FunctionUploadPermission.
  2. La funzione FunctionUploadPermission dipende dalla Funzione.
  3. La **funzione ** dipende da FunctionRole.
  4. 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

Fn::Sub (funzione intrinseca)

Ref (funzione intrinseca)

AWS::Serverless::Function

AWS::S3::Bucket

AWS UFFICIALE
AWS UFFICIALEAggiornata 3 anni fa