CloudFormation模板条件未生效?如何仅修改邮箱参数后部署
问题解决方法
你的核心问题是只定义了SubscriptionProvided条件,但没有在对应的SNS订阅资源中使用这个条件,导致无论参数值是什么,订阅资源都会被创建,进而触发邮箱格式校验失败。下面是两种可行的解决思路:
思路一:条件控制订阅资源的创建
修改模板,给SNS订阅资源添加Condition属性,仅当SubscriptionEmail不等于"na"时才创建该资源:
{ "Parameters": { "SNSTopicName": { "Type": "String", "Default": "MyTopic" }, "SubscriptionEmail": { "Type": "String", "Default": "na" } }, "Conditions": { "SubscriptionProvided": { "Fn::Not": [ { "Fn::Equals": [ {"Ref": "SubscriptionEmail"}, "na" ] } ] } }, "Resources": { "TargetSNSTopic": { "Type": "AWS::SNS::Topic", "Properties": { "TopicName": {"Ref": "SNSTopicName"} } }, "EmailSubscription": { "Type": "AWS::SNS::Subscription", "Condition": "SubscriptionProvided", "Properties": { "Endpoint": {"Ref": "SubscriptionEmail"}, "Protocol": "email", "TopicArn": {"Ref": "TargetSNSTopic"} } } } }
当SubscriptionEmail保持默认值"na"时,订阅资源不会被创建,自然不会出现邮箱格式错误。
思路二:提前验证参数格式(阻止无效部署)
如果希望用户必须输入有效邮箱才能启动部署,可以给SubscriptionEmail参数添加正则校验,在参数阶段就拦截无效输入:
{ "Parameters": { "SNSTopicName": { "Type": "String", "Default": "MyTopic" }, "SubscriptionEmail": { "Type": "String", "Default": "na", "AllowedPattern": "^na$|^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", "ConstraintDescription": "请输入有效的邮箱地址,或保留默认值'na'(不创建订阅)。" } }, "Conditions": { "SubscriptionProvided": { "Fn::Not": [ { "Fn::Equals": [ {"Ref": "SubscriptionEmail"}, "na" ] } ] } }, "Resources": { "TargetSNSTopic": { "Type": "AWS::SNS::Topic", "Properties": { "TopicName": {"Ref": "SNSTopicName"} } }, "EmailSubscription": { "Type": "AWS::SNS::Subscription", "Condition": "SubscriptionProvided", "Properties": { "Endpoint": {"Ref": "SubscriptionEmail"}, "Protocol": "email", "TopicArn": {"Ref": "TargetSNSTopic"} } } } }
如果用户输入既不是"na"也不是有效邮箱的内容,部署会在参数验证阶段直接失败,不会进入资源创建环节。
要是你想强制用户必须输入有效邮箱才能部署,可以去掉默认值的允许,修改参数配置:
{ "Parameters": { "SNSTopicName": { "Type": "String", "Default": "MyTopic" }, "SubscriptionEmail": { "Type": "String", "AllowedPattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", "ConstraintDescription": "请输入有效的邮箱地址。", "MinLength": 1 } }, "Resources": { "TargetSNSTopic": { "Type": "AWS::SNS::Topic", "Properties": { "TopicName": {"Ref": "SNSTopicName"} } }, "EmailSubscription": { "Type": "AWS::SNS::Subscription", "Properties": { "Endpoint": {"Ref": "SubscriptionEmail"}, "Protocol": "email", "TopicArn": {"Ref": "TargetSNSTopic"} } } } }
这样用户必须提供有效邮箱才能启动部署,彻底避免无效部署的情况。
内容的提问来源于stack exchange,提问作者Agenobarb
相关产品推荐
相关产品推荐

