как решить циклическую зависимость между ресурсами: [s3bucketvideo, S3InvokeLambdaPermission]

#amazon-web-services #amazon-s3 #aws-lambda #amazon-cloudformation

#amazon-веб-сервисы #amazon-s3 #aws-lambda #amazon-облачная информация

Вопрос:

Заранее спасибо. Я пытаюсь создать сегмент s3 и лямбда-функцию. Цель состоит в том, чтобы выполнить лямбда-функцию, когда мы загружаем что-либо в корзину s3. Я пробовал разные методы, но, похоже, они не работают. Любая помощь приветствуется.

 Resources:
s3bucketvideo:
    Type: AWS::S3::Bucket
    DependsOn: S3InvokeLambdaPermission
    Properties:
        BucketName: s3bucketvideo
        NotificationConfiguration:
            LambdaConfigurations:
              - Event: 's3:ObjectCreated:*'
                Function: !GetAtt VideoToImageLambda.Arn
        
S3InvokeLambdaPermission:
    Type: AWS::Lambda::Permission
    Properties:
        Action: lambda:InvokeFunction
        FunctionName: !Ref VideoToImageLambda
        Principal: s3.amazonaws.com
        SourceArn: !GetAtt s3bucketvideo.Arn
    
cflambdarole:
    Type: AWS::IAM::Role
    Properties: 
        RoleName: cflambdarole
        AssumeRolePolicyDocument:
            Statement:
              - Effect: Allow
                Principal:
                  Service: lambda.amazonaws.com
                Action: sts:AssumeRole
        ManagedPolicyArns:
            - arn:aws:iam::aws:policy/AWSLambda_FullAccess
            - arn:aws:iam::aws:policy/AWSLambdaExecute
            - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

VideoToImageLambda:
    Type: AWS::Lambda::Function
    Properties:
        FunctionName: VideoToImageLambda
        Timeout: 120
        Role:
            Fn::GetAtt:
                - cflambdarole
                - Arn
        Runtime: python3.9
        Handler: script.hprint
        Code:
            S3Bucket: s3-neuralopsdev
            S3Key: script.zip

  
 

Ответ №1:

Одним из быстрых решений является использование SourceAccount вместо SourceArn в разрешении:

 SourceAccount: !Ref 'AWS::AccountId'
 

После создания стека вы также можете добавить SourceArn и выполнить обновление.

Это также обсуждается здесь.

Комментарии:

1. Большое спасибо за ответ. Я использовал SourceAccount , и он создал стек, но без триггера уведомления. Возможно ли это сделать только в create_stack? Я проверил источник, который вы вставили. Это что-то связанное с пользовательским уведомлением.

2. Я считаю, что вам нужен пользовательский ресурс, чтобы сделать это только в create_stack. Я также думаю, что уведомление должно быть создано только с помощью SourceAccount — хотя это было бы слишком открыто.

3. Спасибо за ваш ответ. Уведомление не создается с помощью SourceAccount . В нем говорится, что мне нужно будет написать новую лямбда-функцию для моего пользовательского ресурса. Я не знаю о том, как создать функцию для пользовательского ресурса.

Ответ №2:

Просто обновление. Я создал стек без уведомления о корзине, а затем обновил стек уведомлением о корзине для быстрого решения. Это сделало свое дело.