CloudFormation使用!Sub生成ImageBuilder组件名称触发格式错误求助
问题描述
在AWS CloudFormation中,尝试通过!Sub函数将参数MyComponentVersion拼接到AWS::ImageBuilder::Component的Name属性时,收到以下错误:
Resource handler returned message: "The value supplied for parameter 'name' is not valid. name must match pattern ^[-_A-Za-z-0-9][-_A-Za-z0-9 ]{1,126}[-_A-Za-z-0-9]$ (Service: Imagebuilder, Status Code: 400, Request ID: 249299d3-91b5-43f7-b9ed-1bf01e543821)" (RequestToken: ce08ef58-8fb7-8156-fa7c-c607e318e42a, HandlerErrorCode: InvalidRequest)
使用固定文本(如Name: 'SomeText')时可正常创建资源,但拼接${MyComponentVersion}无论是否保留连字符都失败,而Data字段中拼接该参数却无问题。
用户的CloudFormation模板代码如下:
Parameters: MyComponentVersion: Type: String Default: '2.0.0' Description: Installs component Resources: MyComponent: Type: AWS::ImageBuilder::Component Properties: Name: !Sub 'MyComponent-v${MyComponentVersion}' Data: !Sub | name: MyComponent-${MyComponentVersion}
已尝试的操作:
- 将
Name的!Sub表达式替换为仅${MyComponentVersion} - 使用固定文本测试,确认可正常运行
原因分析
错误信息中的正则表达式^[-_A-Za-z-0-9][-_A-Za-z0-9 ]{1,126}[-_A-Za-z-0-9]$明确了AWS::ImageBuilder::Component的Name属性允许的字符:大小写字母、数字、连字符(-)、下划线(_)、空格,点(.)不在允许范围内。
用户的MyComponentVersion参数默认值为2.0.0,包含非法的点字符,导致拼接后的名称不符合校验规则。而Data字段中的name是Component定义内部的名称,ImageBuilder对该字段的校验规则与资源级别的Name属性不同,因此可以包含点字符。
解决方案
方案1:替换版本号中的点字符
在!Sub函数中使用字符串替换语法,将版本号里的点替换为允许的连字符或下划线:
Name: !Sub 'MyComponent-v${MyComponentVersion//./-}'
当参数值为2.0.0时,会生成符合规则的名称MyComponent-v2-0-0。
方案2:约束参数输入格式
给MyComponentVersion参数添加AllowedPattern约束,确保输入的版本号仅包含允许的字符:
Parameters: MyComponentVersion: Type: String Default: '2-0-0' AllowedPattern: "^[-_A-Za-z0-9]+$" Description: Installs component,版本号只能包含大小写字母、数字、连字符、下划线
这样可以从源头避免输入非法字符,直接拼接即可:
Name: !Sub 'MyComponent-v${MyComponentVersion}'
方案3:调整版本号格式
直接将版本号的点替换为允许的字符,比如把默认值改为2_0_0或2-0-0,无需额外处理即可正常拼接。
内容的提问来源于stack exchange,提问作者user8295506

