CloudFormation中使用!Sub生成多个ARN数组作为Lambda策略Resource时出现MalformedPolicyDocument错误
CloudFormation中使用!Sub生成多个ARN数组作为Lambda策略Resource时出现MalformedPolicyDocument错误
嘿,我帮你排查到问题啦,你的CloudFormation模板里Lambda策略的格式有两处错误,才触发了这个MalformedPolicyDocument报错:
问题分析
- 自定义策略的结构缩进错误:你把
Version和Statement直接放在了AWSLambdaBasicExecutionRole的下方,这会让CloudFormation无法识别这是一个完整的自定义IAM策略,正确的做法是把自定义策略作为Policies列表里的一个独立项。 - Resource数组的写法不规范:你现在的两个
!Sub没有明确作为数组元素来定义,CloudFormation无法正确解析成多个ARN的数组。
修正后的模板代码
Type: AWS::Serverless::Function Properties: FunctionName: !Join - "-" - - !Ref NamePrefix - !FindInMap [ NameMap, SEND-SES-EMAIL-FUNCTION, NAME ] - !Ref NamePostfix Description: "Lambda function to send email with CSV file through SES" CodeUri: source/resources/sendSESEmailFunction Handler: sendSESEmail.lambda_handler Policies: - AWSLambdaBasicExecutionRole - Version: 2012-10-17 Statement: - Sid: SESPermissions Effect: Allow Action: - 'ses:SendEmail' Resource: - !Sub - 'arn:aws:ses:${AWS::Region}:${SESAccountID}:identity/${SenderEmail}' - SenderEmail: !Ref SenderSESEmail SESAccountID: !Ref SESAccountID - !Sub - 'arn:aws:ses:${AWS::Region}:${SESAccountID}:identity/${ReceiverEmail}' - ReceiverEmail: 'testing' SESAccountID: !Ref SESAccountID
关键修正点说明
- 把自定义IAM策略用
-开头,和AWSLambdaBasicExecutionRole并列,确保Policies列表的结构正确。 - 在
Resource字段下,每个!Sub都用-开头,明确这是数组中的一个元素,这样CloudFormation就能正确生成两个ARN作为策略的资源目标了。
备注:内容来源于stack exchange,提问作者Martin Golis
相关产品推荐
相关产品推荐

