AWS SAM配置S3触发Lambda出现资源循环依赖问题如何解决
循环依赖根因
当你在AWS::Serverless::Function的Events字段绑定S3 Bucket触发器,同时使用SAM预定义的S3ReadPolicy策略时,会形成闭环依赖:
- S3 Bucket配置事件通知需要先完成Lambda调用权限的创建
- Lambda调用权限需要绑定已创建完成的Lambda函数
- SAM预定义的
S3ReadPolicy会隐式依赖S3 Bucket的创建结果完成策略校验,最终形成循环
解决方案1:替换SAM预定义S3策略为手动编写的IAM策略
该方案无需调整原有事件配置逻辑,仅修改权限定义即可解决问题。由于你的Bucket名称是通过伪参数拼接生成的,无需等待Bucket创建即可解析,手动编写策略不会产生隐式依赖。
- 删除你手动新增的
AllowS3ToCallLambdaPermission资源,SAM会自动生成对应调用权限,重复配置会加重依赖问题 - 将Lambda的
S3ReadPolicy预定义策略替换为手动编写的IAM策略,修改后的Lambda配置如下:
ProcessBlobFunction: Type: AWS::Serverless::Function Properties: CodeUri: blobsprjct/ Handler: processBlob.lambda_handler Runtime: python3.8 Policies: - Version: '2012-10-17' Statement: - Effect: Allow Action: s3:GetObject Resource: !Sub 'arn:aws:s3:::blobs-${AWS::AccountId}-${AWS::Region}/*' - AmazonRekognitionFullAccess Events: BlobsBucket: Type: S3 Properties: Bucket: !Ref BlobsBucket Events: s3:ObjectCreated:*
解决方案2:将事件配置迁移到S3 Bucket侧
该方案调整了依赖顺序,彻底避免循环依赖问题,适合需要更灵活控制通知规则的场景。
- 删除Lambda下的
Events配置块,不再通过SAM自动生成事件规则 - 调整资源顺序,给S3 Bucket加上
DependsOn明确依赖权限资源,修改后的完整资源配置如下:
Resources: ProcessBlobFunction: Type: AWS::Serverless::Function Properties: CodeUri: blobsprjct/ Handler: processBlob.lambda_handler Runtime: python3.8 Policies: - Version: '2012-10-17' Statement: - Effect: Allow Action: s3:GetObject Resource: !Sub 'arn:aws:s3:::blobs-${AWS::AccountId}-${AWS::Region}/*' - AmazonRekognitionFullAccess AllowS3ToCallLambdaPermission: Type: AWS::Lambda::Permission Properties: Action: 'lambda:InvokeFunction' FunctionName: !Ref ProcessBlobFunction Principal: s3.amazonaws.com SourceArn: !Sub 'arn:aws:s3:::blobs-${AWS::AccountId}-${AWS::Region}' BlobsBucket: Type: AWS::S3::Bucket DependsOn: AllowS3ToCallLambdaPermission Properties: BucketName: !Sub "blobs-${AWS::AccountId}-${AWS::Region}" NotificationConfiguration: LambdaConfigurations: - Event: s3:ObjectCreated:* Function: !GetAtt ProcessBlobFunction.Arn
注意事项
- 两种方案中所有引用Bucket名称/ARN的位置,均使用
!Sub通过伪参数直接拼接,不要使用!Ref BlobsBucket或!GetAtt BlobsBucket.Arn获取属性,避免产生隐式依赖 - 不要同时在Lambda的Events块和S3 Bucket的NotificationConfiguration中配置同一条事件规则,会导致重复触发或部署报错
内容的提问来源于stack exchange,提问作者Koka Kertsman
相关产品推荐
相关产品推荐

