如何解决资源之间的循环依赖:[s3bucketvideo, S3InvokeLambdaPermission]

Posted

技术标签:

【中文标题】如何解决资源之间的循环依赖:[s3bucketvideo, S3InvokeLambdaPermission]【英文标题】:how to solve Circular dependency between resources: [s3bucketvideo, S3InvokeLambdaPermission] 【发布时间】:2022-01-08 22:08:05 【问题描述】:

提前致谢。 我正在尝试创建 s3 存储桶和 lambda 函数。目标是在我们将任何内容上传到 s3 存储桶时执行 lambda 函数。我尝试了不同的方法,但似乎不起作用。任何帮助表示赞赏。

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 并进行更新。

这也讨论了here。

【讨论】:

非常感谢您的回答。我使用 SourceAccount 并创建了堆栈但没有通知触发器。是否可以仅在 create_stack 中进行?我检查了您粘贴的来源。它与自定义通知有关。 我相信您需要一个自定义资源才能仅在 create_stack 中执行此操作。我还认为应该只使用 SourceAccount 创建通知 - 但它太开放了。 感谢您的回复。未使用 SourceAccount 创建通知。它说我需要为我的自定义资源编写一个新的 lambda 函数。我不知道如何为自定义资源创建函数。【参考方案2】:

只是一个更新。 我创建了没有存储桶通知的堆栈,然后使用存储桶通知更新了堆栈以获得快速解决方案。 它成功了。

【讨论】:

以上是关于如何解决资源之间的循环依赖:[s3bucketvideo, S3InvokeLambdaPermission]的主要内容,如果未能解决你的问题,请参考以下文章

出现错误:资源之间的循环依赖

资源之间的循环依赖:CognitoUserPool和环境

面试题:如何解决Spring 的循环依赖问题

Java面试小短文Spring 如何解决循环依赖?

Java面试小短文Spring 如何解决循环依赖?

Java面试小短文Spring 如何解决循环依赖?