You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:40:24