Обход круговой зависимости в AWS CloudFormation - PullRequest
0 голосов
/ 03 мая 2018

В следующем AWS CloudFormation выдается круговая ошибка зависимости. Я понимаю, что зависимости текут так: rawUploads -> generatePreview -> previewPipeline -> rawUploads. Хотя не похоже, что rawUploads зависит от generatePreview, я полагаю, что CF необходимо знать, какую лямбду следует запускать при создании сегмента, даже если триггер определен в лямбда-части шаблона CloudFormation.

Я нашел в Интернете некоторые ресурсы, в которых говорится о схожей проблеме, но здесь это не касается. https://aws.amazon.com/premiumsupport/knowledge-center/unable-validate-circular-dependency-cloudformation/

Какие у меня есть варианты разорвать эту круговую цепочку зависимостей? Решения, пригодные для создания сценариев, жизнеспособны, но несколько вариантов развертывания с изменениями вручную не подходят для моего случая использования.

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  rawUploads:
    Type: 'AWS::S3::Bucket'
  previewAudioFiles:
    Type: 'AWS::S3::Bucket'

  generatePreview:
    Type: AWS::Serverless::Function
    Properties:
      Handler: generatePreview.handler
      Runtime: nodejs6.10
      CodeUri: .
      Environment:
        Variables:
          PipelineId: !Ref previewPipeline
      Events:
        BucketrawUploads:
          Type: S3
          Properties:
            Bucket: !Ref rawUploads
            Events: 's3:ObjectCreated:*'

  previewPipeline:
    Type: Custom::ElasticTranscoderPipeline
    Version: '1.0'
    Properties:
      ServiceToken:
        Fn::Join:
        - ":"
        - - arn:aws:lambda
          - Ref: AWS::Region
          - Ref: AWS::AccountId
          - function
          - aws-cloudformation-elastic-transcoder-pipeline-1-0-0
      Name: transcoderPipeline
      InputBucket:
        Ref: rawUploads
      OutputBucket:
        Ref: previewAudioFiles

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Этот пост помог мне в итоге: https://aws.amazon.com/premiumsupport/knowledge-center/unable-validate-destination-s3/

Я закончил настройку темы SNS в CloudFormation. Ведро будет выдвигать события по этой теме, и функция Lambda прослушивает эту тему. Таким образом, график зависимости выглядит следующим образом:

S3 bucket -> SNS topic -> SNS topic policy
Lambda function -> SNS topic
Lambda function -> transcoder pipeline

Что-то вроде этого (некоторые политики опущены)

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  SNSTopic:
    Type: AWS::SNS::Topic
  SNSTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Id: MyTopicPolicy
        Version: '2012-10-17'
        Statement:
        - Sid: Statement-id
          Effect: Allow
          Principal:
            AWS: "*"
          Action: sns:Publish
          Resource:
            Ref: SNSTopic
          Condition:
            ArnLike:
              aws:SourceArn:
                !Join ["-", ['arn:aws:s3:::rawuploads', Ref: 'AWS::StackName']]
      Topics:
      - Ref: SNSTopic

  rawUploads:
    Type: 'AWS::S3::Bucket'
    DependsOn: SNSTopicPolicy
    Properties:
      BucketName: !Join ["-", ['rawuploads', Ref: 'AWS::StackName']]
      NotificationConfiguration:
        TopicConfigurations:
          - Topic:
              Ref: "SNSTopic"
            Event: 's3:ObjectCreated:*'

  previewAudioFiles:
    Type: 'AWS::S3::Bucket'


  generatePreview:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: !Join ["-", ['generatepreview', Ref: 'AWS::StackName']]
      Handler: generatePreview.handler
      Runtime: nodejs6.10
      CodeUri: .
      Environment:
        Variables:
          PipelineId: !Ref previewPipeline
      Events:
        BucketrawUploads:
          Type: SNS
          Properties:
            Topic: !Ref "SNSTopic"

  previewPipeline:
    Type: Custom::ElasticTranscoderPipeline
    DependsOn: 'rawUploads'
    Version: '1.0'
    Properties:
      ServiceToken:
        Fn::Join:
        - ":"
        - - arn:aws:lambda
          - Ref: AWS::Region
          - Ref: AWS::AccountId
          - function
          - aws-cloudformation-elastic-transcoder-pipeline-1-0-0
      Name: transcoderPipeline
      InputBucket:
        !Join ["-", ['arn:aws:s3:::rawuploads', Ref: 'AWS::StackName']]
      OutputBucket:
        Ref: previewAudioFiles
0 голосов
/ 03 мая 2018

Один из способов - присвоить блокам S3 явные имена, чтобы позже вместо использования Ref: bucketname вы могли просто использовать имя бочки. Это очевидно проблематично, если вам нужны автоматически сгенерированные имена сегментов, и в этих случаях целесообразно генерировать имя сегмента из некоторого префикса плюс (уникальное) имя стека, например:

InputBucket: !Join ["-", ['rawuploads', Ref: 'AWS::StackName']]

Другой вариант - использовать один шаблон CloudFormation, но в 2 этапа - на 1-м этапе создаются базовые ресурсы (и любые ссылки не круглые), а затем вы добавляете оставшиеся ссылки в шаблон и выполняете обновление стека. Очевидно, что это не идеал, поэтому я бы предпочел первый подход.

Вы также можете использовать первый метод в тех случаях, когда вам нужна ссылка на ARN, например:

!Join ['/', ['arn:aws:s3:::logsbucket', 'AWSLogs', Ref: 'AWS:AccountId', '*']]

При использовании этого метода вы можете также рассмотреть возможность использования DependsOn , поскольку вы удалили неявную зависимость, которая иногда может вызывать проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...