如何在serverless.yml中配置授权允许CloudWatch调用Lambda函数
在serverless.yml中配置CloudWatch授权触发Lambda的方案
现有配置报错的原因
- 函数资源引用不匹配:代码中
Fn::GetAtt引用的cleanLambdaFunction是不存在的资源,Serverless Framework为generateFile函数自动生成的CloudFormation逻辑ID为GenerateFileLambda,引用错误会直接导致部署失败 - 缺失必填字段
Sid:该字段对应CLI命令中的--statement-id,是Lambda权限策略的唯一标识,未配置会触发校验错误 SourceArn配置为通配符*:权限范围过大不符合AWS安全要求,部分场景下会被拦截,需填写对应CloudWatch Events规则的实际ARN
正确配置方案
分两种常见场景适配:
场景1:使用Serverless内置定时触发能力(推荐)
如果是需要让Lambda按定时规则执行,直接在函数定义下添加events配置即可,Serverless会自动生成CloudWatch Events规则和对应的Lambda调用权限,无需手动编写权限资源:
functions: generateFile: handler: api/handler.generateFile tags: LiveOrTest: test events: - schedule: rate: cron(0 1 * * ? *) # 按需修改定时规则 enabled: true
场景2:授权外部已有CloudWatch规则触发Lambda
如果是要授权已存在的CloudWatch Events规则调用当前Lambda,手动修正后的权限资源配置如下:
functions: generateFile: handler: api/handler.generateFile tags: LiveOrTest: test resources: Resources: GenerateFileCloudWatchInvokePermission: Type: AWS::Lambda::Permission Properties: FunctionName: !Ref GenerateFileLambda # 替换为唯一的权限标识,对应CLI的--statement-id Sid: AllowCloudWatchEventsInvokeGenerateFile Action: lambda:InvokeFunction Principal: events.amazonaws.com # 替换为实际的CloudWatch Events规则ARN,对应CLI的--source-arn SourceArn: arn:aws:events:us-east-1:1232132323:rule/XXXX
补充说明
如果需要授权同一账号下所有自定义CloudWatch规则调用该Lambda,可将SourceArn替换为通配符格式arn:aws:events:${aws:region}:${aws:accountId}:rule/*,权限范围比全通配符*更安全。
内容的提问来源于stack exchange,提问作者Rilcon42
相关产品推荐
相关产品推荐

