如何解决CloudFormation中[s3bucketvideo, S3InvokeLambdaPermission]资源循环依赖问题
CloudFormation循环依赖报错解决方案
错误根因
你当前的模板存在双向依赖逻辑:
- S3存储桶资源
s3bucketvideo显式配置了DependsOn: S3InvokeLambdaPermission,要求Lambda调用权限必须先创建完成才能初始化存储桶 - Lambda权限资源
S3InvokeLambdaPermission的SourceArn参数使用!GetAtt s3bucketvideo.Arn动态获取存储桶ARN,要求存储桶必须先创建完成才能生成ARN值
两者互相等待对方初始化完成,直接触发循环依赖报错。
修复方案
因为你已经在模板中写死了S3存储桶的名称为s3bucketvideo,可以直接通过字符串拼接生成固定的存储桶ARN,不需要动态读取创建后的桶ARN,即可打破循环依赖。
你需要修改S3InvokeLambdaPermission资源的SourceArn配置,同时保留S3桶的DependsOn配置(避免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 # 改为字符串拼接生成ARN,打破循环依赖 SourceArn: !Sub arn:aws:s3:::s3bucketvideo 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: !GetAtt cflambdarole.Arn Runtime: python3.9 Handler: script.hprint Code: S3Bucket: s3-neuralopsdev S3Key: script.zip
注意事项
- 如果后续需要修改存储桶名称,请同步修改
SourceArn的!Sub语句中的桶名字段,保证ARN和实际桶名匹配 - 如果部署区域为AWS中国区,请将
!Sub语句中的aws替换为aws-cn - 不要删除S3桶的
DependsOn配置,否则会出现存储桶先创建完成、添加通知配置时Lambda权限还未就绪的报错
内容的提问来源于stack exchange,提问作者Sachin Davra
相关产品推荐
相关产品推荐

