如何解决资源之间的循环依赖:[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]的主要内容,如果未能解决你的问题,请参考以下文章