Go代码配置Route53 A记录指向S3桶遇IPv4错误,求解决方法
问题原因与解决方法
你遇到的错误是因为A记录类型要求值必须是合法IPv4地址,但你填入了HTTP URL格式的S3端点,不符合DNS记录规范。要正确将Route53托管区指向S3静态网站,需要使用Route53的Alias资源记录集,而非普通A记录——Alias允许直接指向AWS服务(如S3),无需手动指定IP,且AWS会自动维护后端IP的变化。
改动要点
- 记录类型保留为
A,但替换原有的ResourceRecords和TTL配置,改用AliasTarget - S3端点需去掉
http://前缀,仅保留域名部分,且末尾必须添加英文句号(.) - 指定对应区域S3静态网站的托管区ID:us-east-1区域的固定ID为
Z3AQBSTGFYJSTF
修改后的完整代码
package main import ( "log" "strconv" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/route53" ) func main () { sess, err := session.NewSession(&aws.Config{ Region: aws.String("us-east-1"), }) if err != nil { log.Fatalf("Failed to create session: %s", err) } // Create a Route53 service client route53Svc := route53.New(sess) // Set the name of the hosted zone hostedZoneName := "foo.example.com" // Set the maximum number of hosted zones to return maxItems := int64(10) // Call the ListHostedZonesByName action result, err := route53Svc.ListHostedZonesByName(&route53.ListHostedZonesByNameInput{ DNSName: aws.String(hostedZoneName + "."), MaxItems: aws.String(strconv.FormatInt(maxItems, 10)), }) if err != nil { log.Fatalf("Error listing hosted zones: %s", err) } // Iterate through the list of hosted zones for _, hz := range result.HostedZones { // Check if the hosted zone name matches the specified name if *hz.Name == hostedZoneName + "." { // Get the hosted zone ID hostedZoneID := aws.StringValue(hz.Id) // S3静态网站端点(去掉http://,末尾加英文句号) s3Endpoint := "foo.example.com.s3-website-us-east-1.amazonaws.com." // us-east-1区域S3静态网站的固定托管区ID s3HostedZoneID := "Z3AQBSTGFYJSTF" // 创建Alias类型的A记录 _, err = route53Svc.ChangeResourceRecordSets(&route53.ChangeResourceRecordSetsInput{ HostedZoneId: aws.String(hostedZoneID), ChangeBatch: &route53.ChangeBatch{ Changes: []*route53.Change{ { Action: aws.String("CREATE"), ResourceRecordSet: &route53.ResourceRecordSet{ Type: aws.String("A"), Name: aws.String(hostedZoneName), // 使用AliasTarget替代ResourceRecords和TTL AliasTarget: &route53.AliasTarget{ DNSName: aws.String(s3Endpoint), HostedZoneId: aws.String(s3HostedZoneID), EvaluateTargetHealth: aws.Bool(false), // S3不支持健康检查,设为false }, }, }, }, }, }) if err != nil { log.Fatalf("%s", err) } log.Println("Alias record created successfully") break } } }
额外说明
- 不同AWS区域的S3静态网站托管区ID不同,如果你使用其他区域,需要替换对应的ID(比如us-west-2是
Z2F56UZL2M1ACD) - Alias记录不需要设置TTL,由Route53自动管理
EvaluateTargetHealth必须设为false,因为S3静态网站不提供健康检查功能
内容的提问来源于stack exchange,提问作者c0nt0s0
相关产品推荐
相关产品推荐

