如何移除AWS CloudFormation中S3端点末尾的点?
问题
使用YAML编写Route53故障转移策略时,S3存储桶端点地址末尾带有点(例如:slh-route53-ml.s3-website-us-east-1.amazonaws.com.),导致域名路由失效。尝试用replace(".com.", ".com")方法未成功,求移除端点末尾点的方法。
以下是CloudFormation配置代码:
MyPrimaryRecord: Type: AWS::Route53::RecordSet Properties: HostedZoneId: 2222222222222222 Name: deneme.slhttnunlu.net Type: A Failover: PRIMARY TTL: '60' ResourceRecords: - !GetAtt WebServer.PublicIp SetIdentifier: Primary HealthCheckId: !Ref myHealthCheck MySecondaryRecord: Type: AWS::Route53::RecordSet Properties: HostedZoneId: 2222222222222222 Name: deneme.slhttnunlu.net Type: A Failover: SECONDARY AliasTarget: DNSName: !Select [2, !Split ["/", !GetAtt S3FailBucket.WebsiteURL]] EvaluateTargetHealth: false HostedZoneId: Z3AQBSTGFYJSTF SetIdentifier: Secondary
解决方案
针对S3端点末尾的点,可以用以下几种CloudFormation内置函数组合来移除:
方法1:用!Slice+!Split+!Join处理
利用!Split将端点按点拆分为数组,再用!Slice去掉最后一个空元素(因末尾点导致),最后拼接成无末尾点的地址:
DNSName: !Join [".", !Slice [ !Split [".", !Select [2, !Split ["/", !GetAtt S3FailBucket.WebsiteURL]]], 0, -1]]
方法2:用!Split限制拆分次数取前半部分
通过!Split的最大拆分次数参数,只拆分最后一个点,直接取前半段内容:
DNSName: !Select [0, !Split [".", !Select [2, !Split ["/", !GetAtt S3FailBucket.WebsiteURL]], 1]]
注:这里的1是最大拆分次数,会优先从右侧拆分一次。
方法3:直接构造S3区域域名(更可靠)
如果S3静态网站端点格式固定,也可以直接构造域名而非从WebsiteURL提取,从根源避免末尾点问题:
DNSName: !Sub "${S3FailBucket}.s3-website-us-east-1.amazonaws.com"
这种方式无需处理字符串,直接生成正确的端点地址,出错概率更低。
内容的提问来源于stack exchange,提问作者Selahattin Ünlü
相关产品推荐
相关产品推荐

